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燈就會反轉,同時串口調試工具可以看到消息郵箱的剩餘空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章