您的位置 首页 新能源

STM32 uCOS_II 实践 之 音讯邮箱

所谓的消息邮箱并不是把数据进行传输,而是在合适的时间告诉任务去使用哪些变量或者当一些特殊的变量变化后可以及时并准确的使用变量,消息…

所谓的音讯邮箱并不是把数据进行传输,而是在适宜的时刻告知使命去运用哪些变量或许当一些特别的变量改变后能够及时并精确的运用变量,音讯邮箱传递的是这些变量的指针,而这些变量自身就现已存在与内存中了,他们多以全局变量或许静态变量的方法存在。

首要介绍音讯邮箱的一种运用方法,便是只传递一个非空指针,告知等候音讯的使命他等候的时刻到了,可是这个指针里并没有有用的数据,而使命中也不应该对这个地址指向的变量进行任何的读取和写入操作,读写操作都是无含义的,从别的一个视点来看,尽管借用了他人的地址可是自身并没有对地址里的数据进行操作,所以地址里的数据也是安全的,说白了便是音讯邮箱版信号量(非计数)。它的优点便是能够在体系里把信号量有关的代码给裁剪掉,但缺陷是他并无法到达信号量的悉数功用,这种用法无法进行计数,仅仅单纯的传递一次状况。假如把音讯行列改形成计数信号量,个人觉得很没必要,除非你选的MCU十分的为难。姑且就让这种方法作为开始了解音讯邮箱的一个引子吧。

运用音讯邮箱能够分为4个过程:

过程1:声明一个指针变量,这个指针变量在初始化音讯邮箱的时分会把这个音讯邮箱对应的事情操控块的指针寄存进去。


void *Mbox_Task_LED1;

过程2:对音讯邮箱进行初始化,也便是初始化对应的事情操控块,而且会把这个事情操控块的指针作为回来值赋值给第一步声明的指针变量。音讯邮箱初始化函数有一个参数,应该设置为空指针,表明音讯邮箱为空。


Mbox_Task_LED1 = OSMboxCreate((void *)0);


过程3:在使命里设置等候音讯函数,当这个使命履行到这句话的时分,体系会把这个使命挂起,等候有音讯的发送。这个函数里有3个变量,第一个参数是指等候的是哪个音讯邮箱,第二个参数是指等候时刻单位为体系心跳,0指无时刻期限的等候,第三个参数为回来的过错类型。


OSMboxPend(Mbox_Task_LED1,0,&err);

过程4:在其他的使命里或许中止服务程序里设置发送音讯函数,需求留意的是,这个函数并不会引起体系调度,所以假如把它放在中止服务函数里的话就要去中止里的内容尽量简略,以确保音讯发送出去后,能进来快的进行体系调度让音讯承受函数相应。在这个函数里有2个参数,第一个参数为要发送给哪个音讯邮箱,第二个参数为发送的数据的地址。在这里其实并没有实在的数据,仅仅把发送的地址用了一个非空地址,这个地址及其指向的数据都没有任何含义,也不需求进行任何的读写操作,仅仅传递一个音讯到相应的等候函数,以免除对应使命的挂起状况。


OSMboxPost(Mbox_Task_LED1,(void *)1);

下面看下详细的代码:
过程2和过程3:


void Task_LED1(void* p_arg)
{
(void) p_arg ;

Mbox_Task_LED1 = OSMboxCreate((void *)0); // 创立音讯邮箱,初值为空指针
while(1)
{
OSMboxPend(Mbox_Task_LED1,0,&err); // 等候邮箱的音讯

LED1_HIGH;
OSTimeDlyHMSM(0,0,1,0);
LED1_LOW;
OSTimeDlyHMSM(0,0,1,0); // 延时,用来给其他使命留有运转的时刻
}
}

过程4:


void Interrupt_Handle_KEY3(void)
{
OSIntEnter();

// 在中止服务函数里假如调用ucos体系函数的话就必须加进步中止体系函数出去的时分要加上出中止体系函数

OSMboxPost(Mbox_Task_LED1,(void *)1);

// 发送邮箱音讯,这个函数并不会引起体系调度,所以中止服务函数一定要简练。
EXTI_ClearITPendingBit(EXTI_Line3); // 铲除标志位

OSIntExit();
}


=======================================================================================================
下面说下传递一个实在的变量,过程和上面是相同的,只不过在过程3和过程4的当地会有对变量的转化。代码如下:
过程2和过程3:


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

Mbox_Task_LED1 = OSMboxCreate((void *)0); // 创立音讯邮箱,初值为空指针
while(1)
{
num = *(unsigned char *)OSMboxPend(Mbox_Task_LED1,0,&err); // 等候邮箱的音讯
pp = num; // 这个变量用于仿真时数据监测
while(pp–)
{
LED1_HIGH;
OSTimeDlyHMSM(0,0,0,200);
LED1_LOW;
OSTimeDlyHMSM(0,0,0,200);
}
}
}

过程4:


void Interrupt_Handle_KEY3(void)
{
OSIntEnter();

// 在中止服务函数里假如调用ucos体系函数的话就必须加进步中止体系函数出去的时分要加上出中止体系函数

OSMboxPost(Mbox_Task_LED1,(void *)&Num);

// 发送邮箱音讯,这个函数并不会引起体系调度,所以中止服务函数一定要简练。
EXTI_ClearITPendingBit(EXTI_Line3); // 铲除标志位

OSIntExit();
}


如过程4赤色注释部分,在发送的时分把一个详细的变量取地址,而且强制转化为一个无界说变量的指针;在过程3赤色注释部分,在等候函数外部首要进行的时分变量类型的转化,转化成一个无符号字符型变量的指针,然后在进行间指操作,把地址里的数据取出来,最终赋值给函数的暂时变量进行运用。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/252254.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部