keil MDK之RTX的消息邮箱的API函数

2023-10-27

一、RTX消息邮箱的API函数

RTX消息邮箱的API函数总共有8个,如下图


下面就将几个这里要用到的函数
1、os_mbx_declare函数原型
#define os_mbx_declare( \ 
    name,               \ /* Name of the mailbox */
    cnt )               \ /* Number of message entries */
U32 name [4 + cnt]
函数描述:
这严格来讲不能叫函数吧,它定义了消息邮箱的名字和大小,其实就是用宏定义了一个数组
第一个参数表示定义的消息邮箱名
第二个参数表示定义的消息的个数
使用举例:
/* Declare a mailbox for 20 messages. */
os_mbx_declare (mailbox1, 20);


__task void task1 (void) {
   ..
  os_mbx_init (&mailbox1, sizeof(mailbox1));
   ..
}
2、os_mbx_init函数原型
void os_mbx_init (
    OS_ID mailbox,       /* The mailbox to initialize */
    U16   mbx_size );    /* Number of bytes in the mailbox */

函数描述:

该函数用于消息邮箱的初始化

第一个参数表示消息邮箱的ID,也就是消息邮箱的名字

第二个参数表示消息邮箱的大小

使用举例:

/* Declare a mailbox for 20 messages. */
os_mbx_declare (mailbox1, 20);

__task void task1 (void) {
   ..
  os_mbx_init (&mailbox1, sizeof(mailbox1));
   ..
}
3、os_mbx_send函数原型
OS_RESULT os_mbx_send (
    OS_ID mailbox,        /* The mailbox to put the message in */
    void* message_ptr,    /* Pointer to the message */
    U16   timeout );      /* Wait time for mailbox to be free */
函数描述:
该函数用于像消息邮箱发送消息(其实是数据地址)
第一个参数是消息的名字
第二个是消息的指针
第三个是消息的延迟时间 0 - 0xFFFF当设置为0xFFFF表示无限等待邮箱为非满
返回值OS_R_OK,表示发送成功
      OS_R_TMO表示超时
使用举例:
__task void task2 (void) {
  void *msg;
   ..
  os_mbx_wait (mailbox1, &msg, 0xffff);
  /* process message content here */
  free (msg);
   ..
}
4、os_mbx_wait函数原型
OS_RESULT os_mbx_wait (
    OS_ID  mailbox,      /* The mailbox to get message from */
    void** message,      /* Location to store the message pointer */
    U16    timeout );    /* Wait time for message to become available */
函数描述:
该函数用于从消息邮箱中获取消息
第一个参数表示邮箱名
第二个参数用于存放消息的地址
第三个表示设置等待的时间
使用举例:
__task void task1 (void){
  void *msg;
   ..
  if (os_mbx_wait (&mailbox1, &msg, 10) == OS_R_TMO) {
    printf ("Wait message timeout!\n");
    }
  else {
    /* process message here */
    free (msg);
  }
   ..
}
5、os_mbx_check函数原型
OS_RESULT os_mbx_check (
   OS_ID mailbox );    /* The mailbox to check for free space */
函数描述:
该函数用于检测消息邮箱剩余的消息空间的个数
第一个参数表示消息邮箱的名字
返回值表示剩余的消息的空间的个数
使用举例:
os_mbx_declare (mailbox1, 20);

__task void task1 (void) {
   ..
  if (os_mbx_check (&mailbox1) == 0) {
    printf("Mailbox is full.\n");
  }
   ..
}
二、RTX实验目的
学习RTX的消息邮箱通信
三、实验的内容
1、k1按键用于发送消息
2、在AppTaskUserKey任务中发送消息
3、在AppTaskRun中接受消息 用于控制LED,同时检测消息邮箱的剩余空间

四、实验完整代码



#include "bsp.h" /* 底层硬件驱动 */
#include <RTL.h>




static uint64_t AppTaskLEDStk[256/8];/*任务栈*/
static uint64_t AppTaskStartStk[512/8];/*任务栈*/
static uint64_t AppTaskUserStk[512/8];/*任务栈*/
static uint64_t AppTaskRunStk[512/8];
/*任务句柄*/
OS_TID HandleTaskLED = NULL;
OS_TID HandleTaskKey = NULL; 
OS_TID HandleTaskRun = NULL;
/*函数声明*/
static void AppTaskCreate(void);
__task void AppTaskLED(void);
__task void AppTaskStart(void);
__task void AppTaskUserKey(void);
__task void AppTaskRun(void);
/*定义消息邮箱*/
os_mbx_declare(mailbox,5);

