zoukankan      html  css  js  c++  java
  • UCOSII使用之消息队列

    1消息队列

    说明:

    本示例中task1时间片为1s,task2时间片为8s。task1每秒往消息队列写入1个数据,task2全部读取出来。所以task2每次能读到8个数据。

     注意:

    1.消息队列需要一个指针数组指向消息

    2.应该有一个固定的消息数组存储消息,不应将局部变量填入发送消息函数

    3.QSQPost为先进先出函数(FIFO),QSQPostFornt为后进先出函数(LIFO)

    #define TASK_STK_SIZE        512
                    
    /*********************************************************************
    *                            静态函数
    **********************************************************************/
    
    static void task_start(void *pdata);
    static void task1(void *pdata);
    static void task2(void *pdata);
    
    /*********************************************************************
    *                            静态变量
    **********************************************************************/
    
    /*********************************************************************
    *                            任务堆栈空间
    **********************************************************************/
    
    static OS_STK Task_Start_Stk[TASK_STK_SIZE];
    static OS_STK Task1_Stk[TASK_STK_SIZE];
    static OS_STK Task2_Stk[TASK_STK_SIZE];
    
    /*********************************************************************
    *                            信号量
    **********************************************************************/
    
    OS_EVENT *Semaphore;
    
    /*********************************************************************
    *                            消息队列数组
    **********************************************************************/
    
    void *Msg_Group[10];
    
    char Msg_Arr[10][30];
    uint8_t Index_Msg_Arr = 0;
    
    /*********************************************************************
    *                            函数
    **********************************************************************/
    
    int main(void)
    {    
        //初始化内核
        OSInit();
        //创建任务
        OSTaskCreate(task_start,(void *)0,Task_Start_Stk + TASK_STK_SIZE - 1,10);
        
        //启动任务
        OSStart();
    }
    
    /*********************************************************************
    *                            任务函数
    **********************************************************************/
    
    static void task_start(void *pdata)
    {    
        //载入世界
        world_load();
        
        //设置背景色
        GUI_SetBkColor(0xb07c17);
        GUI_Clear();
        GUI_SetColor(GUI_BLACK);
        
        Semaphore = OSQCreate(Msg_Group,10);
        
        //新建任务
        OSTaskCreate(task1,(void *)0,Task1_Stk + TASK_STK_SIZE - 1,11);
        OSTaskCreate(task2,(void *)0,Task2_Stk + TASK_STK_SIZE - 1,12);
        
        while(1)
        {
            OSTimeDlyHMSM(0,0,3,0);
        }
    }
    
    static void task1(void *pdata)
    {
        char str[30] = {0};
        uint8_t err = 0;
        char *mail;
        uint8_t i = 0;
        OS_Q_DATA query;
    
    
        while(1)
        {
            //打印接收的消息
            OSQQuery(Semaphore,&query);
            for (i = 0;i < query.OSNMsgs;i++)
            {
                //请求信号量
                mail = OSQPend(Semaphore,0,&err);
                //显示
                sprintf(str,"task1 receive:%s",mail);
                GUI_DispStringHCenterAt(str, 120, 40 + i * 20);
            }
            
            //显示
            sprintf(str,"task1 time:%ds",OSTimeGet());
            GUI_DispStringHCenterAt(str, 120, 5);
            WM_Exec();
            OSTimeDlyHMSM(0,0,8,0);
        }
    }
    
    static void task2(void *pdata)
    {
        char str[30] = {0};
    
        while(1)
        {
            //显示
            sprintf(*(Msg_Arr + Index_Msg_Arr),"task2 send:%ds",OSTimeGet());
            //发送信号量
            OSQPost(Semaphore,*(Msg_Arr + Index_Msg_Arr));
            Index_Msg_Arr++;
            if (Index_Msg_Arr >= 10)
            {
                Index_Msg_Arr = 0;
            }
            
            //显示
            sprintf(str,"task2 time:%ds",OSTimeGet());
            GUI_DispStringHCenterAt(str, 120, 20);
            WM_Exec();
            OSTimeDlyHMSM(0,0,1,0);
        }
    }

     2信号量集

    本示例中task2设置信号量集的最后2位为1,task1读取最后2位,发现是1则显示

    来源

    #define TASK_STK_SIZE        512
                    
    /*********************************************************************
    *                            静态函数
    **********************************************************************/
    
    static void task_start(void *pdata);
    static void task1(void *pdata);
    static void task2(void *pdata);
    
    /*********************************************************************
    *                            静态变量
    **********************************************************************/
    
    /*********************************************************************
    *                            任务堆栈空间
    **********************************************************************/
    
    static OS_STK Task_Start_Stk[TASK_STK_SIZE];
    static OS_STK Task1_Stk[TASK_STK_SIZE];
    static OS_STK Task2_Stk[TASK_STK_SIZE];
    
    /*********************************************************************
    *                            信号量集
    **********************************************************************/
    
    OS_FLAG_GRP *Semaphore;
    
    /*********************************************************************
    *                            消息队列数组
    **********************************************************************/
    
    void *Msg_Group[10];
    
    char Msg_Arr[10][30];
    uint8_t Index_Msg_Arr = 0;
    
    /*********************************************************************
    *                            函数
    **********************************************************************/
    
    int main(void)
    {    
        //初始化内核
        OSInit();
        //创建任务
        OSTaskCreate(task_start,(void *)0,Task_Start_Stk + TASK_STK_SIZE - 1,10);
        
        //启动任务
        OSStart();
    }
    
    /*********************************************************************
    *                            任务函数
    **********************************************************************/
    
    static void task_start(void *pdata)
    {    
        uint8_t err = 0;
        
        //载入世界
        world_load();
        
        //设置背景色
        GUI_SetBkColor(0xb07c17);
        GUI_Clear();
        GUI_SetColor(GUI_BLACK);
        
        //信号量集初始化为0
        Semaphore = OSFlagCreate((OS_FLAGS)0,&err);
        
        //新建任务
        OSTaskCreate(task1,(void *)0,Task1_Stk + TASK_STK_SIZE - 1,11);
        OSTaskCreate(task2,(void *)0,Task2_Stk + TASK_STK_SIZE - 1,12);
        
        while(1)
        {
            OSTimeDlyHMSM(0,0,3,0);
        }
    }
    
    static void task1(void *pdata)
    {
        char str[30] = {0};
        uint8_t err = 0;
    
        while(1)
        {
            //等待信号集满足条件
            OSFlagPend(Semaphore,(OS_FLAGS)0x3,OS_FLAG_WAIT_SET_ALL | OS_FLAG_CONSUME,0,&err);
            
            //显示
            sprintf(str,"task1 time:%ds",OSTimeGet());
            GUI_DispStringHCenterAt(str, 120, 5);
            WM_Exec();
            OSTimeDlyHMSM(0,0,1,0);
        }
    }
    
    static void task2(void *pdata)
    {
        char str[30] = {0};
        uint8_t err = 0;
    
        while(1)
        {
            //将末两位置1
            OSFlagPost(Semaphore,(OS_FLAGS)0x3,OS_FLAG_SET,&err);
            
            //将最后1位置1
            //OSFlagPost(Semaphore,(OS_FLAGS)0x1,OS_FLAG_SET,&err);
            
            //显示
            sprintf(str,"task2 time:%ds",OSTimeGet());
            GUI_DispStringHCenterAt(str, 120, 20);
            WM_Exec();
            OSTimeDlyHMSM(0,0,3,0);
        }
    }
  • 相关阅读:
    物理分辨率与逻辑分辨率,pt与px
    JBPM学习(四):执行流程实例
    JBPM学习(三):管理流程定义
    JBPM学习(二):ProcessEngine与Service API
    JBPM学习(一):实现一个简单的工作流例子全过程
    jbpm与spring hibernate struts整合
    代理模式 自己写的
    java反射与代理模式
    使用freemarker生成html
    freemarker 数字,字符的操作
  • 原文地址:https://www.cnblogs.com/legion/p/7844351.html
Copyright © 2011-2022 走看看