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…...
UG NX二次开发(C++)-CAM-根据刀具对程序组进行重新分组
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX中创建一个三维模型3、在UG NX/CAM中创建多个加工程序4、采用UG NX二次开发(NXOpen)实现按照刀具分组程序组4.2 创建UI Styler4.1 实现逻辑4.2 生成的代码如下:4.3 测试效果4.…...
Unity如何实现TreeView
前言 最近有一个需求,需要实现一个TreeView的试图显示,开始我一直觉得这么通用的结构,肯定有现成的UI组件或者插件可以使用,结果,找了好久,都没有找到合适的插件,有两个效果差强人意。 最后在回家的路上突然灵光一闪,想到了一种简单的实现方式,什么插件都不用,仅使用…...
Android widget 小部件使用指南强化版
Android widget 小部件使用指南强化版 一、简单UI的小部件二、含集合的小部件三、可配置的小部件四、可控制的小部件五、Android 12 Widget 更新 小部件是主屏幕定制的一个重要方面。您可以将它们视为应用程序最重要的数据和功能的“概览”视图,这些数据和功能可以直…...
Linux下C语言操作网卡的几个代码实例?特别实用
前面写了一篇关于网络相关的文章:如何获取当前可用网口。 《简简单单教你如何用C语言列举当前所有网口!》 那么如何使用C语言直接操作网口? 比如读写IP地址、读写MAC地址等。 一、原理 主要通过系统用socket()、ioctl()、实现 int sock…...
noip2011选择旅馆
1.审题:第一个人与第二个人入住的旅馆要求是同色的; 两个人去消费的旅馆并没有要求与入住的旅馆是同色的(这点要小心) 2.要求记录以下数据: 1)a[color]表示当前同为颜色color的旅馆数 2)b[co…...
vue造轮子完整指南--npm组件包开发步骤
一、项目包文件的创建和初始化。 1. 新建项目包。 vue create <Project Name> //用于发布npm包的项目文件名 ps:一般选择自定义,然后不需要Vuex和Router,其他选项按自己实际情况选择安装即可。 2.修改原始src文件名、新增组件项目存放文件和修改…...
28 drf-Vue个人向总结-1
文章目录 前后端分离开发展示项目项补充知识开发问题浏览器解决跨域问题 drf 小tips设置资源root目录使用自定义的user表设置资源路径media数据库补充删除表中数据单页面与多页面模式过滤多层自关联后端提交的数据到底是什么jwt token登录设置普通的 token 原理使用流程解析 jw…...
线性代数(七) 矩阵分析
前言 从性线变换我们得出,矩阵和函数是密不可分的。如何用函数的思维来分析矩阵。 矩阵的序列 通过这个定义我们就定义了矩阵序列的收敛性。 研究矩阵序列收敛性的常用方法,是用《常见向量范数和矩阵范数》来研究矩阵序列的极限。 长度是范数的一个特…...
myArm 全新七轴桌面型机械臂
引言 在不断演进的科技世界中,我们始终追求创新和卓越,以满足客户的需求并超越他们的期望。今天,我们很高兴地宣布我们的最新产品——myArm 300 Pi,一款七轴的桌面型机械臂。这款产品的独特之处在于其灵活性和可编程性,…...
tomcat乱码解决
解决乱码 1、修改bin\catalina.bat配置文件 修改tomcat的配置文件,找到tomcat路径下的\bin目录下的catalina.bat文件,修改 set “JAVA_OPTS%JAVA_OPTS% %JSSE_OPTS% -Dfile.encodingUTF-8 -Dsun.jnu.encodingUTF-8 ” 2、修改conf\logging.properties配置…...
网站策划设计招聘/小程序开发框架
作者:朱金灿 来源:https://blog.csdn.net/clever101 将一个Windows程序从32位转为64位程序,出现用户回调期间遇到未经处理的异常的错误,如下图: 经过调试发现是调用GetWindowLong返回为空指针,经过搜索&am…...
网站怎么做图片转换/seo的中文含义是什么意思
目录一、MySQL进阶查询1.1 常用查询1.1.1 按关键字排序1.1.2 对结果进行分组1.1.3 限制结果条目1.1.4 设置别名1.1.5 通配符1.1.6 子查询1.2 NULL值1.3 正则表达式1.3.1 以特定字符串开头的记录1.3.2 以特定字符串结尾的记录1.3.3 包含指定字符串的记录1.3.4 以“.”代替字符串…...
网站建设人员安排/网站怎么做到秒收录
继续表格的有关操作,这篇说说表格行与列的删除。 所有这些操作恼人的地方其实都是在融合的单元格上 a.行的移除 首先计算整个表格的总列数。 总列数 var$row $(sender).parent().parent();var$nextRow $row.next();var$firstRow $row.parent().children("tr:fi…...
wordpress最受欢迎的主题/刷seo关键词排名软件
MySQL服务器重写器查询重写插件MySQL支持查询重写插件,该插件可以在服务器执行SQL语句之前检查并可能修改服务器收到的SQL语句。请参阅查询重写插件。MySQL发行版包括一个名为的后解析查询重写插件,Rewriter以及用于安装该插件及其相关组件的脚本。这些组…...
中山企业网站制作公司/一个完整的产品运营方案
c线程thread C11/C14 线程教程 thread类官网详解 thread类官网详解 参考链接 文章目录c线程thread1.创建线程2.守护线程3. 可调用对象4. 传参5. 线程的移动和复制6.线程id7. 互斥mutex1.创建线程 直接初始话thread类对象进行创建线程,创建线程后调用join()方法&…...
怎么做网站界面分析/廊坊seo快速排名
一,介绍 本文介绍使用Kruskal算法求解无向图的最小生成树。Kruskal是一个贪心算法,并且使用了并查集这种数据结构。关于并查集的介绍,参考:数据结构--并查集的原理及实现 二,构造一个无向图 图,肯定有顶点和…...