程序需求,需要完成task与task之间 字符数组的数据传输
比如:在ucos中,串口2接收的字符数组是不定时的&不定长的;只有当接收到数据的时候_才将数据赋值给新数组
具体的程序示意如下:
图1:消息邮箱测试中的 向消息邮箱发送消息(OSMboxPost(Str_Box,(void*)rec);//发送消息--(向 消息邮箱_msg_key发送消息) ),实际项目需求的是:串口2接收一帧数据,完整接收并存储与unsigned char rec[100]数组,并将此值放入消息邮箱!!!!!!!!!!!!!!!!!!!!
图2:消息邮箱测试中的 请求消息邮箱,并存储与指针变量并复制字符串(strcpy)
char *s;char *ss; ss=OSMboxPend(Str_Box,10,&err); strcpy(REC,ss); 实际项目需求的是:串口2接收一帧数据是字符型的,那么现在:局部变量通过消息邮箱就能在不同的task之间传输下面给出参考源码:
/*消息邮箱*************************************************************/ OS_EVENT * Str_Box; //--定义TCB指针(邮箱) //char *s;char *ss; int Times=0; u8 err; /*--uCOS的任务*/ OSInit(); OSTaskCreate(start_task, (void *) 0, (OS_STK *) &START_TASK_STK[START_STK_SIZE-1],//--任务堆栈栈顶地址【把数组的指针传递给函数OSTaskCreate中的堆栈栈顶参数ptos】 START_TASK_PRIO ); OSStart(); //起始任务--(并赋予最高优先级_参考P75) void start_task(void *pdata) { OS_CPU_SR cpu_sr=0; //--cpu 状态寄存器 pdata = pdata; //--防止某些编译器报错 /*-Mbox测试*/ Str_Box=OSMboxCreate((void*)0); //--创建消息邮箱(__task之间传递一个数据) OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)--关中断(以下3条为临界段) OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);//--创建一个任务[&LED1_TASK_STK[LED1_STK_SIZE-1]]任务堆栈栈顶地址 OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);//--创建一个任务[&LED1_TASK_STK[LED1_STK_SIZE-1]]任务堆栈栈顶地址 OSTaskSuspend(START_TASK_PRIO); //挂起起始任务---任务在不需要运行的时候应该放弃CPU(挂起),除此之外还有任务延时等策略. OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)--开中断 } char *s;char *ss; /*-Mbox测试*/ OSMboxPost(Str_Box,(void*)rec);//发送消息--(向 消息邮箱_msg_key发送消息) /*-Mbox测试*/ ss=OSMboxPend(Str_Box,10,&err); strcpy(REC,ss); printf("请求消息邮箱数据:%s\r\n",REC);