1、實驗說明:數據結構
在實際應用中,任務經常須要與多個事件同步,即要根據多個信號量組合做用的結果來決定任務的運行方式。UCOSII爲了實現多個信號量組合的功能定義了一種特殊的數據結構——信號量集。工具
2、實驗截圖:字體
3、源代碼下載連接:spa
連接:https://pan.baidu.com/s/13USFy25QX-e3WjFGmGClfA 密碼:jgmjcode
4、核心代碼:htm
/* * Name : main * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ /*實驗現象: 打開串口工具putty.exe,按下按鍵ARM.KEY,終端顯示信號量集的狀態;鬆開按鍵,中止顯示。 信號量的16位分別循環置1。 */ 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) { u8 err; OS_CPU_SR cpu_sr; TaskFlag = OSFlagCreate(0,&err);//建立信號量集 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; while(1){ if(ARM_KEY_STATE == KEY_DOWN){ //按鍵按下 i++; if(i < OS_FLAGS_NBITS){ OSFlagPost(TaskFlag,i,OS_FLAG_SET,&err); //設置第0位的信號爲1 }else{ i=0; } } 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; u16 flag; while(1){ flag = OSFlagQuery(TaskFlag,&err); //查詢信號量集的狀態 if(flag != 0){ usart6.printf("The %d bit is set to high.\r\n",flag); OSFlagPost(TaskFlag,(OS_FLAGS)flag,OS_FLAG_CLR,&err);//信號置0 } OSTimeDlyHMSM(0,0,0,500); //延時500ms } }
iCore4連接:blog