/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形    参:无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{


/*
ST固件库中的启动文件已经执行了 SystemInit() 函数,该函数在 system_stm32f4xx.c 文件,主要功能是
配置CPU系统的时钟,内部Flash访问时序,配置FSMC用于外部SRAM
*/
bsp_Init();/**/
os_sys_init_user(AppTaskStart,            /*任务函数*/
4,                       /*任务优先级*/
&AppTaskStartStk,        /*任务栈*/
sizeof(AppTaskStartStk));/*任务栈大小*/
/* 进入主程序循环体 */
while (1)
{
;
}
}
/*
*********************************************************************************************************
* 函 数 名: AppTaskUserKey
* 功能说明: 按键键值
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
__task void AppTaskUserKey(void)
{
uint8_t ucKeycode = 0;
static uint8_t ucMsg = 0;
while(1)
{
ucKeycode = bsp_GetKey();
switch(ucKeycode)
{
case KEY_DOWN_K1:
printf("向消息邮箱发送数据\r\n");
os_mbx_send(mailbox,&ucMsg,0xFFFF);
ucMsg++;

break;
case KEY_DOWN_K2:
break;
case KEY_DOWN_K3:
break;
default:
break;
}
os_dly_wait(20);
}
}
/*
*********************************************************************************************************
* 函 数 名: AppTaskRun
* 功能说明: LED闪烁的任务
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
__task void AppTaskRun(void)
{
uint8_t *pMsg;
OS_RESULT num = 0;
while(1)
{
num = os_mbx_check(mailbox);
printf("邮箱剩余的空间%d\r\n",num);
os_mbx_wait(mailbox,(void *)&pMsg,0xFFFF);

if(*pMsg % 2 == 0)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_7);
}
else
{
GPIO_SetBits(GPIOF,GPIO_Pin_7);
}
os_dly_wait(500);
}
}
/*
*********************************************************************************************************
* 函 数 名: AppTaskLED
* 功能说明: LED闪烁的任务
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
__task void AppTaskLED(void)
{
static uint8_t i = 0;
while(1)
{
if(i % 2 == 0)
{
GPIO_ResetBits(GPIOI,GPIO_Pin_10);/*点亮LED*/
}
else
{
GPIO_SetBits(GPIOI,GPIO_Pin_10);/*熄灭LED*/
}
i++;
os_dly_wait(800);/*系统延时函数 因为时钟节拍为1000 所以这里是延时800ms,也就是使AppTaskLED任务挂起800MS*/
}
}
/*
*********************************************************************************************************
* 函 数 名:AppTaskCreate
* 功能说明: 任务创建
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void AppTaskCreate(void)
{
HandleTaskLED = os_tsk_create_user(AppTaskLED,            /*任务函数*/
1,                     /*优先级 注意RTX的数字越小,优先级越低*/
 &AppTaskLEDStk,        /*任务栈起始地址*/
sizeof(AppTaskLEDStk));/*任务栈大小*/
HandleTaskKey = os_tsk_create_user(AppTaskUserKey,        /*任务函数*/
 3,                     /*优先级 注意RTX的数字越小,优先级越低*/
 &AppTaskUserStk,       /*任务栈起始地址*/
 sizeof(AppTaskUserStk));/*任务栈大小*/
HandleTaskRun = os_tsk_create_user(AppTaskRun,            /*任务函数*/
 2,                     /*优先级 注意RTX的数字越小,优先级越低*/
 &AppTaskRunStk,        /*任务栈起始地址*/
 sizeof(AppTaskRunStk));/*任务栈大小*/
}
/*
*********************************************************************************************************
* 函 数 名:AppTaskStart
* 功能说明: 开始任务
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
__task void AppTaskStart(void)
{
AppTaskCreate();/*创建AppTaskLED任务*/
os_mbx_init(mailbox,sizeof(mailbox));/*初始化邮箱*/
while(1)
{
bsp_KeyScan();/*按键扫描*/
os_dly_wait(10);/*系统延时函数*/
}
}

五、实验现象

每次按下k1,LED灯就会反转,同时串口调试工具可以看到消息邮箱的剩余空间

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

