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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM