第7章 操作系统服务.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《嵌入式系统软件教程》 David E Simon著 陈向群 等译 机械工业出版社 第七章 操作系统服务 跟PC机的操作系统一样,嵌入式操作系统也提供了一些函数,但是,只是有限的几种, 本章讨论嵌入式操作系统提供的服务:任务间通信、定时服务、存储管理、事件,以及中断程序和RTOS之间的交互。 这些都是RTOS提供的服务。 §7.1 消息队列、信箱和管道 消息队列 —消息是一种数据类型(数据结构); —队列是这些数据结构组成的链表; —队列有操作系统维护; —消息队列用于给任务发消息和从消息队列接受消息,是任务之间通信的一种手段。 —消息队列通信方式模型: 例子: —Task1和Task2优先级很高,有时会发现错误,必须通过网络上报。但是上报是个很耗时的过程。 —为了保证Task1和Task2这两个任务不被延迟,应单独设置一个专门用来向网络报告错误的ErrorTask任务。一旦发现错误,只需报告给向网络报告错误的任务,而Task1和Task2继续工作,报告由ErrorTask任务完成。 —用队列可以实现这个想法: 程序: 结论性说明: — 通过内核提供的服务,任务或中断服务子程序可以将一条消息放入消息队列; — 同样,一个或多个任务可以通过内核服务从消息队列中得到消息; — 不同的操作系统提供的函数不会相同,具体参考系统提供的手册; — 这些函数有操作系统保证是可重入的; — 若对列为空,调用从队列读消息的函数将使任务阻塞; — 通常,先进入消息队列的消息先传给等待消息的任务; — 通常,内核允许等待消息的任务定义等待超时的时间; — 一般在系统初始化时创建消息队列; — 一般不建议在运行中动态创建和删除队列。 § 7.1.1 一些隐秘的细节 队列的实现并不是简单的事,大多数RTOS中需要处理的复杂情况: —特定的函数完成队列的初始化; —若有许多消息队列,要确定队列的ID; —队列满了,返回错误信息或堵塞任务; —若从队列读数据时,队列空了,返回错误信息,或堵塞任务; —RTOS允许一次写入队列的数据量。(一个普遍的方式是允许一次写入一个无类型指针占用的字节数量。) 给出了一个队列更实际的应用 : — 功能同上例,使用了更加真实的 uC/OS的函数调用。 说明: — 消息队列初始化 OSQCreate ( ) —添加消息OSQPost ( ) 函数,添加时消息类型为 “void * ” —读取消息OSQPend( )函数,参数有:哪个消息队列,等待的时限和返回错误代码的位置。 说明: — 往消息队列中要写入的消息类型是“int”,需要利用类型的强制转换( void * ) —读取时,同样利用数据类型的强制转换(int * ) 注意:消息的类型强制转换是成对的。 §7.1.2 指针和队列 发送少量数据的常用编码技术:将数据映射为无类型指针,直接放到队列中,读取消息时应该强制转换回原来的类型。 但是对于大量数据传递来说,采用消息队列的这种方式效率是很低的。 —比较好的方法是在内存中开辟数据缓冲区,然后把该数据缓冲区的指针(首地址)和数据长度发送给相关的任务。 —数据缓冲区是另外定义的,比如数组、字符串等。 举例说明:“通过队列传递指针” 注意: malloc( )和free( ) 。 — 不会产生共享数据问题,为什么呢? 因为在vMainTask任务执行过程中切换到readtemperature任务,建立的指针不会指向同一个区域。 假设此时消息队列中的两个温度值为:39,在vMainTask中读出第一个温度值后,产生任务切换,此时从硬件中读入温度都变成40,由于先前动态分配的内存没有释放掉,所以重新分配内存,这样就会把原来堆栈的温度值39覆盖掉,产生任务切换,读第二个温度为:39 =〉温度相等,报警正确。不存在数据共享问题。 §7.1.3 信箱 一般来说,信箱和队列是非常相似的。 具体的应用中,使用信箱还是使用队列取决于系统的设计。 不同的RTOS的信箱实现方案不同。 可能碰到的信箱实现方案: —允许含有一定数量以内的消息 。 —一次只能含有一个消息 。 —每个信箱的消息是无限的,但是所有信箱的消息总数是有限的。 —可指定消息的优先级,高优先级的消息被最先读取去处理。 §7.1.4 管道 管道有两种类型: —一种类型与消息队列相同,操作方式和使用方式也与消息队列完全相同,如Nucleus Plus OS。 —另一种类型是一

文档评论(0)

ligennv1314 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档