keil MDK之RTX的消息邮箱的API函数 的相关文章

  • elasticsearch ubuntu 安装

    之前 一直听说 Elasticsearch功能强大 我今天安装了下 到pypi里看了下 并安装到虚拟环境中 本以为它就是一个包呢 所以试着用 结果出问题了 后来一看 原来它也是分服务端可客户端的 pypi里的这个是客户端 搭建很简单 所以我
  • Qt Qstring字符串的查找、替换、切割操作

    文章目录 查找 替换replace 字符串切割 查找 直接上代码 include
  • 手把手教你使用simulink配合STM32CUBEMX (生成keil项目实战)

    本文的作者在自学过程中发现该类资料的缺少 以及前人叙述不够完善的情况下 进行了本文的创作 文章将一步一步的讲解如何使用simulink将F4的灯点亮 更多的功能我们一起探索 别的型号的 cpu 大家可以类比进行 1 首先是将MATLAB安装
  • 模拟HashSet

    package chain 单链表 节点 Map中的Entry
  • 国际版阿里云/腾讯云CDN装备运用教程:加快网站拜访速度

    阿里云CDN装备运用教程 加快网站拜访速度 本文旨在为读者供给一个关于阿里云CDN的简要教程 咱们将介绍阿里云CDN的基本概念 资源加快过程 同步资源设置以及与阿里云OSS目标存储的结合 期望经过这篇教程 读者能够更好地了解和利用阿里云CD
  • 感知机

    统计学习方法 此书中 将感知机模型讲解十分清楚 并且推导了损失函数设计原理 随机梯度下降方法求解参数 详细解释了对偶问题求解方法及模型的收敛性 笔者再次学习该模型后 将自己的理解融入本文中 从感知机模型 损失函数设定 计算策略 算法流程这4
  • vue create is a Vue CLI 3 only command and you are using Vue CLI 2.9.6. You may want to run the

    这是应为vue的版本存在更新 需要先卸载vue cli2 然后重新安装vue cli 3 1 卸载vue cli2 npm uninstall vue cli g 或 yarn global remove vue cli 2 安装vue c
  • TCP报文段首部格式介绍

    1 TCP报文段首部格式tu 2 头部各个字段介绍 1 源端口和目的端口 源端口和目的端口字段各占 2 字节 端口是运输层与应用层的服务接口 运输层的复用和分用功能都要通过端口才能实现 2 序号字段 序号字段占 4 字节 要明确的是 TCP
  • WebService报错javax.xml.ws.soap.SOAPFaultException: javax.xml.ws.WebFault.messageName()

    原文地址 http blog csdn net woshixuye article details 14312579 一 发现问题 JAX WS规范是一组XML web services的JAVA API JAXWS RI是其的一个包 用j
  • 面试-大数据-场景题-sql

    1 求5min内浏览次数达到100的用户 LAG和LEAD函数 转载自 有如下场景 某公司网站每日访问量达到10亿级别的访问量 每次访问记录一条数据 数据包含如下字段 用户ID 访问时间 毫秒级 访问页面 要求使用hive求出所有在5分钟内
  • 卷积神经网络的三个特性

    转载 elecfans com emb fpga 20171116580425 2 html 局部感知 形象地说 就是模仿你的眼睛 想想看 你在看东西的时候 目光是聚焦在一个相对很小的局部的吧 严格一些说 普通的多层感知器中 隐层节点会全连

