• 【iCore4 双核心板_uC/OS-II】例程三:任务的挂起与恢复


    一、实验说明:

      当一个任务正在运行的时候,由于某种情况可能需要终止运行一段时间,终止的这段时间就是

    所谓的任务的挂起,可以由该任务自身或者其他任务来挂起一个任务。当被挂起的任务需要再次运

    行的时候,可以恢复被挂起的任务。本实验中红灯和绿灯以固定频率闪烁,当任务寄存器的值达到5

    的时候,挂起绿灯闪烁任务,只剩下红灯闪烁,当任务寄存器的值达到10的时候,被挂起的绿灯闪

    烁任务恢复,红灯和绿灯又同时闪烁,如此循环往复。

    二、实验截图:

    三、源代码下载链接:

    链接:https://pan.baidu.com/s/1nwdjym1 密码:ugo5

    四、核心代码:

    /*
     * 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("33[1;32;40m");                          //设置字体终端为绿色
        usart6.printf("
    Hello, I am iCore4!
    
    ");
    
        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.
    ");
            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.
    ");
            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.
    ");
            f+=0.1f;                                 //浮点型运算
            usart6.printf("float f=%.4f
    ",f);     //串口输出
            OSTimeDlyHMSM(0,0,0,1000);               //延时1000ms
        }
    }

    iCore4链接:

  • 相关阅读:
    Luogu1309 瑞士轮(分治,归并排序)
    HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)
    Luogu 1220 关路灯(动态规划)
    HDU 2087 剪花布条(字符串匹配,KMP)
    HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP)
    HDU 1711 Number Sequence (字符串匹配,KMP算法)
    Luogu 3375 【模板】KMP字符串匹配(KMP算法)
    KMP算法(研究总结,字符串)
    CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)
    Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/8397378.html
Copyright © 2020-2023  润新知