一、實驗說明:
訊號量是作業系統中的一類事件,是實現任務間通訊的一箇中間環節。當系統中的多個任務
在執行時,經常需要互相無衝突地訪問同一個資源,或者需要互相支援的依賴,甚至有時還要互
相加以必要的限制的制約才保證任務的順利進行。訊號量就像是一種上鎖機制,一旦執行至上鎖
程式碼段則一直等待,直到獲得相應的鑰匙才能進入被鎖部分的程式碼。使用訊號量的最初目的是為了
給共享資源設立一個標誌,該標誌表示共享資源的佔用情況。當一個任務在訪問共享資源之前,就
可以先對這個標誌進行查詢,從而在瞭解資源被佔用的情況之後,再來準定自己的行為。
二、實驗截圖:
三、原始碼下載連結:
連結:https://pan.baidu.com/s/1eSQ6IXW 密碼:vg2c
四、核心程式碼:
/* * Name : main * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ /*實驗現象: 紅燈和綠燈同時以固定頻率閃爍,開啟串列埠工具,可以看到有資料顯示。 */ int main(void) { system_clock.initialize(); //系統時鐘初始化 led.initialize(); //LED初始化 usart6.initialize(115200); //串列埠初始化 usart6.printf("\x0c"); //清屏 usart6.printf("\033[1;32;40m"); //設定字型終端為綠色 usart6.printf("\r\n Hello, I am iCore4!\r\n\r\n"); 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 : led0_task * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ void AppTask1_task(void *pdata) { u8 err; unsigned char task1_mes[60] = "The first task is running and the red LED is flashing!"; //任務一執行的資訊 while(1){ usart6.printf("\r\n TASK 1:\r"); OSSemPend(TaskSem,0,&err); //請求訊號量 memcpy(array, task1_mes, sizeof(task1_mes)); //將任務一資訊放到共享資源中 usart6.printf("\r\n %s\r",array); OSSemPost(TaskSem); //傳送訊號量 LED_RED_ON; //紅燈亮 OSTimeDlyHMSM(0,0,0,500); //延時500ms LED_RED_OFF; //紅燈滅 OSTimeDlyHMSM(0,0,0,500); //延時500ms } } /* * Name : led_task * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ void AppTask2_task(void *pdata) { u8 err; unsigned char task2_mes[60] = "The second task is running and the green LED is flashing!"; //任務一執行的資訊 while(1){ usart6.printf("\r\n TASK 2:\r"); OSSemPend(TaskSem,0,&err); //請求訊號量 memcpy(array, task2_mes, sizeof(task2_mes));//將任務二資訊放到共享資源中 usart6.printf("\r\n %s\r",array); OSSemPost(TaskSem); //傳送訊號量 LED_GREEN_ON; //綠燈亮 OSTimeDlyHMSM(0,0,0,1000); //延時1000ms LED_GREEN_OFF; //綠燈滅 OSTimeDlyHMSM(0,0,0,1000); //延時1000ms } }
iCore4連結: