版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C/OS-的中断和时钟 本章主要内容:C/OS-II系统 响应中断的过程C/OS-II系统响应中断的过程为:系统接收到中断请求后,这时如果CPU处于中断允许状态(即中断是开放的),系统就会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;当中断服务子程序的运行结束后,系统将会根据情况返回到被中止的任务继续运行或者转向运行另一个具有更高优先级别的就绪任务。注意!中断服务子程序运行结束之后,系统将会根据情况进行一次任务调度去运行优先级别最高的就绪任务,而并不是一定要接续运行被中断的任务的。中断请求关闭中断转到中断向量保存CPU寄存器通知内核退出ISRISR给任务发信号中断返回恢
2、复CPU寄存器中断响应中断恢复中断恢复任务响应时间任务响应时间中断的响应过程无新高级任务则返回原任务通知内核退出ISR恢复CPU寄存器中断返回有新高级任务则运行高级任务通知内核进入ISRvoid OSIntEnter (void) if (OSRunning = TRUE) if (OSIntNesting 0) OSIntNesting-;/中断嵌套层数计数器减一 if (OSIntNesting = 0) & (OSLockNesting = 0) OSIntExitY = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(OSIntExitY OST
3、CBStkPtr;/SP指向待运行任务堆栈用出栈指令把R1,R2,弹入CPU的通用寄存器;RETI;/中断返回,使PC指向待运行任务应用程序中的临界段 在应用程序中经常有一些代码段必须不受任何干扰地连续运行,这样的代码段叫做临界段。因此,为了使临界段在运行时不受中断所打断,在临界段代码前必须用关中断指令使CPU屏蔽中断请求,而在临界段代码后必须用开中断指令解除屏蔽使得CPU可以响应中断请求 由于各厂商生产的CPU和C编译器的关中断和开中断的方法和指令不尽相同,为增强C/OS-II的可移植性(即在C/OS-II的各个C函数中尽可能地不出现汇编语言代码),C/OS-II用两个宏来实现中断的开放和关
4、闭,而把与系统的硬件相关的关中断和开中断的指令分别封装在这两个宏中:OS_ENTER_CRITICAL( )OS_EXIT_CRITICAL( ) 第一种方法最简单,即直接使用处理器的开中断和关中断指令来实现宏,这时需要令常数OS_CRITICAL_METHOD=1。其示意性代码为:#define OS_ENTER_CRITICAL( )asm(“DI”) 关中断#define OS_EXIT_CRITICAL( )asm(“EI”) 开中断 第二种方法稍微复杂一些,但可以使CPU中断允许标志的状态,在临界段前和临界段后不发生改变。在宏OS_ENTER_CRITICAL( )中,把CPU的允许
5、中断标志保持到堆栈中,然后再关闭中断,这样在临界段结束时,即在调用宏OS_EXIT_CRITICAL( )时只要把堆栈中保存的CPU允许中断状态恢复就可以了。这两个宏的示意性代码如下:#define OS_ENTER_CRITICAL( ) asm(“PUSHPSW”) /*通过保存程序状态字来保存中 断允许标志*/asm(“DI”) /关中断#define OS_EXIT_CRITICAL( ) asm(“POPPSW”) /恢复中断允许标志 C/OS-II的系统时钟C/OS-II与大多数计算机系统一样,用硬件定时器产生一个周期为ms级的周期性中断来实现系统时钟,最小的时钟单位就是两次中断之
6、间相间隔的时间,这个最小时钟单位叫做时钟节拍(Time Tick)。硬件定时器以时钟节拍为周期定时地产生中断,该中断的中断服务程序叫做OSTickISR( )。中断服务程序通过调用函数OSTimeTick( )来完成系统在每个时钟节拍时需要做的工作。void OSTickISR(void)保存CPU寄存器;调用OSIntEnter( );/记录中断嵌套层数if (OSIntNesting = = 1;OSTCBCur-OSTCBStkPtr = SP; /保存堆栈指针调用OSTimeTick( );/节拍处理清除中断;开中断;调用OSIntExit( );/中断嵌套层数减一 恢复CPU寄存器;
7、中断返回; 这是系统时钟中断服务程序void OSTimeTick (void) OSTimeTickHook( ); OSTime+;/记录节拍数 if (OSRunning = = TRUE) ptcb = OSTCBList; while (ptcb-OSTCBPrio != OS_IDLE_PRIO) OS_ENTER_CRITICAL( ); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = = 0) /任务的延时时间减一 if (ptcb-OSTCBStat & OS_STAT_SUSPEND) = = OS_STAT_RDY) OSRdyG
8、rp |= ptcb-OSTCBBitY; OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-OSTCBDly = 1; ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL( ); 时钟节拍服务函数函数OSTimeTick( )的任务,就是在每个时钟节拍了解每个任务的延时状态,使其中已经到了延时时限的非挂起任务进入就绪状态。 任务的延时 由于嵌入式系统的任务是一个无限循环,并且C/OS-II还是一个抢占式内核,所以为了使高优先级别的任务不至于独占CPU,可以给其他任务优先级别较低的任务获得CPU使用权的机会,C/OS-
9、II规定:除了空闲任务之外的所有任务必须在任务中合适的位置调用系统提供的函数OSTimeDly( ),使当前任务的运行延时(暂停)一段时间并进行一次任务调度,以让出CPU的使用权。 void OSTimeDly (INT16U ticks)#if OS_CRITICAL_METHOD = = 3 OS_CPU_SR cpu_sr;#endif if (ticks 0) OS_ENTER_CRITICAL( );if (OSRdyTblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = = 0) OSRdyGrp &= OSTCBCur-OSTCBBitY;/取消当前任务的就绪状态 OSTCBCur-OSTCBDly = ticks;/延时节拍数存入任务控制块 OS_EXIT_CRITICAL( );OS_Sched( );/调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东江门市人民医院招聘高层次人才1人备考题库附答案
- 2025江苏省苏豪控股集团招聘备考题库附答案
- 2026中铁十一局集团有限公司专业人才招聘1人笔试备考题库及答案解析
- 2026广东广州医科大学附属第五医院人才招聘54人(一)笔试备考题库及答案解析
- 2025四川巴中市巴州区赴高校考试(考核)招聘紧缺学科教师和体育教练员79人笔试备考试题及答案解析
- 2025秋人教版道德与法治八年级上册第三单元单元思考与行动教学设计
- 2026新疆博尔塔拉州博乐边合区金垣热力有限责任公司招聘1人笔试参考题库及答案解析
- 2026广东广州市越秀区建设街招聘劳动保障监察协管员1人笔试备考题库及答案解析
- 2026年滁州凤阳县人民医院派遣项目特岗教师招聘2名笔试参考题库及答案解析
- 2025福建福州滨海实验学校临聘教师招聘2人笔试模拟试题及答案解析
- 粉刷安全晨会(班前会)
- 2024年国网35条严重违章及其释义解读-知识培训
- 部编版八年级语文上册课外文言文阅读训练5篇()【含答案及译文】
- 高三英语一轮复习人教版(2019)全七册单元写作主题汇 总目录清单
- 工业区物业服务手册
- 大学基础课《大学物理(一)》期末考试试题-含答案
- 道德与法治五年级上册练习测试题带答案(模拟题)
- 招标代理机构内部管理制度
- 2024新能源集控中心储能电站接入技术方案
- 生产拉丝部门工作总结
- 农村买墓地合同的范本
评论
0/150
提交评论