【iCore4 雙核心板_uC/OS-II】例程九:訊息佇列

XiaomaGee發表於2018-03-02

一、實驗說明:

  前面介紹通過資訊傳遞可以進行任務間的交流,資訊也可以直接傳送給一個任務,在uC/OS-II中每一個任務在它們內部都有一個訊息佇列,也即任務訊息佇列,使用者可以直接給一個任務傳送訊息,不需要額外的訊息佇列,這樣不公優化了程式碼,而且比用一個單獨的外部訊息佇列更有效率。任務訊息佇列建立在每一個任務的內部,如下圖。

 

二、實驗截圖:

三、原始碼下載連結:

連結:https://pan.baidu.com/s/1ggDoXYr 密碼:lm3y

四、核心程式碼:

/*
 * Name                : main
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
/*實驗現象:
  開啟串列埠工具putty.exe,終端顯示當前訊息佇列大小,按下ARM.KEY按鍵,
  顯示訊息佇列大小和訊息。
  */
int main(void)
{
    system_clock.initialize();                               //系統時鐘初始化
    led.initialize();                                        //LED初始化
    usart6.initialize(115200);                               //串列埠初始化
    key.initialize();

    usart6.printf("\x0c");                                   //清屏    
    usart6.printf("\033[1;32;40m");                          //設定字型終端為綠色
    usart6.printf("\r\n Hello, I am iCore4!\r\n\r\n");
    LED_RED_ON;

    OSInit(); 

    //UCOS初始化
    OSTaskCreate(start_task,                                 //建立開始任務
            (void*)0,                                   //任務引數
            (OS_STK*)&START_TASK_STK[START_STK_SIZE-1], //任務堆疊
            START_TASK_PRIO);                           //任務優先順序
    OSStart();                                               //開啟UCOS    
}
/*
 * Name                : start_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr;

    TaskQ = OSQCreate(&msg[0], 10);//建立訊息佇列

    OSStatInit();//初始化統計任務

    OS_ENTER_CRITICAL();//關中斷

    OSTaskCreate(AppTask1_task,(void*)0,(OS_STK*)&AppTask1_TASK_STK[AppTask1_STK_SIZE-1],AppTask1_TASK_PRIO);//建立AppTask1任務
    OSTaskCreate(AppTask2_task,(void*)0,(OS_STK*)&AppTask2_TASK_STK[AppTask2_STK_SIZE-1],AppTask2_TASK_PRIO);//建立AppTask2任務
    OSTaskSuspend(OS_PRIO_SELF);//掛起start_task任務

    OS_EXIT_CRITICAL();//開中斷
}
/*
 * Name                : AppTask1_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void AppTask1_task(void *pdata)
{
    u8 err;
    int i = 0;
    INT8U buf[2];

    while(1){
        i++;
        buf[0] = i;
        buf[1] = i + 1;
        if(ARM_KEY_STATE == KEY_DOWN){           //按鍵按下
            err = OSQPost(TaskQ, (void *)&buf[0]);//傳送訊息佇列
            switch(err){ 
                case OS_ERR_NONE: 
                    break; 
                case OS_ERR_Q_FULL: 
                    break; 
            }
        }
        OSTimeDlyHMSM(0,0,0,500);                 //延時500ms        
    }
}
/*
 * Name                : AppTask2_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void AppTask2_task(void *pdata)
{
    u8 err;
    INT8U *s;

    while(1){
        usart6.printf("The queue size : %d\r\n",((OS_Q*)(TaskQ->OSEventPtr))->OSQEntries);//訊息佇列當前的大小
        s = OSQPend(TaskQ, 100, &err);                                                    //請求訊息佇列
        if(err == OS_ERR_NONE){ 
            usart6.printf("maseege[0] = %d\r\n",s[0]);
            usart6.printf("maseege[1] = %d\r\n",s[1]);
        } 
        OSTimeDlyHMSM(0,0,0,500);                                                         //延時500ms        
    }
}

iCore4連結:

相關文章