一、實驗說明:
前面介紹通過資訊傳遞可以進行任務間的交流,資訊也可以直接傳送給一個任務,在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連結: