微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 uCOS_II 实践 之 消息对列

STM32 uCOS_II 实践 之 消息对列

时间:12-03 来源:互联网 点击:
首先消息队列类似与计数信号量,可以对异步事件进行保存,但是计数信号量保存的是状态量,他只是在一个变量里进行状态触发数目的累加,而消息队列可以把发送来的数据进行保存,同时消息队列同消息邮箱有相同的属性,它本身并不传送数据,只是传递内存中已有数据的地址值即数据指针,这就带来了一个关键特性就是被传递的每一个数据都是要有独立地址的,不然没有被处理的数据就会被新数据给覆盖掉,造成了数据的丢失。

对于消息队列,需要创建一个队列,这个队列有先入先出的特性即FIFO,所以一旦数据被使用在队列里这个数据就不再出现了,他最终会被新的数据覆盖掉。

如上面介绍,消息队列里所有的数据都以数据指针的形式在一个列表里排队,这个指针的形式可以是多样的,可以是一个变量的指针,也可以是一个结构类型的指针等等。所以队列的个数是有限的,在设计过程中要保证其大小合适不然很容易队列溢出,造成数据丢失。同时消息队列传输的数据是无限制的,只要保证消耗数据与发送数据的吞吐量保证合适就不会造成队列溢出。

使用消息队列有5个步骤:

步骤1:声明一个指针变量,这个指针的作用和消息邮箱一样,为了保存对应事件控制块的指针。

void *MboxQ_Task_LED1;

步骤2:声明一个指针数组,这个数组就是用来排队的队列。

void *MboxQ_Table[10];

步骤3:对消息队列初始化,初始化函数有两个参数,第一个参数为队列的头指针,指明由哪里开始排队,第二个参数是队列的数目,即队列的深度。该函数也是对事件控制块进行初始化,并且把其指针赋值给步骤1声明的指针变量。

MboxQ_Task_LED1 = OSQCreate(&MboxQ_Table[0],10);

步骤4:在任务中设置消息等待函数,此处和消息邮箱一致。参数有3个,第一个参数指等待的是哪个消息队列,第二个参数是指等待时间,单位为系统心跳,0为始终等待无时间限制,第三个参数指函数的返回结果。

num = *(unsigned char *)OSQPend(MboxQ_Task_LED1,0,&err);

步骤5:在任务里设置消息发送函数,此处和消息邮箱一致。参数有2个,第一个参数为发送大哪个消息队列里,第二个参数是指具体的数据地址发送出去。

OSQPost(MboxQ_Task_LED1,(void *)&DataTable[cc++]);

下面是具体的代码:
步骤3和步骤4:

void Task_LED1(void* p_arg)
{
unsigned char num ;
static unsigned char pp ;
(void) p_arg ;

MboxQ_Task_LED1 = OSQCreate(&MboxQ_Table[0],10); // 创建消息队列,栈数目为10
while(1)
{
num = *(unsigned char *)OSQPend(MboxQ_Task_LED1,0,&err); // 等待邮箱的消息
pp = num ;

if(pp == 1)
{ LED1_HIGH; }
if(pp == 2)
{ LED2_HIGH; }
if(pp == 3)
{ LED3_HIGH; }
if(pp == 4)
{ LED1_HIGH;LED2_HIGH; }
if(pp == 5)
{ LED1_HIGH;LED3_HIGH; }

OSTimeDlyHMSM(0,0,5,0);
LED1_LOW;LED2_LOW;LED3_LOW;
}
}


步骤5:

void Interrupt_Handle_KEY3(void)
{
OSIntEnter();

// 在中断服务函数里如果调用ucos系统函数的话就必须加上进中断系统函数出去的时候要加上出中断系统函数

OSQPost(MboxQ_Task_LED1,(void *)&DataTable[cc++]);

// 发送邮箱消息,这个函数并不会引起系统调度,所以中断服务函数一定要简洁。
EXTI_ClearITPendingBit(EXTI_Line3); // 清除标志位

OSIntExit();
}

对于数据在发送的时候转换成无定义变量的指针,在接受的时候转换成它本来的数据类型,这点和消息邮箱是相同的。
值得注意的是在ucos里有自己的内存管理函数,如果你不用那个的话就只能自己建立一个数据,并且保证每个发送出去的数据都有他的地址。
如果需要代码请留下邮箱,有不对的地方请大家批评指正,转载请注明出处。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top