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

程序需求,需要完成task与task之间  字符数组的数据传输

比如:在ucos中,串口2接收的字符数组是不定时的&不定长的;只有当接收到数据的时候_才将数据赋值给新数组

具体的程序示意如下:

uCOS中的消息邮箱(:task与task之间传递一个数据(数据缓冲区))_第1张图片

图1:消息邮箱测试中的     向消息邮箱发送消息(OSMboxPost(Str_Box,(void*)rec);//发送消息--(向 消息邮箱_msg_key发送消息) ),实际项目需求的是:串口2接收一帧数据,完整接收并存储与unsigned char rec[100]数组,并将此值放入消息邮箱!!!!!!!!!!!!!!!!!!!!

uCOS中的消息邮箱(:task与task之间传递一个数据(数据缓冲区))_第2张图片

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


你可能感兴趣的:(STM32接收)