《嵌入式操作系统及ARM Cortex-MO》课件第八章.pptx

《嵌入式操作系统及ARM Cortex-MO》课件第八章.pptx

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

酱酱 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档