随机推荐

  • 关于C#模拟LED

    如下图 不管是用什么控件 或者是richTextBox 或者是TextBox 等等 我想应该都可以做得出下面这种效果来 但是 本人研究了快半个月了 可以说也没有找到什么很好的头绪 所以 干脆就粘贴在我的博客中了 希望看到的朋友给我个意见或者
  • c语言在输入字符串时输入空格的方式

    1 最容易的 将一个字符串分为一个一个字符输入 char s 100 int i 0 while scanf c s i s i n i s i 0 遇到换行停止输入 并且将换行替换为 0 printf s n s 但是如果在这段程序前还有
  • 每日一题:最大和上升子序列

    最大和上升子序列 题目 Daimayuan Online Judge 动态规划 和最长上升子序列类似 状态划分 以第i个数结尾的上升子序列的倒数第二个数可能是第一个数 第二个数 第i 1个数 从第一个数开始枚举 以它为结尾 首先f i a
  • bboss 流批一体化框架 与 数据采集 ETL

    数据采集 ETL 与 流批一体化框架 特性 高效 稳定 快速 安全 bboss 是一个基于开源协议 Apache License 发布的开源项目 主要由以下三部分构成 Elasticsearch Highlevel Java Restcli
  • feign调用使用Apache Http遇到问题汇总

    feign调用使用Apache Http目前已知会造成三个问题 1 RequestMapping必须显式指定调用方式 method RequestMethod POST 否则默认会使用get请求 这会造成之前一些没有显式指定调用方式的方法报
  • linux下quartus出现ModelSim executable not found和Unable to checkout a license. Make sure...... 错误

    一定要把Tools gt Options gt EDA Tool Options设置到bin下YOUR PATH altera 13 1 modelsim ase bin 注意是modelsim ase不是modelsim ae 而且有bi
  • C++内存分析工具

    C 内存分析工具 背景 内存泄漏在c 中是一个常见的问题 有一个好用的内存分析工具就是很有必要的 下面来介绍两个简单好用的内存分析工具 Valgrind和Sanitizer Valgrind valgrind是一种非侵入式的内存检测工具 在
  • TTS

    FastSpeech 基于 Transformer 的前馈网络 用于并行生成 TTS 梅尔谱图 FastSpeech 模型与自回归 Transformer TTS 相比 梅尔谱图生成速度加快了 270 倍 端到端语音合成速度加快了 38 倍
  • 【电商专享】聚划算活动海量商品一键报名,省时省力!

    电商专享 聚划算活动海量商品一键秒参与 省时省力 本机器人支持自动登录淘宝账号 输入密码并智能通过验证 将根据表格内容自动填写商品信息完成聚划算活动报名 并支持多款商品上传
  • 又是沙雕的一天-------关于错误关掉任务管理器之后出现的开机黑屏的解决

    沙雕经过 肝了一下午的实验 然后脑子十分不清醒的我 看着自己电脑上N多的窗口 默默的任务栏 gt 右键 gt 任务管理器 gt 任务管理器 gt 结束任务 然后华丽丽的让电脑黑屏了 想起社团大佬的教诲 默默的强制关机 好使 接着登陆界面出现
  • C++11:std::move和std::forward

    标准库函数 std move 既然编译器只对右值引用才能调用转移构造函数和转移赋值函数 而所有的命名对象都只能是左值引用 如果已知一个命名对象不再被使用而想对他调用转移构造函数和转移赋值函数 也就是把一个左值引用当做右值引用来使用 怎么做呢
  • 异步通信起始位正确检测的VHDL实现

    异步通信起始位正确检测的VHDL实现
  • apache做反向代理服务器

    http yahoon blog 51cto com 13184 162922 原创作品 允许转载 转载时请务必以超链接形式标明文章 原始出处 作者信息和本声明 否则将追究法律责任 http yahoon blog 51cto com 13
  • 游戏开发unity杂项知识系列:unity可以使用的小技巧

    插眼 总结 个人觉得这些技巧都挺实用的 参考 Unity3d 提升开发效率的小技巧 第一集 哔哩哔哩 bilibili 一共有五集 这是第一集
  • vue项目中获取今天,昨天,明天时间方法

    在项目中有这个需求 就是在时间查询条件了中 需要默认前天的时间 如果你项目中需要使用今天 昨天 明天时间方法同样适用 具体方法如下 1 vue调用说明 比如我是需要前天的时间 this getDay 2 这个是不包括时分秒的 更多例子如下
  • springMVC中两种validation的简单使用

    本文转自 http elf8848 iteye com blog 1299587 Spring 基于注释的校验机制 1 支持JSR303 Bean Validation定义的校验规范 2 支持Spring框架定义的Validator接口定义
  • 首批!八家大模型企业面向全民开放

    Datawhale干货 开放 国产大模型 编辑 司玉鑫 前 言 在科技领域 一项重要的消息引起了广泛关注 8月31日凌晨 首批大模型产品终于获得了正式批准 这一消息不仅令行业内的巨头企业欢欣鼓舞 也使创业公司和科研院校感到振奋 这些获得批准
  • Oracle (内连接)与(外连接)区别

    表t user1 t user2 t user3 各有id name两列 id name 1 10A 2 20A id name 1 10B 3 30B id name 1 10C 4 40C 连接分为两种 内连接与外连接 A 内连接 内连
  • 高版本IAR打开低版本编译的程序出现的问题

    山外KEA程序一打开就出现这个 The project file vcan Kinetis ewp is in an old format Would you like to convert it for use with this ver
  • keil MDK之RTX的消息邮箱的API函数

    一 RTX消息邮箱的API函数 RTX消息邮箱的API函数总共有8个 如下图 下面就将几个这里要用到的函数 1 os mbx declare函数原型 define os mbx declare name Name of the mailbo