.嵌入式系统 中断.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文档。上传文档
查看更多
嵌入式系统中断

大多数情况下,为了控制一个寻常的硬件设备,小任务机制是实现下半部的最佳选择。小任务可以动态创建,使用方便,执行起来也比较快。 我们既可以静态地创建小任务,也可以动态地创建它。选择那种方式取决于到底是想要对小任务进行直接引用还是一个间接引用。如果准备静态地创建一个小任务(也就是对它直接引用),使用下面两个宏中的一个: DECLARE_TASKLET(name, func, data) DECLARE_TASKLET_DISABLED(name, func, data) 这两个宏都能根据给定的名字静态地创建一个tasklet_struct结构。当该小任务被调度以后,给定的函数func会被执行,它的参数由data给出。这两个宏之间的区别在于引用计数器的初始值设置不同。第一个宏把创建的小任务的引用计数器设置为0,因此,该小任务处于激活状态。另一个把引用计数器设置为1,所以该小任务处于禁止状态。例如: DECLARE_TASKLET(my_tasklet, my_tasklet_handler, dev); 这行代码其实等价于 struct tasklet_struct my_tasklet = { NULL, 0, ATOMIC_INIT(0), tasklet_handler, dev}; 这样就创建了一个名为my_tasklet的小任务,其处理程序为tasklet_handler,并且已被激活。当处理程序被调用的时候,dev就会被传递给它。 在小任务被调度以后,只要有机会它就会尽可能早的运行。在它还没有得到运行机会之前,如果一个相同的小任务又被调度了,那么它仍然只会运行一次。 可以调用tasklet_disable()函数来禁止某个指定的小任务。如果该小任务当前正在执行,这个函数会等到它执行完毕再返回。调用tasklet_enable()函数可以激活一个小任务,如果希望把以DECLARE_TASKLET_DISABLED()创建的小任务激活,也得调用这个函数,如: tasklet_disable(my_tasklet); /* 小任务现在被禁止,这个小任务不能运行 */ tasklet_enable(my_tasklet); /* 小任务现在被激活 */ ? 也可以调用tasklet_kill()函数从挂起的队列中去掉一个小任务。该函数的参数是一个指向某个小任务的tasklet_struct的长指针。在小任务重新调度它自身的时候,从挂起的队列中移去已调度的小任务会很有用。这个函数首先等待该小任务执行完毕,然后再将它移去。 假设有一个bh叫做FOO_BH(FOO表示任意一个),其处理函数为foo_bh(),则 (1)通过init_bh(FOO_BH, foo_bh)函数对foo_bh()进行初始化,也就是把foo_bh()函数的地址插入bh_base的第 FOO_BH(对应一个数字)项。 (2)通过mark_bh(FOO_BH)函数提出对foo_bh()的执行请求。 一般来说,RTC是OS时钟的时间基准,操作系统通过读取RTC来初始化OS时钟,此后二者保持同步运行,共同维持着系统时间。所谓同步,是指操作系统在运行过程中,每隔一个固定时间会刷新或校正RTC中的信息。 Linux中的时钟运作机制如图5.7所示。OS时钟和RTC之间要通过BIOS的连接,是因为传统PC机的BIOS中固化有对RTC进行有关操作的函数,例如INT 1AH等中断服务程序,通常操作系统也直接利用这些函数对RTC进行操作,例如从RTC中读出有关数据对OS时钟初始化、对RTC进行更新等等。Linux在内核初始化完成后就完全抛弃了BIOS中的程序。 RTC处于最底层,提供最原始的时钟数据。OS时钟建立在RTC之上,初始化完成后将完全由操作系统控制,和RTC脱离关系。操作系统通过OS时钟提供给应用程序所有和时间有关的服务。因为OS时钟完全是一个软件问题,其所能表达的时间由操作系统的设计者决定,将OS时钟定义为整型还是长整型或者大的超乎想象都是由设计者决定。 因为考虑到第一个操作是紧迫的,因此,由时钟中断处理程序本身来完成。其余的四个操作是次紧迫之的,可以通过TIMER_BH和TQUEUE_BH下半部调用的函数来完成。 在内核启动时运行初始化函数time_init( ),并设置IRQ0对应的中断门。一旦IRQ0中断门被初始化,就可以调用时钟中断处理程序timer_interrupt( )。这个函数以关中断开始运行,大约每10ms被调用一次。 timer_interrupt( )调用的主要函数为do_timer_interrupt( ),后者有两个主要任务:一是维持实时时钟RTC(每隔一定时间间隔进行刷新),另一个是调用do_time

文档评论(0)

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

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

1亿VIP精品文档

相关文档