eCos内核概览分析和总结.docxVIP

  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文档。上传文档
查看更多
eCos 内核概览 eCos 内核概览 eCos 内核概览(1)实时内核 eCos 的核心是一个功能全面的,灵活的,可配置的实时内核。这个内核提供了多线程支持, 多种调度器的选择,一组丰富的同步原语,内存分配原语和线程管理函数。 在这个内核中,可以改变或替换其中的某些部分(比如调度器)而不会影响内核本身的别的模块。 下列是这个内核的一些特征: 可以选择内存分配算法 可以选择调度算法 一组丰富的同步原语 定时器,计数器和alarms 中断处理 exception 处理 cache 控制线程支持 内核支持用GDB 进行多线程调试 trace buffers infrastructure and instrumentation eCos 内核概览(2)调度器 调度器是内核的核心。它定义了线程运行的方式,提供了线程同步的机制。它也控制中断是如何影响线程执行的。没有一个调度器可以覆盖所有可能的系统配置。我们需要几种调度策略来满足不同的需要。这里提供了三种调度器。 位图调度器 位图中每一位表示一个可运行的线程,而每个线程有一个独一无二的优先级,系统允许的线程数是有上限的。 多级队列调度器 可以在相同优先级线程之间按时间片轮换,支持优先级继承。 lottery 调度器 目前在任何时候系统只支持一种调度器。将来系统会允许多种调度器共存,但是这将会隐藏在现有的调度器API 后。 为了能够安全调度,我们需要一种在并发访问中保护调度器数据结构的机制,传统的方法 是在这个临界区禁止中断。不幸的是,这增加了中断的最大dispatch 延迟,在任何实时系统中都应当避免这种情形的发生。 eCos 采用的机制是保持一个计数器,Scheduler::sched_lock。如果它的值不为0,就防止了重新调度。当前的中断通过调用Scheduler::lock()得到这个锁,它对这个计数器加1避免进一步的调度。函数Scheduler::unlock()对这个计数器减1,如果它返回0,允许继续调度。 为了在中断存在的情况下这种机制能够很好地工作,需要ISR 推迟执行任何引起调度 (scheduler-oriented)的操作,直到这个锁将要为0。为此我们把 ISR 的工作分割成两部分。并把第二部分,DSR,写进队列,直到调度器认为运行它们是安全的。(细节见第三章的中断 和 exception handler) 在单处理器上,Scheduler::lock()仅仅是对 Scheduler::sched_lock 加1。既然这个锁严格地被嵌套,Scheduler::lock()不需要一个读-修改-写周期。当前线程正在运行这个事实意味着这个锁还没有被别的线程获得,因此它总是可获得的。 eCos 内核概览(3)线程同步 为了允许线程协调和竟争资源,提供同步和通讯机制是必要的。传统的同步机制是互斥/条件变量和信号量。eCos 内核不但支持这些机制,它还提供了在实时系统中普遍用到的其它同步和通讯机制,例如event flags 和消息队列。 在任何实时系统中必须处理的一个问题是优先级倒转(priority inversion)问题。它出现在一个高优先级线程(错误地)被一个低优先级线程阻止了继续执行。一般的例子是:一个高优先级线程等待一个互斥量,而这个互斥量正被一个低优先级线程所拥有,如果这个低优先级线程被一个中等优先级的线程剥夺了运行,那么就发生了优先级倒转,既然这个高优先级线程被一个不相关的较低优先级线程阻止了继续执行。 这里有好几种方法可以解决这个问题。最简单的是运用一个优先级ceiling protocal。所有获得这个互斥量的线程把它们的优先级提升到一个事先规定好的值。它有如下不利因素:它需要事先知道使用这个互斥量线程的最高优先级;如果这个事先规定的值太高,它相当于一个全局锁禁止了所有的调度。 一个更好的解决方案是使用优先级继承协议,拥有互斥量的线程的优先级被提升到与正在等待这个互斥量的最高优先级线程的优先级相等。这个技术不需要预先知道准备使用这个互斥量线程们的优先级。当一个更高优先级线程处于等待时,只有拥有互斥量的线程的优先级被提升。这种方法减少了对别的线程进行调度的影响。但是它的不利之处在于:每次同步调用的开销增加了,因为每次都得遵守这个继承协议。 第三种方法是:认识到糟糕地选择了相对的线程优先级,因此这个发生优先级倒转的系统本身是有缺陷的。在这种情况下,当发生优先级倒转时,内核要有能力检测到,并产生一个exception 来调试这个系统。 eCos 提供了一种相对简单的实现方式。它只在多级队列调度器中有效,它同时不能完全正确地处理嵌套的互斥量的极端例子。但是,它不但速度快而且是确定性的。如果不需要互斥优先级倒转,可以disable 它,这将减少代码大小和数据空间。

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

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

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档