zoukankan      html  css  js  c++  java
  • 【iCore4 双核心板_uC/OS-II】例程九:消息队列

    一、实验说明:

      前面介绍通过信息传递可以进行任务间的交流,信息也可以直接发送给一个任务,在uC/OS-II中每一个任务在它们内部都有一个消息队列,也即任务消息队列,用户可以直接给一个任务发送消息,不需要额外的消息队列,这样不公优化了代码,而且比用一个单独的外部消息队列更有效率。任务消息队列建立在每一个任务的内部,如下图。

    二、实验截图:

    三、源代码下载链接:

    链接:https://pan.baidu.com/s/1ggDoXYr 密码:lm3y

    四、核心代码:

    /*
     * Name                : main
     * Description         : ---
     * Author              : liu.
     *
     * History
     * --------------------
     * Rev                 : 0.00
     * Date                : 07/12/2017
     * 
     * create.
     * --------------------
     */
    /*实验现象:
      打开串口工具putty.exe,终端显示当前消息队列大小,按下ARM.KEY按键,
      显示消息队列大小和消息。
      */
    int main(void)
    {
        system_clock.initialize();                               //系统时钟初始化
        led.initialize();                                        //LED初始化
        usart6.initialize(115200);                               //串口初始化
        key.initialize();
    
        usart6.printf("x0c");                                   //清屏    
        usart6.printf("33[1;32;40m");                          //设置字体终端为绿色
        usart6.printf("
     Hello, I am iCore4!
    
    ");
        LED_RED_ON;
    
        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;
    
        TaskQ = OSQCreate(&msg[0], 10);//创建消息队列
    
        OSStatInit();//初始化统计任务
    
        OS_ENTER_CRITICAL();//关中断
    
        OSTaskCreate(AppTask1_task,(void*)0,(OS_STK*)&AppTask1_TASK_STK[AppTask1_STK_SIZE-1],AppTask1_TASK_PRIO);//创建AppTask1任务
        OSTaskCreate(AppTask2_task,(void*)0,(OS_STK*)&AppTask2_TASK_STK[AppTask2_STK_SIZE-1],AppTask2_TASK_PRIO);//创建AppTask2任务
        OSTaskSuspend(OS_PRIO_SELF);//挂起start_task任务
    
        OS_EXIT_CRITICAL();//开中断
    }
    /*
     * Name                : AppTask1_task
     * Description         : ---
     * Author              : liu.
     *
     * History
     * --------------------
     * Rev                 : 0.00
     * Date                : 07/12/2017
     * 
     * create.
     * --------------------
     */
    void AppTask1_task(void *pdata)
    {
        u8 err;
        int i = 0;
        INT8U buf[2];
    
        while(1){
            i++;
            buf[0] = i;
            buf[1] = i + 1;
            if(ARM_KEY_STATE == KEY_DOWN){           //按键按下
                err = OSQPost(TaskQ, (void *)&buf[0]);//发送消息队列
                switch(err){ 
                    case OS_ERR_NONE: 
                        break; 
                    case OS_ERR_Q_FULL: 
                        break; 
                }
            }
            OSTimeDlyHMSM(0,0,0,500);                 //延时500ms        
        }
    }
    /*
     * Name                : AppTask2_task
     * Description         : ---
     * Author              : liu.
     *
     * History
     * --------------------
     * Rev                 : 0.00
     * Date                : 07/12/2017
     * 
     * create.
     * --------------------
     */
    void AppTask2_task(void *pdata)
    {
        u8 err;
        INT8U *s;
    
        while(1){
            usart6.printf("The queue size : %d
    ",((OS_Q*)(TaskQ->OSEventPtr))->OSQEntries);//消息队列当前的大小
            s = OSQPend(TaskQ, 100, &err);                                                    //请求消息队列
            if(err == OS_ERR_NONE){ 
                usart6.printf("maseege[0] = %d
    ",s[0]);
                usart6.printf("maseege[1] = %d
    ",s[1]);
            } 
            OSTimeDlyHMSM(0,0,0,500);                                                         //延时500ms        
        }
    }

    iCore4链接:

  • 相关阅读:
    010-你觉得单元测试可行吗
    跳台阶
    斐波那契数列
    旋转数组的最小数字
    用两个栈实现队列
    重建二叉树
    从尾到头打印链表
    替换空格
    二维数组中的查找
    Best Time to Buy and Sell Stock III
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/8491389.html
Copyright © 2011-2022 走看看