- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第八章 μc/OS-Ⅱ消息邮箱与队列;8.1.1 消息邮箱同步实例
在项目ZLX11的基础上新建项目ZLX12,保存在目录D:\ZLXLPC824\ZLX12下,此时的项目ZLX12
与ZLX11相同。在项目ZLX11中借助于信号量Sem03实现任务Task06同步中断服务程序
PIN_INT2_IRQHandler的执行,如第七章图7-12所示。在项目ZLX12中,将Sem03改为消息邮箱
Mbox01,使消息邮箱Mbox01用于实现任务Task06同步中断服务程序PIN_INT2_IRQHandler的执
行。
项目ZLX11转化为ZLX12,编译链接并运行项目ZLX12,其运行结果与项目ZLX11相同。消息邮
箱Mbox01用于任务同步中断服务程序的执行,如图8-1所示。
图8-1 项目ZLX12中消息邮箱Mbox01的作用
; 项目ZLX12中,在任务Task01中创建了消息邮箱Mbox01,在图81中,当LPC824学习板上S1~S16
中的某个按键被按下时,中断服务函数PIN_INT2_IRQHandler被触发而执行,在其中释放消息邮
箱Mbox01。用户任务Task06始终请求消息邮箱Mbox01,请求不到则永远等待,一旦请求成功则
执行Task06任务中后续的语句。
项目ZLX12中仅给出了消息邮箱用作任务同步中断服务程序时的用法,如果消息邮箱用作任
务B同步任务A的执行,则只需要在任务A中添加释放消息邮箱的语句,与中断服务函数
PIN_INT2_IRQHandler中释放消息邮箱的语句相同,任务B中添加请求消息邮箱的语句,与任务
Task06中请求消息邮箱的语句相同。
;8.1.2 消息邮箱传递信息实例
在项目ZLX12中,消息发送方的任务或中断服务程序使用了哑元消息,消息接收方的任务请求
到该哑元消息后不保存消息,因为接收方知道消息的内容,消息中没有信息。本小节将在项目
ZLX12的基础上,将按键值作为消息,由中断服务函数PIN_INT2_IRQHandler将该消息释放到消
息邮箱Mbox01中,用户任务Task06接收消息邮箱Mbox01中的消息,从而得到按键值,具体的做法
如下所示:
(1)在zlg7289b.c文件(见图7-8)中,将第5行由原来的“Int08UkeyCode;”改为
“Int08UkeyCode[1];”,表示创建一维整型数组keyCode,用于保存消息,特别需要注意的是,用于保存消息的数组必须定义为全局变量!
(2)在zlg7289b.c文件中,修改中断服务函数PIN_INT2_IRQHandler的代码如下所示。
程序段8-1中断服务函数PIN_INT2_IRQHandler
1 voidPIN_INT2_IRQHandler(void)
2 {
3 OSIntEnter();
4 NVIC_ClearPendingIRQ(PIN_INT2_IRQn);
5 if((LPC_PIN_INT->FALL(1uL<<2))==(1uL<<2))
; 6 {
7 LPC_PIN_INT->FALL=(1uL<<2);
8 keyCode[0]=ZLG7289Key();
9 OSMboxPost(Mbox01,(void*)keyCode[0]);
10 }
11 OSIntExit();
12 }
第8行调用ZLG7289Key函数获得按键码,赋给数组的第一个元素keyCode[0];第9行调用系统
函数OSMboxPost将数组作为消息释放到消息邮箱Mbox01中。
(3)文件task06.c修改为如程序段8-2所示。
程序段8-2文件task06.c
1 //Filename:task06.c
2
3 #includeincludes.h
4
5 externOS_EVENT*Mbox01;
6 externOS_EVENT*Mutex01;
7 INT8UkeyNum;
8
; 第5行声明外部定义的消息邮箱Mbox01。
9 voidTask06(void*data)
10 {
11 INT8Uerr;
12 void*pmsg;
13
第12行定义void*类型的指针pmsg,用于指向从消息邮箱获得的消息。
14 data=data;
15
16 while(1)
17 {
18 pmsg=OSMboxPend(Mbox01,0,err);
19
第18行请求消息邮箱
文档评论(0)