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);}}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/144860.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32S3的MPU-6050组件移植教程

前言 &#xff08;1&#xff09;实习公司要搞ESP32BOX的驱动移植&#xff0c;所有资料自己找还是比较折磨人的现在我分享几个官方的组件移植资料&#xff1a; <1>Find the most exciting ESP-IDF components&#xff08;ESP32的官方组件都可以在里面查&#xff0c;按照他…

安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识

安卓机型app的编译与反编译 apk文件的简单说明与解析 -安卓修改apk apk的组成和编译 一 电脑端几种反编译apk工具操作步骤解析 前面几个博文有说明关于反编译apk和apk架构等有些常识.今天对以上做个补充。初学者记住一点。对于一个apk文件使用压缩软件7zip打开可以查看到文件…

BUUCTF刷题十一道(09)

文章目录 October 2019 Twice SQL Injection[GYCTF2020]EasyThinking[BJDCTF2020]EzPHP[HFCTF2020]JustEscape(vm2沙箱逃逸)[GXYCTF2019]StrongestMind[GKCTF 2021]easycms[SUCTF 2018]GetShell[b01lers2020]Life on Mars[WMCTF2020]Make PHP Great Again[MRCTF2020]Ezaudit[CS…

关于Java的IO流里面的方法read()的细究

我们会经常看到上面的代码&#xff0c;很显然read(b)&#xff0c;是把字节读入到b这个字节数组里&#xff0c;然后read()返回一个成功读取的字节长度&#xff0c;如果现在用不带参的read()去一个一个字节的读了&#xff1f;那么len bInput.read()就是把这一个节字读入到len&am…

modbusTCP【codesys】

1添加控制器【控制器】&#xff1a; 右击左侧树型菜单【Device】→选择【添加设备】&#xff0c;在弹出对话框中下拉选择【以太网适配器】下的【Ethernet】&#xff0c;最后点击【添加设备】。 注意固件能支持的版本。我的是3.5.17 2添加主站【主站】 2添加从站【从站】 双…

Leetcode 662. 二叉树最大宽度

文章目录 题目代码&#xff08;9.30 首刷看解析&#xff09; 题目 Leetcode 662. 二叉树最大宽度 代码&#xff08;9.30 首刷看解析&#xff09; class Solution { public:int widthOfBinaryTree(TreeNode* root) {unsigned long long res 1;using pr pair<TreeNode*, u…

Ros2 学习02- ubuntu22.04 安装ros2

设置镜像源 sudo vim /etc/apt/sources.list#阿里源 deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jamm…

Java下Properties类的使用(写出和读入)

代码如下&#xff1a; public class MyWork {public static void main(String[] args) throws IOException {Properties pro1 new Properties();pro1.setProperty("0001","张三");pro1.setProperty("0002","李四");pro1.setProperty…

侯捷 C++ STL标准库和泛型编程 —— 3 容器(关联式容器)

3.3 关联式容器 3.3.0 RB-Tree 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树 BST&#xff08;AVL 是另一种&#xff09; rb-tree 提供遍历操作和 iterators&#xff0c;按中序遍历遍历&#xff0c;便可以得到排序状态 不能用 iterator 去改变元素的…

Springboot对MVC、tomcat扩展配置

Springboot在web层的开发基本都是采用Springmvc框架技术&#xff0c;但是Springmvc中的某些配置在boot是没有的&#xff0c;我们就应该根据自己的需求进行对mvc扩展配置 Springboot1.x版本如何配置 通过注解Configuration一个类&#xff0c;继承webmvcconfigureradapter&#…

贪婪的互联网电视让用户忍无可忍,广电总局出手了

广电总局要求电视需要在今年底前实现开机就看电视&#xff0c;开机广告、关机广告将不再被允许&#xff0c;这对于饱受互联网电视无孔不入的广告困扰的消费者来说无疑是一大利好&#xff0c;他们早已无法忍受越来越多的广告。 一、贪婪的互联网电视 互联网电视企业曾以羊毛出在…

华为云云耀云服务器L实例评测 | 实例评测使用之软件性能评测:华为云云耀云服务器下的 Redis 性能评测

华为云云耀云服务器L实例评测 &#xff5c; 实例评测使用之软件性能评测&#xff1a;华为云云耀云服务器下的 Redis 性能评测 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云…

汇编语言——王爽

使用debug执行汇编程序的步骤&#xff1a; dir进入界面 编译&#xff1a;masm 链接&#xff1a;link 执行&#xff1a;debug 文件名 汇编程序格式 assume cs:code cs是寄存器&#xff0c;code是标号&#xff1b; code segment //代码段开始 ... ... mov ax,4…

数据集笔记:华盛顿共享单车OD数据

2010~2022 共享单车OD数据 数据地址&#xff1a;Index of bucket "capitalbikeshare-data"

Linux下C语言操作网卡的几个代码实例?特别实用

前面写了一篇关于网络相关的文章&#xff1a;如何获取当前可用网口。 《简简单单教你如何用C语言列举当前所有网口&#xff01;》 那么如何使用C语言直接操作网口&#xff1f; 比如读写IP地址、读写MAC地址等。 一、原理 主要通过系统用socket()、ioctl()、实现 int sock…

《三国志》游戏的MySQL数据设计与管理

在任何成功的游戏背后,都有一个精心设计和管理的数据系统。这不仅决定了游戏的运行效率,还直接影响到玩家的游戏体验。 本文将深入探讨著名游戏《三国志》中的数据设计和管理。本文将讲解游戏中核心的数据元素、数据管理方法,以及开发团队在数据方面所做的工作。 文章目录 …

Java版本企业工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

深入理解JavaScript中的事件冒泡与事件捕获

在JavaScript中&#xff0c;事件是交互式网页开发中的关键概念之一。了解事件冒泡和事件捕获是成为一名优秀的前端开发者所必需的技能之一。本文将深入探讨这两个概念&#xff0c;解释它们是如何工作的&#xff0c;以及如何在实际应用中使用它们来处理事件。 一.什么是事件冒泡…

Android Shape设置背景

设置背景时&#xff0c;经常这样 android:background“drawable/xxx” 。如果是纯色图片&#xff0c;可以考虑用 shape 替代。 shape 相比图片&#xff0c;减少资源占用&#xff0c;缩减APK体积。 开始使用。 <?xml version"1.0" encoding"utf-8"?…

智慧安防视频监控技术+AI智能分析算法助力美好乡村建设

上期我们聊到AI智能视频监控技术如何助力美好乡村建设&#xff1f;的相关方案&#xff0c;收到了很多粉丝的讨论与关注&#xff0c;视频监控只是乡村建设极其基础的一环&#xff0c;基于视频监控平台的AI智能算法&#xff0c;将人工智能融合到安防监控之中&#xff0c;才能让乡…