首要音讯行列相似与计数信号量,能够对异步事情进行保存,可是计数信号量保存的是状况量,他仅仅在一个变量里进行状况触发数目的累加,而音讯行列能够把发送来的数据进行保存,一起音讯行列同音讯邮箱有相同的特点,它本身并不传送数据,仅仅传递内存中已有数据的地址值即数据指针,这就带来了一个要害特性便是被传递的每一个数据都是要有独立地址的,否则没有被处理的数据就会被新数据给覆盖掉,形成了数据的丢掉。
关于音讯行列,需求创立一个行列,这个行列有先入先出的特性即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里有自己的内存办理函数,假如你不必那个的话就只能自己树立一个数据,而且确保每个发送出去的数据都有他的地址。
假如需求代码请留下邮箱,有不对的地方请我们批评指正,转载请注明出处。