【iCore4 雙核心板_uC/OS-II】例程四:軟體定時器

XiaomaGee發表於2018-02-02

一、實驗說明:

  一些應用程式執行它們的任務時需要延遲一段特定的時間,因此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連結:

相關文章