中断和时钟机制_第1页
中断和时钟机制_第2页
中断和时钟机制_第3页
中断和时钟机制_第4页
中断和时钟机制_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第八章 c/os-的中断和时钟,本章主要内容,c/os-ii系统响应中断的过程,系统接收到中断请求后,如果中断未关闭,系统就会中止正在运行的当前任务,按照中断向量转而去运行isr。 当isr运行结束,系统将会返回到被中止的任务继续或者转向另一个具有更高优先级别的就绪任务,系统中断,中断就是内核控制的任务在运行过程中,应内部或外部异步事件的请求,中止当前任务的运行,转去处理异步事件所要求的任务或处理的过程。中断服务程序(interrupt service routine)就是应中断请求而运行的子程序。简称为isr。中断向量指中断服务子程序isr的入口地址,即起始地址,中断请求,关闭中断,转到中断

2、向量,保存cpu寄存器,通知内核退出isr,isr给任务发信号,中断返回,恢复cpu寄存器,中断响应,中断恢复,中断恢复,任务响应时间,任务响应时间,中断的响应过程,无新高级任务则返回原任务,通知内核进入isr,本章分为内核中断管理及其结构,系统时钟实现方法,时间管理模块的基本结构与功能,基本服务与接口函数,及其设计与调用方法,相关应用实例程序分析等。 将c/os-ii内核时间模块与中断与时钟管理功能进行组合的原因在于,两个模块的功能和性能是密切相关的,中断管理是时间管理的基础,uc/os-ii内核中cpu能够响应中断的条件,可以理解为以下两个部分:一是至少有一个中断源向cpu发出中断信号,二

3、是内核及应用系统允许中断,即未屏蔽中断信号。 c/os-ii内核中的时钟中断技术分为系统中断与系统时钟节拍两个部分组成,系统时钟节拍,时钟节拍是特定的周期性中断,也称时钟中断,这个中断可以看作是系统心脏的脉动。操作系统通过时钟中断来确定时间间隔,实现时间的延时及确定任务超时。中断之间的时间间隔取决于不同的应用,一般在10200 ms之间。 时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,以及当任务等待事件发生时提供等待超时的依据。时钟节拍频率越快,系统额外开销越大。 系统定义了32位无符号整数ostime来记录系统启动后时钟节拍数。用户程序必须在多任务系统启动以后开启时钟节拍计时,在

4、应用程序中调用系统函数osstart()之后。 c/os-ii中的时钟节拍服务通过在时钟节拍中断服务子程序中调用ostimetick()实现,c/os-ii与大多数计算机系统一样,用硬件定时器产生一个周期为ms级的周期性中断来实现系统时钟,最小的时钟单位就是两次中断之间相间隔的时间,这个最小时钟单位叫做时钟节拍(time tick)。 硬件定时器以时钟节拍为周期定时地产生中断,该中断的中断服务程序叫做ostickisr( )。中断服务程序通过调用函数ostimetick( )来完成系统在每个时钟节拍时需要做的工作,时钟节拍中断服务子程序,void ostickisr(void) 保存处理器寄存

5、器的值;调用osintenter ()或是将osintnesting加1;调用ostimetick ();调用osintexit ();恢复处理器寄存器的值;执行中断返回指令,ostimetick ()函数,c/os-ii时钟中断服务程序的核心是调用ostimetick ()函数。ostimetick ()函数用来判断延时任务是否延时结束从而将其置于就绪态。其程序伪代码如下:void ostimetick(void) ostimetickhook();/* 调用用户定义的时钟节拍外连函数*/while /*(除空闲任务外的所有任务)*/os_enter_critical();/*关中断*/对所

