【iCore4 雙核心板_uC/OS-II】例程三:任務的掛起與恢復

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連接:

相關文章
相關標籤/搜索