1、實驗說明:工具
信號量是操做系統中的一類事件,是實現任務間通訊的一箇中間環節。當系統中的多個任務字體
在運行時,常常須要互相無衝突地訪問同一個資源,或者須要互相支持的依賴,甚至有時還要互spa
相加以必要的限制的制約才保證任務的順利進行。信號量就像是一種上鎖機制,一旦執行至上鎖操作系統
代碼段則一直等待,直到得到相應的鑰匙才能進入被鎖部分的代碼。使用信號量的最初目的是爲了code
給共享資源設立一個標誌,該標誌表示共享資源的佔用狀況。當一個任務在訪問共享資源以前,就htm
能夠先對這個標誌進行查詢,從而在瞭解資源被佔用的狀況以後,再來準定本身的行爲。blog
2、實驗截圖:事件
3、源代碼下載連接:ip
連接:https://pan.baidu.com/s/1eSQ6IXW 密碼:vg2c資源
4、核心代碼:
/* * 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連接: