STM32F4X UCOSIII任务消息队列
STM32F4X UCOSIII任务消息队列
- 任务消息队列和内核消息队列对比
- 内核消息队列
- 内核消息队列
- UCOSIII任务消息队列API
- 任务消息队列发送函数
- 任务消息队列接收函数
- UCOSIII任务消息队列例程
之前的章节中讲解过消息队列这个机制,UCOSIII除了有内核消息队列之外,还有任务消息队列。在UCOSIII中,每个任务内部都会有一个内嵌消息队列。在大多数情况下,任务消息队列可以代替内核消息队列。
任务消息队列和内核消息队列对比
内容 | 内核消息队列 | 任务消息队列 |
---|---|---|
是否需要创建 | 是 | 否 |
是否需要指定任务 | 否 | 是 |
是否可以广播 | 是 | 否 |
内核消息队列
内核消息队列在使用前需要用户创建消息队列,内核消息队列不需要指定接收消息队列的任务,并且可以以广播的方式给所有等待消息队列的任务获取消息。
内核消息队列
任务消息队列不需要用户创建,任务消息队列在创建任务的时候就已经内嵌到任务控制块里面。任务消息队列使用的时候需要指定接收任务消息队列的任务,而且一次只能指定一个任务,不能广播。
UCOSIII任务消息队列API
任务消息队列发送函数
/** p_tcb:指向需要发送信号量的任务,NULL则代表自己* p_void:需要发送的消息指针* msg_size:需要发送的消息长度* opt:用户选项* p_err:错误代码
*/
void OSTaskQPost (OS_TCB *p_tcb,void *p_void,OS_MSG_SIZE msg_size,OS_OPT opt,OS_ERR *p_err)
opt可以选择OS_OPT_POST_FIFO和OS_OPT_POST_LIFO
- OS_OPT_POST_FIFO:消息以先进先出的模式存放
- OS_OPT_POST_LIFO:消息以后进先出的模式存放
任务消息队列接收函数
/** timeout:超时时间* opt:用户选项* p_msg_size:接收到的消息长度* p_ts:时间戳* p_err:错误代码
返回值:返回接收到消息指针,如果为NULL则接收错误
*/
void *OSTaskQPend (OS_TICK timeout,OS_OPT opt,OS_MSG_SIZE *p_msg_size,CPU_TS *p_ts,OS_ERR *p_err)
opt可以选择OS_OPT_PEND_BLOCKING和OS_OPT_PEND_NON_BLOCKING
- OS_OPT_PEND_BLOCKING:阻塞等待任务消息队列,除非有任务消息队列,否则任务不会恢复
- OS_OPT_PEND_NON_BLOCKING:不阻塞等待任务消息队列,如果任务等待时间超过设定的超时时间,任务会恢复并返回一个错误代码
UCOSIII任务消息队列例程
例程中任务1会每隔1秒向任务2发送任务消息,任务2则阻塞等待消息
/*
*********************************************************************************************************
* EXAMPLE CODE
*
* (c) Copyright 2013; Micrium, Inc.; Weston, FL
*
* All rights reserved. Protected by international copyright laws.
* Knowledge of the source code may not be used to write a similar
* product. This file may only be used in accordance with a license
* and should not be redistributed in any way.
*********************************************************************************************************
*//*
*********************************************************************************************************
*
* EXAMPLE CODE
*
* IAR Development Kits
* on the
*
* STM32F429II-SK KICKSTART KIT
*
* Filename : app.c
* Version : V1.00
* Programmer(s) : YS
*********************************************************************************************************
*//*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/#include <includes.h>/*
*********************************************************************************************************
* LOCAL DEFINES
*********************************************************************************************************
*//*
*********************************************************************************************************
* LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*//* ----------------- APPLICATION GLOBALS -------------- */
static OS_TCB AppTaskStartTCB;
static CPU_STK AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE];#define APPTASK1NAME "App Task1"
#define APP_TASK1_PRIO 3
#define APP_TASK1_STK_SIZE 1024
static OS_TCB AppTask1TCB;
static void AppTask1 (void *p_arg);
static CPU_STK AppTask1Stk[APP_TASK1_STK_SIZE];#define APPTASK2NAME "App Task2"
#define APP_TASK2_PRIO 4
#define APP_TASK2_STK_SIZE 1024
static OS_TCB AppTask2TCB;
static void AppTask2 (void *p_arg);
static CPU_STK AppTask2Stk[APP_TASK2_STK_SIZE];
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/static void AppTaskStart (void *p_arg);
struct msg
{char msg_string[50];int value;
};/*
*********************************************************************************************************
* main()
*
* Description : This is the standard entry point for C code. It is assumed that your code will call
* main() once you have performed all necessary initialization.
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/int main(void)
{OS_ERR err;OSInit(&err); /* Init uC/OS-III. */OSTaskCreate((OS_TCB *)&AppTaskStartTCB, /* Create the start task */(CPU_CHAR *)"App Task Start",(OS_TASK_PTR )AppTaskStart,(void *)0u,(OS_PRIO )APP_CFG_TASK_START_PRIO,(CPU_STK *)&AppTaskStartStk[0u],(CPU_STK_SIZE )AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE / 10u],(CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE,(OS_MSG_QTY )0u,(OS_TICK )0u,(void *)0u,(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR *)&err);OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */}/*
*********************************************************************************************************
* STARTUP TASK
*
* Description : This is an example of a startup task. As mentioned in the book's text, you MUST
* initialize the ticker only once multitasking has started.
*
* Arguments : p_arg is the argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
*
* Returns : none
*
* Notes : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
* used. The compiler should not generate any code for this statement.
*********************************************************************************************************
*/static void AppTaskStart (void *p_arg)
{CPU_INT32U cpu_clk_freq;CPU_INT32U cnts;OS_ERR err;(void)p_arg;BSP_Init(); CPU_Init(); /* Initialize the uC/CPU services */cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */cnts = cpu_clk_freq /* Determine nbr SysTick increments *// (CPU_INT32U)OSCfg_TickRate_Hz;OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */Mem_Init(); /* Initialize memory managment module */Math_Init(); /* Initialize mathematical module */#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */
#endif#ifdef CPU_CFG_INT_DIS_MEAS_ENCPU_IntDisMeasMaxCurReset();
#endif#if (APP_CFG_SERIAL_EN == DEF_ENABLED)App_SerialInit(); /* Initialize Serial communication for application ... */
#endifOSTaskCreate((OS_TCB *)&AppTask1TCB, // 线程TCB (CPU_CHAR *)APPTASK1NAME, // 线程名字(OS_TASK_PTR ) AppTask1, // 线程入口函数(void *) "TASK1", // 线程参数(OS_PRIO ) APP_TASK1_PRIO, // 线程优先级(CPU_STK *)&AppTask1Stk[0], // 线程栈起始地址(CPU_STK_SIZE) APP_TASK1_STK_SIZE / 10, // 栈深度的限制位置(CPU_STK_SIZE) APP_TASK1_STK_SIZE, // 栈大小(OS_MSG_QTY ) 5u, // 最大的消息个数(OS_TICK ) 0u, // 时间片(void *) 0, // 向用户提供的内存位置的指针(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), // 线程特定选项(OS_ERR *)&err); // 错误标志if(OS_ERR_NONE == err)printf("%s Create Success\r\n",APPTASK1NAME);elseprintf("%s Create Error\r\n",APPTASK1NAME);OSTaskCreate((OS_TCB *)&AppTask2TCB, // 线程TCB (CPU_CHAR *)APPTASK2NAME, // 线程名字(OS_TASK_PTR ) AppTask2, // 线程入口函数(void *) "TASK2", // 线程参数(OS_PRIO ) APP_TASK2_PRIO, // 线程优先级(CPU_STK *)&AppTask2Stk[0], // 线程栈起始地址(CPU_STK_SIZE) APP_TASK2_STK_SIZE / 10, // 栈深度的限制位置(CPU_STK_SIZE) APP_TASK2_STK_SIZE, // 栈大小(OS_MSG_QTY ) 5u, // 最大的消息个数(OS_TICK ) 0u, // 时间片(void *) 0, // 向用户提供的内存位置的指针(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), // 线程特定选项(OS_ERR *)&err); // 错误标志if(OS_ERR_NONE == err)printf("%s Create Success\r\n",APPTASK2NAME);elseprintf("%s Create Error\r\n",APPTASK2NAME);OSTaskDel ( & AppTaskStartTCB, & err ); }static void AppTask1 (void *p_arg)
{OS_ERR err;static struct msg msg_send = {0};while(DEF_TRUE){OSTimeDly ( 1000, OS_OPT_TIME_DLY, & err ); // 1s运行一次Str_Copy_N(msg_send.msg_string,"hello this is a msg1",sizeof(msg_send.msg_string)); // 填充消息OSTaskQPost(&AppTask2TCB,&msg_send,sizeof(struct msg),OS_OPT_POST_FIFO,&err); // 向TASK2发送任务消息msg_send.value++;if(err == OS_ERR_NONE)printf("Task1 Msg Post Success\r\n");elseprintf("Task1 Msg Post Error\r\n");}}
static void AppTask2 (void *p_arg)
{OS_ERR err;struct msg *pmsg;OS_MSG_SIZE msg_size;while(DEF_TRUE){pmsg = OSTaskQPend(0,OS_OPT_PEND_BLOCKING,&msg_size,0,&err); // 阻塞等待任务消息if(err == OS_ERR_NONE)printf("Task2 Get Msg Success \r\n");elseprintf("Task1 Get Msg Error\r\n");printf("msg srting %s\r\n",pmsg->msg_string);printf("msg value %d\r\n",pmsg->value);}}
相关文章:

STM32F4X UCOSIII任务消息队列
STM32F4X UCOSIII任务消息队列 任务消息队列和内核消息队列对比内核消息队列内核消息队列 UCOSIII任务消息队列API任务消息队列发送函数任务消息队列接收函数 UCOSIII任务消息队列例程 之前的章节中讲解过消息队列这个机制,UCOSIII除了有内核消息队列之外࿰…...

8个居家兼职,帮助自己在家搞副业
越来越多的人开始追求居家工作的机会,无论是为了获得更多收入以改善生活质量,还是为了更好地平衡工作和家庭的关系,居家兼职已成为一种趋势。而在家中从事副业不仅能够为我们带来额外的收入,更重要的是,它可以让我们在…...

管理与系统思维
技术管理者不仅仅需要做事情,还需要以系统思维的方式推动组织变革,从而帮助团队和个人做到更好。原文: Management and Systems Thinking 图片来源: Dall-E "除非管理者考虑到组织的系统性,否则大多数提高绩效的努力都将注定失败。"…...
电死人的是电流还是电压?
先说答案,是电流。 这个有两个派别,一个是电流派,一个是电压派。 举个例子,拿我们的头发或者指甲之类的高电阻物质去接触高压,你会发现基本没有什么作用;还有就是冬天我们脱毛衣的时候,噼里啪啦…...
mac 编译问题记录
1、mac 编译提示 Unsupported option ‘--no-pie‘ Linux 上用 --no-pie mac 上用 -no-pie 2、mac 找不到 malloc.h 使用 #include <sys/malloc.h> Mac上使用malloc函数报错_mac malloc.h-CSDN博客...

centos 7.9同时安装JDK1.8和openjdk11两个版本
1.使用的原因 在服务器上,有些情况因为有一些系统比较老,所以需要使用JDK8版本,但随着时间的发展,新的软件出来,一般都会使用比较新的JDK版本。所以就出现了我们标题的需求,一个系统内同时安装两个不同的版…...

【JavaEE】HTML
JavaWeb HTML 超文本标记语言 超文本:文本、声音、图片、视频、表格、连接标记:有许许多多的标签组成 vscode开发工具搭建 因为我使用的IDEA是社区版,代码高亮补全缩进都有些问题,使用vscode是最好的选择~ 安装 Visual Stu…...

【数据结构--八大排序】之堆排序
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

c# 中的类
反射 Activator.CreateInstance class Program {static void Main(string[] args){//反射Type t typeof(Student);object o Activator.CreateInstance(t, 1, "FJ");Student stu o as Student;Console.WriteLine(stu.Name);//动态编程dynamic stu2 Activator.Cre…...

基于单片机的煤气泄漏检测报警装置设计
一、项目介绍 煤气泄漏是一种常见的危险情况,可能导致火灾、爆炸和人员伤亡。为了及时发现煤气泄漏并采取相应的安全措施,设计了一种基于单片机的煤气泄漏检测报警装置。 主控芯片采用STM32F103C8T6作为主控芯片,具有强大的计算和控制能力。…...
[导弹打飞机H5动画制作] 导弹每次飞行的随机路线制作
技术核心提示: 第一步:检测引导层插件是否具备,如果没有手工添加: createjs.MotionGuidePlugin.install(); 第二步:增加全局变量: var fValue=0; var iOddEven =0; var missileObj=null; 第三步:填写 第一帧 代码: if (missileObj)stage.removeChild(missileObj);missile…...

OpenCV实现FAST算法角点检测 、ORB算法特征点检测
目录 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 非极大值抑制 1.3 代码实现 1.4 结果展示 2 ,ORB算法 2.1代码实现 2.2 结果展示 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 …...

【Unity的 Built-in 渲染管线下实现好用的GUI模糊效果_Blur_案例分享(内附源码)】
CGPROGRAM实现好用的GUI模糊效果 实现Blur模糊方式1C#代码如下方式1_Shader代码如下实现Blur模糊方式2方式2_Shader如下实现Blur模糊方式1 其他的模糊效果,在这一篇。 效果如图: 新建一个C#文件,命名为"CommandBlur",打开C#,删除内容,复制粘贴下面的代码:…...

AR智能眼镜:提升现场服务技能、效率与盈利能力的利器(一)
随着技术的不断进步,现场服务组织正朝着远程支持转变,用以解决技能差距和生产力问题,提高员工培训和操作效率,同时为企业提高利润率,创造竞争优势。 本文将探讨增强现实(AR)、辅助现实…...

ChatGPT 在机器学习中的应用
办公室里一个机器人坐在人类旁边,Artstation 上的流行趋势,美丽的色彩,4k,充满活力,蓝色和黄色, DreamStudio出品 一、介绍 大家都知道ChatGPT。它在解释机器学习和深度学习概念方面也非常高效,…...

【JavaEE】锁策略
文章目录 前言1. 乐观锁和悲观锁2. 重量级锁和轻量级锁3. 自旋锁和挂起等待锁4. 公平锁和非公平锁5. 可重入锁和非可重入锁6. 读写锁Java synchronized 分别对应哪些锁策略1. 乐观锁和悲观锁2. 重量级锁和轻量级锁3. 自旋锁和挂起等待锁4. 公平锁和非公平锁5. 可重入锁和非可重…...

在 SDXL 上用 T2I-Adapter 实现高效可控的文生图
T2I-Adapter 是一种高效的即插即用模型,其能对冻结的预训练大型文生图模型提供额外引导。T2I-Adapter 将 T2I 模型中的内部知识与外部控制信号结合起来。我们可以根据不同的情况训练各种适配器,实现丰富的控制和编辑效果。 同期的 ControlNet 也有类似的…...

Python分支结构和循环结构
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一.分支结构 分支结构是根据判断条件结果而选择不同向前路径的运行方式,分支结构分为:单分支,二分支和多分支。 1࿰…...
Unity调用API函数对系统桌面和窗口截图
Unity3D调用WINAPI函数对系统窗口截图 引入WINAPI函数调用WINAPI函数进行截图使用例子 引入WINAPI函数 using System; using System.Collections; using System.Runtime.InteropServices; using System.Drawing;[DllImport("user32.dll")]private static extern Int…...
【问题思考总结】CPU怎么访问磁盘?CPU只有32位,最多只能访问4GB的空间吗?
问题 在学习操作系统的时候发现了这样一个问题,32位的CPU寻址空间只有4GB,难道只有4GB的空间可以使用吗?以此为始,我开始了一些思考。 思考 Q1:首先,我似乎混淆了一个概念,内存和外存&#x…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...
【题解-洛谷】P10480 可达性统计
题目:P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M,接下来 M M M 行每行两个整数 x , y x,y x,y,表示从 …...

项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…...
在ubuntu等linux系统上申请https证书
使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具,支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上: sudo apt update sudo apt install certbot申请证书 纯手动方式(不自动配置)&…...