1、實驗說明:字體
當一個任務正在運行的時候,因爲某種狀況可能須要終止運行一段時間,終止的這段時間就是spa
所謂的任務的掛起,能夠由該任務自身或者其餘任務來掛起一個任務。當被掛起的任務須要再次運code
行的時候,能夠恢復被掛起的任務。本實驗中紅燈和綠燈以固定頻率閃爍,當任務寄存器的值達到5htm
的時候,掛起綠燈閃爍任務,只剩下紅燈閃爍,當任務寄存器的值達到10的時候,被掛起的綠燈閃blog
爍任務恢復,紅燈和綠燈又同時閃爍,如此循環往復。ip
2、實驗截圖:get
3、源代碼下載連接:it
連接:https://pan.baidu.com/s/1nwdjym1 密碼:ugo5io
4、核心代碼:class
/* * Name : main * Description : --- * Author : zh. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ /*實驗現象: 最開始紅燈和綠燈同時以固定頻率閃爍,當任務寄存器的值達到5的時候, 掛起綠燈閃爍任務,只剩紅燈閃爍;當任務寄存器值達到10的時候,被掛 起的綠燈閃爍任務恢復,紅燈和綠燈又同時閃爍,如此循環往復。 */ int main(void) { system_clock.initialize(); //系統時鐘初始化 led.initialize(); //LED初始化 usart6.initialize(115200); //串口初始化 usart6.printf("\x0c"); //清屏 usart6.printf("\033[1;32;40m"); //設置字體終端爲綠色 usart6.printf("\r\nHello, 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; OSStatInit();//初始化統計任務 OS_ENTER_CRITICAL();//關中斷 OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);//建立LED0任務 OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);//建立LED1任務 OSTaskCreate(usart_task,(void*)0,(OS_STK*)&USART_TASK_STK[USART_STK_SIZE-1],USART_TASK_PRIO);//建立usart任務 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 led0_task(void *pdata) { INT8U err; //定義錯誤類型 INT8U value; //定義寄存器的值 while(1){ usart6.printf("The task1 is running.\r\n"); value = OSTaskRegGet ( 0, 0, & err ); //獲取該任務寄存器的值 if( value < 10 ){ OSTaskRegSet ( 0, 0, ++ value, & err );//寄存器的值加一 }else{ OSTaskRegSet ( 0, 0, 0, & err ); //寄存器值置零 OSTaskResume (LED1_TASK_PRIO); //恢復綠燈LED閃爍的任務 } 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 led1_task(void *pdata) { INT8U err; //定義錯誤類型 INT8U value; //定義寄存器的值 while(1){ usart6.printf("The task2 is running.\r\n"); value = OSTaskRegGet ( 0, 0, & err ); //獲取該任務寄存器的值 if ( value < 10 ){ OSTaskRegSet ( 0, 0, ++ value, & err );//寄存器的值加一 }else{ OSTaskRegSet ( 0, 0, 0, & err ); //任務寄存器清0 //寄存器值置零 OSTaskSuspend (LED1_TASK_PRIO); //掛起自身任務 //掛起自身任務 } LED_GREEN_ON; //綠燈亮 OSTimeDlyHMSM(0,0,0,1000); //延時1000ms LED_GREEN_OFF; //綠燈滅 OSTimeDlyHMSM(0,0,0,1000); //延時1000ms } } /* * Name : usart_task * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ void usart_task(void *pdata) { double f=0.1; while(1){ usart6.printf("The task3 is running.\r\n"); f+=0.1f; //浮點型運算 usart6.printf("float f=%.4f\r\n",f); //串口輸出 OSTimeDlyHMSM(0,0,0,1000); //延時1000ms } }
iCore4連接: