一、實驗說明:
訊號量是一個多工核心提出的一個協議機構,上一個實驗中我們介紹了訊號量訪問共享資源
的功能,其實訊號量最初是用來控制訪問共享資源的,它還可以用來同步一箇中斷服務函式和一個任
務,或者同步一個任務和另一個任務。
二、實驗截圖:
三、原始碼下載連結:
連結:https://pan.baidu.com/s/1bpUaFmB 密碼:dwre
四、核心程式碼:
/* * Name : main * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ /*實驗現象: 開啟串列埠工具putty.exe,終端顯示此時訊號量的值為0,按下ARM.KEY後,訊號量的值每隔500ms增加1, 當鬆開ARM.KEY後,訊號量的值開始減小,綠色ARM.LED開始閃爍,知道訊號量的值減小為0,綠色LED熄滅。 */ int main(void) { system_clock.initialize(); //系統時鐘初始化 led.initialize(); //LED初始化 usart6.initialize(115200); //串列埠初始化 key.initialize(); 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; TaskSem = OSSemCreate(1);//建立訊號量 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) { while(1){ if(ARM_KEY_STATE == KEY_DOWN){ OSSemPost(TaskSem); //傳送訊號量 } usart6.printf("\x0c"); //清屏 usart6.printf("\033[1;32;40m"); //設定字型終端為綠色 usart6.printf("\r\n Hello, I am iCore4!\r\n\r"); usart6.printf("\r\n The value of Sem: %d\r",TaskSem->OSEventCnt);//列印出訊號量的值 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; while(1){ if(ARM_KEY_STATE == KEY_UP){ OSSemPend(TaskSem,0,&err); //請求訊號量 LED_GREEN_ON; //綠燈亮 OSTimeDlyHMSM(0,0,0,500); //延時500ms LED_GREEN_OFF; //綠燈滅 OSTimeDlyHMSM(0,0,0,500); //延時500ms }else{ OSTimeDlyHMSM(0,0,0,500); //延時1000ms } } }
iCore4連結: