一、實驗說明:
一些應用程式執行它們的任務時需要延遲一段特定的時間,因此uC/OS-II為我們提供了一些相應的
延時函式,本例程我們使用軟體定時器定時500ms點亮相應的LED實現三色LED迴圈閃爍。
二、實驗截圖:
三、原始碼下載連結:
連結:https://pan.baidu.com/s/1kWFhoXp 密碼:xuc7
四、核心程式碼:
/* * Name : main * Description : --- * Author : zh. * * 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\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(timer_task,(void*)0,(OS_STK*)&TIMER_TASK_STK[TIMER_STK_SIZE-1],TIMER_TASK_PRIO);//建立LED0任務 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 TmrCallback(OS_TMR *ptmr,void *p_arg) { static int counter = 0; /* LED_XX_ON 點亮相應LED LED_XX_OFF 熄滅相應LED 三色LED交替閃爍*/ if(counter % 3 == 0){ LED_RED_ON; LED_GREEN_OFF; LED_BLUE_OFF; }else if(counter % 3 == 1){ LED_RED_OFF; LED_GREEN_ON; LED_BLUE_OFF; }else if(counter % 3 == 2){ LED_RED_OFF; LED_GREEN_OFF; LED_BLUE_ON; } counter ++; }
/* * Name : led0_task * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ void timer_task(void *pdata) { INT8U err; OS_TMR * soft_timer;//軟體定時器 soft_timer = OSTmrCreate(10,10,OS_TMR_OPT_PERIODIC,(OS_TMR_CALLBACK)TmrCallback,0,(INT8U *)"soft_timer",&err);//100ms執行一次 OSTmrStart(soft_timer,&err);//啟動軟體定時器 while(1){ OSTimeDlyHMSM(0,0,0,500);//延時500ms } } /* * 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){ f+=0.1f; //浮點型運算 usart6.printf("float f=%.4f\r\n",f); //串列埠輸出 OSTimeDlyHMSM(0,0,0,500); //延時500ms } }
iCore4連結: