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);
    }
}

 

posted on 2017-11-16 14:51  legion  阅读(6652)  评论(0编辑  收藏  举报

导航