zoukankan      html  css  js  c++  java
  • 【iCore4 双核心板_uC/OS-II】例程二:任务的建立与删除

    一、实验说明:

      本例程建立三个任务,通过任务寄存器来实现任务的建立与删除功能。红灯和绿灯同时以固定

    频率闪烁,当任务寄存器为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
    ",f);     //串口输出
            OSTimeDlyHMSM(0,0,0,500);                //延时500ms
        }
    }

    iCore4链接:

  • 相关阅读:
    【ASP.Net MVC3 】使用Unity 实现依赖注入
    小菜学习设计模式(五)—控制反转(Ioc)
    ASP.NET MVC中使用Unity Ioc Container
    Unity依赖注入使用详解
    单例模式实现
    Oracle书籍资料链接——更新ing
    eclipse设置控制台字体大小
    eclipse——反编译插件
    java.lang.String里面的trim()方法——删除首尾空格
    java关键词整理——思维导图
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/8383571.html
Copyright © 2011-2022 走看看