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

  • 相关阅读:
    HearthBuddy投降插件2019-11-01的使用
    正则表达式在线分析 regex online analyzer
    Tips to write better Conditionals in JavaScript
    The fileSyncDll.ps1 is not digitally signed. You cannot run this script on the current system.
    Cannot capture jmeter traffic in fiddler
    JMETER + POST + anti-forgery token
    input type color
    HearthBuddy修改系统时间
    What are all the possible values for HTTP “Content-Type” header?
    UDK性能优化
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/8491389.html
Copyright © 2011-2022 走看看