6、有任务的延时时间递减;扫描时间到期的任务,并且唤醒该任务;os_exit_critical();/*开中断*/指针指向下一个任务; ostime+;/*系统计时时间加1*,uc/os-ii内核对于以上中断响应及中断处理过程,使用以下若干系统函数实现中断与内核之间的控制管理和联系,这些函数分别是: 中断的进入函数osintenter() 中断的退出函数osintexit() 中断服务子程序isr 中断级任务切换函数isr的任务切换函数osintctxsw(,void osintenter (void) if (osrunning = true) if (osintnesting 255) osi

7、ntnesting+; /中断嵌套层数计数器加1,void osintexit (void) if (osrunning = true) os_enter_critical( ); if (osintnesting 0) osintnesting-;/中断嵌套层数计数器减1 if (osintnesting = 0),在中断服务程序中调用的负责任务切换工作的函数osintctxsw( )叫做中断级任务切换函数,osintctxsw( ) ostcbcur = ostcbhighrdy; /任务控制块的切换 ospriocur=ospriohighrdy; sp = ostcbhighrdy-o

8、stcbstkptr; /sp指向待运行任务堆栈,用出栈指令把r1,r2,存入cpu通用寄存器; reti;/中断返回,pc指待运行任务,参见core.c中关于中断进入和退出的调用的定义,core.c关于中断及辅助功能的设计与实现技术 void osintenter (void) void osintexit (void) void osschedlock (void) void osschedunlock (void,c/os-ii的系统时钟,void ostickisr(void) 保存cpu寄存器; 调用osintenter( );/记录中断嵌套层数 if (osintnesting =

9、 = 1; ostcbcur-ostcbstkptr = sp; /保存堆栈指针 调用ostimetick( );/节拍处理 清除中断; 开中断; 调用osintexit( );/中断嵌套层数减1 恢复cpu寄存器; 中断返回;,这是系统时钟中断服务程序,void ostimetick (void) ostimetickhook( ); ostime+;/记录节拍数 if (osrunning = = true) ptcb = ostcblist; while (ptcb-ostcbprio != os_idle_prio) os_enter_critical( ); if (ptcb-ost

10、cbdly != 0) if (-ptcb-ostcbdly = = 0) /任务的延时时间减一 if (ptcb-ostcbstat,时钟节拍服务函数,函数ostimetick( )的任务,就是在每个时钟节拍了解每个任务的延时状态,使其中已经到了延时时限的非挂起任务进入就绪状态,任务的延时,这是系统提供的延时函数,嵌入式系统的任务是一个无限循环,c/os-ii是一个抢占式内核,为了使高优先级任务不独占cpu,c/os-ii规定:除了空闲任务之外的所有任务必须在任务中合适的位置调用系统提供的函数ostimedly( ),使当前任务的运行延时(暂停)一段时间并进行一次任务调度,以让出cpu的使用

11、权,其他用来管理时间的函数,int8u ostimedlyresume( int8u prio); int32u ostimeget( void ); void ostimeset( int32u ticks,取消任务延时函数,获得系统时间函数,设置系统时间函数,void ostimedly (int16u ticks) if (ticks 0) os_enter_critical( ); if (osrdytblostcbcur-ostcby /调用调度函数,ostimedlyhmsm()函数,任务延迟函数ostimedly()需要确定延时时间对应的时钟节拍。利用全局常数设定os_ticks

12、_per_sec值,将时间转换成时钟节拍数,参见文件os_cfg.h。 c/os-内核提供ostimedlyhmsm()函数,可以按小时(h)、分(m)、秒(s)和毫秒(ms)来定义延迟时间,结束任务延时函数ostimedlyresume(,有时嵌入式软件根据设计要求,需要根据特定条件,提前结束任务的延时,即任务的延时并未到时,就唤醒该任务,将任务的状态转到就绪。嵌入式操作系统内核应提供这一功能。 c/os-内核允许用户结束正处于延时时限范围内的任务。延时任务可以不等待延时时限到时,而是通过其它任务调用结束任务延时函数ostimedlyresume()取消该任务的延时,使得延时任务延时结束,条

13、件许可情况下转到就绪态。调用结束任务延时函数ostimedlyresume()需要指定要恢复的任务优先级作为调用参数,获取系统时间函数ostimeget()和设置系统时间函数ostimeset(,由前面的时钟节拍服务函数ostimetick()的内部流程可知,无论时钟节拍何时发生,c/os-内核都会在时钟节拍服务函数ostimetick()中,将一个32位的计数器ostime加1。 对于c/os-内核而言,这个计数器是一个全局量,在用户调用osstart()初始化多任务时清零,并且由于32位的计数器的可表示范围,该变量在4,294,967,295个时钟节拍执行完一遍的时候又会从0开始计数。在系统时钟节拍的频率等于100hz的时候,这个32位的计数器每隔497天就重新开始计数,用户可以通过调用获取系统时间函数ostimeget()来获得该计数器的当前值。也可以通过调用设置系统时间函数ostimeset()来改变该计数器的值。 注意,在访问ostime的时候中断是关闭的。这是因为在大多数8位处理器上增加和拷贝一个32位的数都需要数条指令实现

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论