嵌入式系统课件 8-interrupt and time management.ppt

嵌入式系统课件 8-interrupt and time management.ppt

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 嵌入式系统 第八讲 嵌入式软件编程-中断和时间管理 实时操作系统?C/OS-II 中断和时间管理 中断处理 中断:由于某种事件的发生而导致程序流程的改变。产生中断的事件称为中断源。 CPU响应中断的条件: 至少有一个中断源向CPU发出中断信号; 系统允许中断,且对此中断信号未予屏蔽。 中断服务程序ISR 中断一旦被识别,CPU会保存部分(或全部)运行上下文(context,即寄存器的值),然后跳转到专门的子程序去处理此次事件,称为中断服务子程序(ISR)。 μC/OS-Ⅱ中,中断服务子程序要用汇编语言来编写,然而,如果用户使用的C语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在C语言的程序文件中。 (1)保存全部CPU寄存器的值; (2)调用OSIntEnter(),或直接把全局变量OSIntNesting(中断嵌套层次)加1; (3)执行用户代码做中断服务; (4)调用OSIntExit(); (5)恢复所有CPU寄存器; (6)执行中断返回指令。 用户ISR的框架 OSIntEnter() /* 在调用本函数之前必须先将中断关闭 */ void OSIntEnter (void) { if (OSRunning == TRUE) { if (OSIntNesting < 255) { OSIntNesting++; } } } OSIntExit的意义 OSIntExit() void OSIntExit (void) { OS_ENTER_CRITICAL(); //关中断 if ((--OSIntNesting|OSLockNesting) == 0)//判断 { //把高优先级任务装入 嵌套是否为零 OSIntExitY = OSUnMapTbl[OSRdyGrp]; OSPrioHighRdy=(INT8U)((OSIntExitY<< 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]); if (OSPrioHighRdy != OSPrioCur) { OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; OSCtxSwCtr++; OSIntCtxSw(); } } OS_EXIT_CRITICAL(); //开中断返回 } OSIntCtxSw() 在任务切换时,为什么使用OSIntCtxSw()而不是调度函数中的OS_TASK_SW()? 原因有二点 一半的任务切换工作,即CPU寄存器入栈,已经在前面做完了; 需要保证所有被挂起任务的栈结构是一样的。 调用中断切换函数OSIntCtxSw() 后的堆栈情况 OSIntExit的关键——OSIntCtxSw 实现中断级的任务切换 ARM在栈指针调整过程中的优势 时钟节拍 时钟节拍是一种特殊的中断,相当于操作系统的心脏起搏器; μC/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在10到100Hz之间,时钟节拍率越高,系统的额外负荷就越重; 时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,或是来自50/60Hz交流电源的信号。 时钟节拍ISR void OSTickISR(void) { (1)保存处理器寄存器的值; (2)调用OSIntEnter()或将OSIntNesting加1; (3)调用OSTimeTick(); /*检查每个任务的时间延时*/ (4)调用OSIntExit(); (5)恢复处理器寄存器的值; (6)执行中断返回指令; } 时钟节拍函数 OSTimtick() void OSTimeTick (void) { OS_TCB *ptcb; OSTimeTickHook(); (1) ptcb = OSTCBList; (2) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { (

文档评论(0)

卖报的小行家 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档