Step1、创建邮箱:OSMboxCreate()
说明:
1.创建邮箱使用到的函数:
使用消息邮箱之前,必须通过OSMboxCreate()函数先建立一个邮箱,而且需要定义指针的初始值;
2.初始值的选择:
初始值一般是NULL,也可以初始化一个邮箱,使其在最开始就包含一条消息;
3.如何确定消息指针初始值:
如果要使用邮箱通知一个事件的发生(发送一条消息),那么就要初始化该邮箱为空,即NULL;这样也表示新创建的这个消息邮箱里面没有内容。(示例代码)
如果要用邮箱共享某些资源,那么就要初始化该邮箱为一个非NULL的指针,此时邮箱被当成一个二值信号量使用。
示例代码:
static OS_EVENT *DISPRCVMbox; // 定义消息邮箱指针(事件控制块指针) ?接收数据邮箱
DISPRCVMbox = OSMboxCreate(NULL); //消息邮箱用于中断向任务传递操作结果
返回值是指向创建消息邮箱的指针
Step2、等待(请求)邮箱中的消息,OSMboxPend() 《阻塞方式请求消息邮箱》
1.如果邮箱中有消息(非NULL指针),也就是说OSEventPtr域是一个非NULL的指针时,说明该邮箱中有可用的消息那么就从邮箱中取出该消息即OSMboxPend()函数将该域的值复制到局部变量msg中,返回给调用函数,并将NULL指针存入邮箱即将.OSEventPtr置为NULL;同时,OSMboxPend()函数将“无错”代码OS_NO_ERR返回给调用它的函数。这个返回结果表示,已由另一个任务或者中断服务子程序将消息发送到邮箱中,这也是运行OSMboxPend()函数最快的情况。
2.如果邮箱为空(OSEventPtr域是NULL指针),那么,调用OSMboxPend()函数的任务就会进入睡眠状态,等待另一个任务(或者中断服务子程序)通过邮箱发送消息或者等待超时。当有其它的任务向该邮箱发送了消息后(或者等待时间超时),这时,该任务再一次成为最高优先级任务,OSSched()返回。这时,OSMboxPend()函数要检查是否有消息被放到该任务的任务控制块中。如果有,那么该次函数调用成功,对应的消息被返回到调用函数。
3. OSMboxPend()函数允许定义一个最长等待时间作为它的参数(超时时限),这样可以避免该任务无限期地等待邮箱中的消息。如果该参数是一个大于0的值,那么OSMboxPend()函数挂起该任务,该任务将一直等到获得消息或等待超时。如果该参数值为0,则该任务将无限期等待下去。
示例代码:
uint32 msg; //接收到的消息的指针 (消息邮箱中的消息指针)
msg = (uint32) OSMboxPend(DISPRCVMbox, OS_TICKS_PER_SEC, &err);// 等待操作结束
DISPRCVMbox:消息邮箱指针
OS_TICKS_PER_SEC:等待时间
err:表示错误信息,
Step3、向邮箱发送一则消息,OSMboxPost()
发送一个消息到邮箱和发送一个信号量也很相似,就是查看有没有任务在等待这个消息,如果有就把那个任务从睡眠态拉回就绪态。
如果从中断服务子程序中调用OSMboxPost()函数,那么,此时并不发生任务的切换。因为,中断服务子程序引起的任务切换只发生在中断嵌套的最外层和中断服务子程序调用OSIntExit()函数时。
示例代码:
OSMboxPost(DISPRCVMbox, (void *)DISP_ACK); //收到LCD应答,ACK
Step4、请求消息邮箱 OSMboxAccept() 《非阻塞方式请求消息邮箱》
OSMboxAccept()函数开始也是检查事件控制块是否是由OSMboxCreate()函数建立的。接着,它得到邮箱中的当前内容,并判断是否有消息是可用的。如果邮箱中有消息,就把邮箱清空,而邮箱中原来指向消息的指针被返回给OSMboxAccept()的调用函数。OSMboxAccept()函数的调用函数必须检查该返回值是否为NULL。如果该值是NULL,说明邮箱是空的,没有可用的消息。如果该值是非NULL值,说明邮箱中有消息可用,而且该调用函数已经得到了该消息。中断服务子程序在试图得到一个消息时,应该使用OSMboxAccept()函数,而不能使用OSMboxPend()函数。
示例代码:
while(OSMboxAccept(DISPRCVMbox)); // 2010.1.8清除邮箱
Step5、查询邮箱的状态OSMboxQuery()
Step6、删除邮箱OSMboxDel()
阅读(5730) | 评论(0) | 转发(0) |