分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

               


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


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机: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)


效果图:

ucos-ii示例5 消息队列测试


源码:

#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 = 0char *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); }}



           

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

相关文章: