uCOS中的消息邮箱(:task与task之间传递一个数据(数据缓冲区))

来源:互联网 发布:网络平台商业计划书 编辑:程序博客网 时间:2024/06/05 14:04

程序需求,需要完成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);