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

一、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灯就会反转,同时串口调试工具可以看到消息邮箱的剩余空间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值