【iCore4 雙核心板_uC/OS-II】例程二:任務的建立與刪除

XiaomaGee發表於2018-01-30

一、實驗說明:

  本例程建立三個任務,通過任務暫存器來實現任務的建立與刪除功能。紅燈和綠燈同時以固定

頻率閃爍,當任務暫存器為5時,刪除綠燈閃爍的任務LED1,此時只有紅燈閃爍,當任務暫存器的

值為10時,建立綠燈閃爍任務,紅綠燈又開始同時閃爍,如此迴圈往復執行。

二、原始碼下載連結:

連結:https://pan.baidu.com/s/1c39VF4c 密碼:zhkb

三、核心程式碼:

/*
 * Name                : main
 * Description         : ---
 * Author              : zh.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
/*實驗現象:
  紅燈和綠燈同時以固定頻率閃爍;當任務暫存器為5時,刪除綠燈閃爍的任務LED1,
  此時只有紅燈閃爍;當任務暫存器的值為10時,建立綠燈閃爍任務,紅綠燈又開始
  同時閃爍;如此迴圈往復的執行。
  */
int main(void)
{
    system_clock.initialize();                               //系統時鐘初始化
    led.initialize();                                        //LED初始化
    usart6.initialize(115200);                               //串列埠初始化

    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 = 0;                         //定義暫存器的值

    while(1){
        value = OSTaskRegGet ( 0, 0, & err );     //獲取該任務暫存器的值
        if ( value < 10 ){
            OSTaskRegSet ( 0, 0, ++ value, & err );//暫存器的值加一
            if(value == 5){
                OSTaskDelReq(LED1_TASK_PRIO);     //傳送刪除LED1任務請求,任務睡眠,無法恢復
            }else if(value == 10){
                OSTaskRegSet ( 0, 0, 0, & err );  //暫存器值置零
                OSTaskCreate(led1_task,
                        (void*)0,
                        (OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],
                        LED1_TASK_PRIO);         //建立LED1任務
            }
        }
        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)
{
    while(1){
        if(OSTaskDelReq(OS_PRIO_SELF)==OS_ERR_TASK_DEL_REQ){//判斷是否有刪除任務的請求  
            OSTaskDel(OS_PRIO_SELF);                        //刪除任務本身TaskLed
        }
        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){
        f+=0.1f;                                 //浮點型運算
        usart6.printf("float f=%.4f\r\n",f);     //串列埠輸出
        OSTimeDlyHMSM(0,0,0,500);                //延時500ms
    }
}

 

iCore4連結:

相關文章