[应用相关]

(转)ucos-ii示例5:消息队列测试

[复制链接]
431|1
手机看帖
扫描二维码
随时随地手机跟帖
木木guainv|  楼主 | 2018-8-16 10:06 | 显示全部楼层 |阅读模式

本文博客链接:http://blog.csdn.net/jdh99.


环境:

主机:WIN8

开发环境:MDK4.72

ucgui版本:3.90

ucos版本:ucos-ii

mcu: stm32f103VE


说明:

本示例中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);



  •         }



  • }



mmuuss586| | 2018-9-5 09:39 | 显示全部楼层
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

3820

帖子

5

粉丝