




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,2020/5/24,嵌入式操作系统及开发,2020/5/24,2,第3章uC/OS-II的中断和时钟,3,2020/5/24,第3章目录,1、uC/OS-II的中断2、uC/OS-II的时钟3、时间管理,4,2020/5/24,第3章目录,1、uC/OS-II的中断2、uC/OS-II的时钟3、时间管理,5,2020/5/24,3.1uC/OS-II的中断,基本概念,中断-任务正在执行过程中被某紧要事件打断运行,而去处理该紧迫事件的过程;中断源-中断信号的申请者;中断响应-CPU对中断信号相应处理的机制;中断嵌套-优先级高的中断可以再中断低级的ISR;ISR-(某紧要事件的)中断服务处理程序;中断向量-ISR的入口地址。,6,2020/5/24,ARM处理器中断控制原理:,VICIntSelect-中断选择寄存器,配置32个中断源的F/I属性。1-FIQ;VICIntEnable-中断使能寄存器,控制相应通道中断申请屏蔽否。1-使能;,7,2020/5/24,IRQ_ISR地址映射关系图,备注VIC涉及到43个相关寄存器,8,2020/5/24,1、快速中断FIQ,在主程序中:在VICIntSelect中将中断分配为FIQ断;在VICIntEnable中使能外设中断。中断服务程序中:中断处理;清除相应的中断标志,以响应下一次中断。,9,2020/5/24,2、向量IRQ,主程序在VICIntSelect中将中断分配为IRQ中断;在VICVectCntlx中分配中断通道(优先级);在VICVectAddrx中设置中断服务程序的址;通过VICIntEnable使能外设中断。中断服务程序中断处理;清除相应的中断标志,以响应下一次中断;对VICVectAddr寄存器执行写操作(通常为0 x00),结束向量中断,以更新硬件优先级。,10,2020/5/24,3、非向量IRQ,主程序在VICDefVectAddr中设置中断服务程序的地址;通过VICIntEnable使能外设中断。中断服务程序中断处理;清除相应的中断标志,以响应下一次中断;对VICVectAddr寄存器执行写操作(通常0 x00),结束向量中断,以更新硬件优先级。,11,2020/5/24,AREAInit,CODE,READONLYENTRYBResetHandler/复位异常BUndefHandler/未定义异常BSWIHandler/软中断异常BPreAbortHandler/取指终止异常BDataAbortHandler/数据中止异常B/保留BIRQHandler/中断异常BFIQHandler/快速中断异常,12,2020/5/24,ARM内核为了处理外部设备向CPU发出的服务请求,尤其是一些紧急事件而特别作出的设计,来中断时进中断处理中断函数,结束后返回继续执行主程序。条件:外部中断请求引脚拉低,IQR中断使能(I位清零)处理方式1.保存CPSR和返回地址到专用的R14以及SPSR2.修改CPSR禁止新的IRQ产生,切换模式到IRQ模式3.强制PC转向0 x00000018,并跳入处理函数,13,2020/5/24,注意事项:编写IRQ中断处理程序是,要注意中断的重入性,即在有些IRQ中断处理函数中,允许新的IRQ产生,但这种情况会刷新掉一些以前的寄存器值,例如LR,所以在允许新中断产生之前要把一些寄存器保护一下,避免产生混乱。,14,2020/5/24,例:一个外部无重入中断IRQ_Eint1Void_irqIRQHandle(void)Void(*p)(void);/定义一个函数指针intirq_no;/中断号uint32intpnd;/中断挂起号intpnd=rINTPND;/从中断挂起寄存器读取中断号/将中断挂起号转换为中断号for(irq_no=0;irq_no1;If(nitpnd=0)Break;/利用函数指针取得中断服务程序的地址p=(void(*)(void)VICVectADDirq_no;p();在汇编语言中实现启动代码中,需要在异常向量表之前引入这个函数,所以要加入代码:IMPORTIRQHandle,15,2020/5/24,_irq这个关键字可实现进入中断处理函数时一些关键寄存器的自动保护和处理完毕后的自动返回,具体请见汇编和C的混合调用,因此接下来就是要编写中断处理函数了。VoidIRQ_Eint0(void)/中断处理函数VoidIRQ_Eint1(void)/中断处理函数编写完之后中断处理函数需要用两个语句来使其与IRQ异常处理函数建立联系VICVectADD0=(unit32)IRQ_Eint0VICVectADD1=(unit32)IRQ_Eint1注意:ARM有32个外部中断源,8-32占用一个IRQ源,因此要加语句进行判断,而且处理程序的最后要把中断标志位清除,以免系统不断的响应,16,2020/5/24,1、硬件自动过程;,2、ISR过程;,无高级任务激活返回,有高级任务激活返回,17,2020/5/24,3.1uC/OS-II的中断,uC/OS-II的中断过程,在应用系统设计中编写uC/OS-II的中断服务程序(ISR)时,要用到两个重要的系统函数。OSIntEnter()、OSIntExit()uC/OS-II允许中断嵌套,最多可嵌套255层;系统全局变量OSIntNesting记录中断嵌套层数。,18,2020/5/24,3.1uC/OS-II的中断,系统函数OSIntEnter()、OSIntExit(),OSIntEnter(),OSIntExit(),函数原型:voidOSIntEnter(void)主要功能:系统变量OSIntNesting自加1,目的告诉uC/OS-II系统记录中断的嵌套层数。,函数原型:voidOSIntExit(void)主要功能:系统变量OSIntNesting自减1,目的告诉uC/OS-II系统中断的嵌套层数,OSIntNesting=0时,则进行一次中断级的任务调度OSIntCtxSw()。P95,19,2020/5/24,3.1uC/OS-II的中断,应用程序中的临界段,临界段的基本概念及实现原理,uC/OS-II提供了两个宏操作用于临界段,工程应用中有“代码段必须被连续执行”的需求,这种不允许被打断执行的代码段称为“临界代码段”或“原子操作”。通过开关CPU中断来实现。,OS_ENTER_CRITICAL()-进入临界段OS_EXIT_CRITICAL()-退出临界段,注意事项:用户原子操作尽量的少且小,因为它会影响系统的实时性。,20,2020/5/24,当处理临界段代码时,须关中断,处理完毕后,再开中断关中断时间是实时内核最重要的指标之一。它影响用户系统对实时事件的相应特性。在实际应用中,关中断的时间很大程度上取决于微处理器的结构和编译器生成的代码质量微处理器通常具有关中断/开中断操作。C编译器须具有某种机制,能够在c中直接实现关中断/开中断操作C源代码中插入汇编语言的语句,易实现关中断/开中断操作关中断/开中断操作作为语言的扩展部分,直接从C语言中可以关中断/开中断,C/OS-II开关中断的方法,21,2020/5/24,C/OS-II开关中断的方法(续1),C/OS-II定义了两个宏调用来开关中断:OS_ENTER_CRITICAL()(禁止中断的宏)OS_EXIT_CRITICAL()(启用中断的宏)通常成对出现上述宏定义取决于使用的微处理器。在文件OS_CPU.H有相应的宏定义在C/OS-II中,每种微处理器都有自己的OS_CPU.H文件,22,2020/5/24,C/OS-II开关中断的方法(续2),.OS_ENTER_CRITICAL();/*C/OS-II临界段代码*/OS_EXIT_CRITICAL();.如果在所有挂起类(PEND)调用之前,如:调用OSTimeDel()(挂起时间)功能函数之前关中断,会出现什么现象?通常,调用C/OS-II功能函数时,中断总应当是开放的。,23,2020/5/24,C/OS-II开关中断的方法(续3),OS_ENTER_CRITICAL()及OS_EXIT_CRITICAL()可以用3种不同的方法实现具体方法取决于用户打算移植到的处理器的性能及所用的C编译器用定义(#define)常数OS_CRITICAL_METHOD可以选择具体使用哪种方法该常数在与CPU类型有关的移植文件OS_CPU.H中定义,24,2020/5/24,OS_CRITICAL_METHOD=1用最简单的方式来实现2个宏调用用处理器指令关中断,完成OS_ENTER_CRITICAL()用开中断指令完成OS_EXIT_CRITICAL()问题:如果调用C/OS-II功能函数时,中断是关掉的,则从C/OS-II函数返回时,中断就打开了若调用C/OS-II功能函数之前已将中断关掉,那么用户往往希望从C/OS-II函数返回时,中断仍然是关着的。这时,这种方法就不妥当。对特定的处理器,这种办法是唯一的选择,C/OS-II中采用了3种开关中断的方法,25,2020/5/24,C/OS-II中采用了3种开关中断的方法(续1),OS_CRITICAL_METHOD=2在堆栈中保存中断的开/关状态,然后再关中断实现OS_ENTER_CRITICAL()时,先在堆栈中保存中断的开/关状态,然后再关中断实现OS_EXIT_CRITICAL()时,从堆栈中弹出原来中断的开/关状态利用这种机制,不论用户在调用C/OS-II功能函数之前中断是开或关,函数的进入和返回状态都得到了保护。即:调用前中断的开/关状态,在调用之后保持不变,26,2020/5/24,C/OS-II中采用了3种开关中断的方法(续2),OS_CRITICAL_METHOD=3把当前处理器的状态字(PSW)保存在C函数的局部变量中(如OS_CPU_SR)关中断时保存,开中断时恢复,27,2020/5/24,C/OS-II中采用了3种开关中断的方法(续3),VoidSome_uCOS_II_Service(arguments)OS_CPU_SRcpu_sr;cpu_sr=get_processor_psw();disable_interrupts();/*临界段代码*/set_processor_psw(cpu_sr);,28,2020/5/24,3.1uC/OS-II的中断,应用程序中的临界段举例,在uC/OS-II系统文件中很多地方都要用到。,在用户程序中也可能用到,如进行PLL重置。,PLLCON=V_PLLCON_DATA;PLLCFG=V_PLLCFG_DATA;OS_ENTER_CRITICAL();/进入临界段PLLFEED=0 xaa;PLLFEED=0 x55;OS_EXIT_CRITICAL();/退出临界段,29,2020/5/24,3.1uC/OS-II的中断,不受uC/OS-II管理的中断服务程序(ISR),正常情况下,ISR应该受RTOS的管理。实际工程中,确实存在两种情况ISR不受RTOS管理。,uC/OS-II未对ARM的FIQ进行管理,没有管理必要的中断。,使用FIQ时应注意它与uC/OS-II的无关性,它的ISR只能物理缓冲区方式与uC/OS-II的其它任务数据通信。,例如掉电处理,它的ISR的主要工作就是保护CPU现场到Flash,然后即PowerDown,之后不再执行任何的其他uC/OS-II任务。,30,2020/5/24,补充:ARM中的中断优先级资源,ARM中的中断优先级资源就是ARMCPU的中断控制系统。ARM7中最多可以拥有32个中断源。每个中断源可配置为FIQ或IRQ中断。IRQ中断又可分为向量IRQ和非向量IRQ,向量IRQ最多可安排16个中断源,按槽位号(#slot)确定其优先级,非向量IRQ中断源则通过程序查询方式确定具体的中断源。uC/OS-II中使用了Timer0资源作为系统节拍发生器,它是uC/OS-II的工作基础。,31,2020/5/24,补充:ARM中的中断优先级资源,异常向量表(ARM的7种异常),注:表中的I和F表示不对该位有影响,保留原来的值。,32,2020/5/24,ARM状态各模式下可以访问的寄存器,33,2020/5/24,3.1uC/OS-II的中断,在ARM中不受uC/OS-II管理的ISR程序系统结构,Startup.s中关于FIQ的处理:,;中断向量表ResetLDRPC,ResetAddrLDRPC,UndefinedAddrLDRPC,SWI_AddrLDRPC,PrefetchAddrLDRPC,DataAbortAddrDCD0 xb9205f80LDRPC,PC,#-0 xff0LDRPC,FIQ_Addr,ResetAddrDCDResetInitUndefinedAddrDCDUndefinedSWI_AddrDCDSoftwareInterruptPrefetchAddrDCDPrefetchAbortDataAbortAddrDCDDataAbortNouseDCD0IRQ_AddrDCD0FIQ_AddrDCDFIQ_Handler,34,2020/5/24,3.1uC/OS-II的中断,在ARM中不受uC/OS-II管理的ISR程序系统结构,Startup.s中关于FIQ的处理:,;快速中断FIQ_HandlerSTMFDSP!,R0-R3,LRBLFIQ_ExceptionLDMFDSP!,R0-R3,LRSUBSPC,LR,#4,;用户FIQ_ISRvoidFIQ_Exception(void).;/C语言编码,实例参考嵌入式实时操作系统的编程技术周航慈Page46,35,2020/5/24,3.1uC/OS-II的中断,uC/OS-II的中断服务程序(ISR)的编写,uC/OS-II对ARM7TDMI的IRQ进行了管理,用户的使用方式与不受管理的FIQ有较大的区别。uC/OS-II在对ARM7TDMI移植时已作了处理(ARMIRQ.inc文件),用户可以直接使用C语言编程ISR,此之前用户要编写VIC配置及ISR句柄关联代码。,voidxxx_Eception(void)OS_ENTER_CRITICAL();清除中断源标志;VICVectAddr=0;/通知VIC中断已响应ISR业务代码;OS_EXIT_CRITICAL();,36,2020/5/24,3.1uC/OS-II的中断,uC/OS-II的中断服务程序(ISR)的编写-中断句柄,uC/OS-II约定:每个受控的ISR都必须按照ADS汇编宏的格式要求,在IRQ.s的尾部添加中断句柄:,xxx_HandlerHANDLERxxx_Exception,备注:,xxx_Handeler句柄是在target.c文件voidVICInit(void)函数中约定的;中断源用“中断源通道号”对应指派;HANDLER是语言关键词(keyword);xxx_Exception是ISR的函数名;,在中断源正式工作前,首先要进行“中断源初始化”(VIC初始化),这部分的代码一般编放在一个硬件系统初始化函数中(该函数一般是编写在target.c文件中),(代码少的话)也可以放在main()函数中。,37,2020/5/24,3.1uC/OS-II的中断,uC/OS-II的中断服务程序(ISR)的编写-VIC配置,VIC初始化部分主要是:用“中断通道号”指定中断源和对应的中断句柄。例如:指定Timer1的ISR句柄为:Timer1_Handler,并将其配置到硬件优先级10代码如下:,voidVICInit(void)externvoidTimer1_Handler(void);VICVectAddr10=(uint32)Timer1_Handler;VICVectCntl10=(0 x20|0 x05);VICIntEnable=15;/允许Timer1中断,在IRQ.s文件的尾部添加中断句柄指定:Timer1_HandlerHANDLERTimer1_Exception编写Timer1_ISR(Timer1_Exception)voidTimer1_Exception(void)关中断;清中断;通知VIC中断已响应;开中断;C代码完成Timer1具体业务处理;,38,2020/5/24,3.1uC/OS-II的中断,uC/OS-II的中断服务程序(ISR)的编写-外设初始化,若想使指定的外设按照我们约定的方式工作,需对它进行初始化,此部分代码主要工作:设置外设的工作方式。例如:设置Timer1的定时常数、中断允许否。代码如下:,voidTimer1Init(void)T1IR=0 xffffffff;/*清除Timer1的中断标示*/T1TC=0;/*Timer1的定时计数器TC赋初值*/T1TCR=0 x01;/*Timer1使能/*设置匹配常数*/,39,2020/5/24,3.1uC/OS-II的中断,uC/OS-II的中断使用策略(备注:具体情况具体分析),起因:,故而:,uC/OS-II对任务有完备的管理能力,以系统函数的方式为用户提供了丰富的管理手段;硬件层上希望ISR尽量的短;,通常并不将中断事件对应的业务处理代码安排在ISR中,而是在ISR中仅安排产生“信号”或“消息”,将物理级的中断事件转换为逻辑级的事件,通过中断级任务器OSIntCtxSw()调度,再完成具体功能。,备注:中断方式数据采集实例参考嵌入式实时操作系统的编程技术周航慈Page55-62,40,2020/5/24,第3章目录,1、uC/OS-II的中断2、uC/OS-II的时钟3、时间管理,41,2020/5/24,3.2uC/OS-II的时钟,任何OS都需要一个标准时钟作为系统资源,驱动OS前行,如用于系统定时、延时、超时判断等;定时通常由硬件定时器实现。uC/OS-II移植到ARM上时,用Timer0实现它的“标准时钟”。其周期的设置方法:在uC/OS-II配置文件OS_CFG.H中用宏定义方式设置。,#defineOS_TICKS_PER_SEC200,片内外设Timer0的ISR(Tmier0_Exception(),在有些书中称为OSTickISR())通过调用OSTimeTick()函数,完成每个OS节拍的系统工作。,42,2020/5/24,3.2uC/OS-II的时钟,uC/OS-II的OSTimeTick()函数的两个基本功能,OSTime+;/*它位于OS_CORE.C文件,INT32U类型*/遍历TCB链表,将任务延时变量OSTCBDly-,若该变量为0,且该任务又不是Suspend,则将该任务转入到“就绪状态”;,备注:,OSTimeTick()函数是uC/OS-II的基本组成部分,位于OS_CORE.C文件中。该函数中内嵌了OSTimeTickHook()“时钟钩子函数”,用户可以将目标系统中需要单节拍触发的业务安排在此函数中。,43,2020/5/24,第3章目录,1、uC/OS-II的中断2、uC/OS-II的时钟3、时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- CJ/T 233-2016建筑小区排水用塑料检查井
- CJ/T 198-2004燃烧器具用不锈钢排气管
- CJ/T 113-2000家用燃气取暖器
- 研究与思考2025年网络规划设计师考试试题及答案
- 软件评测师考试成功经验与学习路径分享试题及答案
- 初级社会工作者考试重要知识点及试题及答案
- 教师面试题库大全及答案
- 分析试验面试题目及答案
- 技术营销工程师面试题及答案
- 多媒体应用设计师2025年考试研发进展试题及答案
- YS/T 525-2009三硫化二锑
- GB/T 18838.5-2015涂覆涂料前钢材表面处理喷射清理用金属磨料的技术要求第5部分:钢丝切丸
- 杆塔基础分坑
- 静电接地报警器危害分析
- 第13课 亚非拉民族独立运动(课件) 高一历史 课件(中外历史纲要下)
- 道路交通事故认定书(简易程序)样本
- (新版)旅游接待业理论考试题库(含各题型)
- 不符合工作处理记录表
- xx旅游股份有限公司财务管理制度
- 乡村价值与乡村振兴课件
- 军队院校招收普通高中毕业生政治考核表
评论
0/150
提交评论