您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > μCOS Ⅱ嵌入式操作系统及开发课件-3
page12020/5/22嵌入式操作系统及开发page2020/5/222第3章uC/OS-II的中断和时钟page32020/5/22第3章目录1、uC/OS-II的中断2、uC/OS-II的时钟3、时间管理page42020/5/22第3章目录1、uC/OS-II的中断2、uC/OS-II的时钟3、时间管理page52020/5/223.1uC/OS-II的中断基本概念中断---任务正在执行过程中被某紧要事件打断运行,而去处理该紧迫事件的过程;中断源---中断信号的申请者;中断响应---CPU对中断信号相应处理的机制;中断嵌套---优先级高的中断可以再中断低级的ISR;ISR---(某紧要事件的)中断服务处理程序;中断向量---ISR的入口地址。page62020/5/22ARM处理器中断控制原理:11%VICTimer0Timer1EINT0EINT1CPSR_I(0x18)CPSR_F(0x1C)ARM7TDMI_CoreVICIntSelect---中断选择寄存器,配置32个中断源的F/I属性。1---FIQ;VICIntEnable---中断使能寄存器,控制相应通道中断申请屏蔽否。1---使能;page72020/5/22中断源0#VIC_Int_ch0VICIntSelect配置为IRQ的中断源组中断源1#VIC_Int_ch1中断源2#VIC_Int_ch2中断源xx#VIC_Int_chxx中断源j#VIC_Int_chjVICVectCntl0VICVectCntl1VICVectCntl2VICVectAddr0VICVectAddr2VICVectAddr1#VIC_Int_chx#VIC_Int_chyI0_En#VIC_Int_chzI2_EnI1_En012VICVectCntlmVICVectAddrm#VIC_Int_chiIm_EnmVICVectCntl31VICVectAddr31#VIC_Int_chnI15_En15VIC槽位号(#slot)IRQ向量控制寄存器组IRQ向量地址寄存器组DEV_x_ISRDEV_y_ISRDEV_z_ISRDEV_i_ISRDEV_n_ISRVICDefVectAddrVICVectAddr非向量IRQ中断源0非向量IRQ中断源yy非向量IRQ中断源1ISRImporttoARMCoreIRQ_ISR地址映射关系图备注VIC涉及到43个相关寄存器page82020/5/221、快速中断FIQ⑴在主程序中:①在VICIntSelect中将中断分配为FIQ断;②在VICIntEnable中使能外设中断。⑵中断服务程序中:①中断处理;②清除相应的中断标志,以响应下一次中断。page92020/5/222、向量IRQ⑴主程序①在VICIntSelect中将中断分配为IRQ中断;②在VICVectCntlx中分配中断通道(优先级);③在VICVectAddrx中设置中断服务程序的址;④通过VICIntEnable使能外设中断。⑵中断服务程序①中断处理;②清除相应的中断标志,以响应下一次中断;③对VICVectAddr寄存器执行写操作(通常为0x00),结束向量中断,以更新硬件优先级。page102020/5/223、非向量IRQ⑴主程序①在VICDefVectAddr中设置中断服务程序的地址;②通过VICIntEnable使能外设中断。⑵中断服务程序①中断处理;②清除相应的中断标志,以响应下一次中断;③对VICVectAddr寄存器执行写操作(通常0x00),结束向量中断,以更新硬件优先级。page112020/5/221.AREAInit,CODE,READONLY2.ENTRY3.BResetHandler//复位异常4.BUndefHandler//未定义异常5.BSWIHandler//软中断异常6.BPreAbortHandler//取指终止异常7.BDataAbortHandler//数据中止异常8.B//保留9.BIRQHandler//中断异常10.BFIQHandler//快速中断异常page122020/5/22ARM内核为了处理外部设备向CPU发出的服务请求,尤其是一些紧急事件而特别作出的设计,来中断时进中断处理中断函数,结束后返回继续执行主程序。条件:外部中断请求引脚拉低,IQR中断使能(I位清零)处理方式1.保存CPSR和返回地址到专用的R14以及SPSR2.修改CPSR禁止新的IRQ产生,切换模式到IRQ模式3.强制PC转向0x00000018,并跳入处理函数page132020/5/22注意事项:编写IRQ中断处理程序是,要注意中断的重入性,即在有些IRQ中断处理函数中,允许新的IRQ产生,但这种情况会刷新掉一些以前的寄存器值,例如LR,所以在允许新中断产生之前要把一些寄存器保护一下,避免产生混乱。page142020/5/22例:一个外部无重入中断IRQ_Eint1Void_irqIRQHandle(void){Void(*p)(void);//定义一个函数指针intirq_no;//中断号uint32intpnd;//中断挂起号intpnd=rINTPND;//从中断挂起寄存器读取中断号//将中断挂起号转换为中断号for(irq_no=0;irq_no32;irq_no++){Intpnd=intpnd1;If(nitpnd==0)Break;}//利用函数指针取得中断服务程序的地址p=(void(*)(void)VICVectADD[irq_no];p();}在汇编语言中实现启动代码中,需要在异常向量表之前引入这个函数,所以要加入代码:IMPORTIRQHandlepage152020/5/22_irq这个关键字可实现进入中断处理函数时一些关键寄存器的自动保护和处理完毕后的自动返回,具体请见汇编和C的混合调用,因此接下来就是要编写中断处理函数了。VoidIRQ_Eint0(void){//中断处理函数}VoidIRQ_Eint1(void){//中断处理函数}编写完之后中断处理函数需要用两个语句来使其与IRQ异常处理函数建立联系VICVectADD[0]=(unit32)IRQ_Eint0VICVectADD[1]=(unit32)IRQ_Eint1注意:ARM有32个外部中断源,8-32占用一个IRQ源,因此要加语句进行判断,而且处理程序的最后要把中断标志位清除,以免系统不断的响应page162020/5/221、硬件自动过程;2、ISR过程;无高级任务激活返回有高级任务激活返回page172020/5/223.1uC/OS-II的中断uC/OS-II的中断过程在应用系统设计中编写uC/OS-II的中断服务程序(ISR)时,要用到两个重要的系统函数。OSIntEnter()、OSIntExit()uC/OS-II允许中断嵌套,最多可嵌套255层;系统全局变量OSIntNesting记录中断嵌套层数。page182020/5/223.1uC/OS-II的中断系统函数OSIntEnter()、OSIntExit()OSIntEnter()OSIntExit()函数原型:voidOSIntEnter(void)主要功能:系统变量OSIntNesting自加1,目的告诉uC/OS-II系统记录中断的嵌套层数。函数原型:voidOSIntExit(void)主要功能:系统变量OSIntNesting自减1,目的告诉uC/OS-II系统中断的嵌套层数,OSIntNesting==0时,则进行一次中断级的任务调度OSIntCtxSw()。P95page192020/5/223.1uC/OS-II的中断应用程序中的临界段临界段的基本概念及实现原理uC/OS-II提供了两个宏操作用于临界段工程应用中有“代码段必须被连续执行”的需求,这种不允许被打断执行的代码段称为“临界代码段”或“原子操作”。通过开关CPU中断来实现。OS_ENTER_CRITICAL()----进入临界段OS_EXIT_CRITICAL()----退出临界段注意事项:用户原子操作尽量的少且小,因为它会影响系统的实时性。page202020/5/22当处理临界段代码时,须关中断,处理完毕后,再开中断关中断时间是实时内核最重要的指标之一。它影响用户系统对实时事件的相应特性。在实际应用中,关中断的时间很大程度上取决于微处理器的结构和编译器生成的代码质量微处理器通常具有关中断/开中断操作。C编译器须具有某种机制,能够在c中直接实现关中断/开中断操作C源代码中插入汇编语言的语句,易实现关中断/开中断操作关中断/开中断操作作为语言的扩展部分,直接从C语言中可以关中断/开中断C/OS-II开关中断的方法page212020/5/22C/OS-II开关中断的方法(续1)C/OS-II定义了两个宏调用来开关中断:OS_ENTER_CRITICAL()(禁止中断的宏)OS_EXIT_CRITICAL()(启用中断的宏)通常成对出现上述宏定义取决于使用的微处理器。在文件OS_CPU.H有相应的宏定义在C/OS-II中,每种微处理器都有自己的OS_CPU.H文件page222020/5/22C/OS-II开关中断的方法(续2){..OS_ENTER_CRITICAL();/*C/OS-II临界段代码*/OS_EXIT_CRITICAL();..}如果在所有挂起类(PEND)调用之前,如:调用OSTimeDel()(挂起时间)功能函数之前关中断,会出现什么现象?通常,调用C/OS-II功能函数时,中断总应当是开放的。page232020/5/22C/OS-II开关中断的方法(续3)OS_ENTER_CRITICAL()及OS_EXIT_CRITICAL()可以用3种不同的方法实现具体方法取决于用户打算移植到的处理器的性能及所用的C编译器用定义(#define)常数OS_CRITICAL_METHOD可以选择具体使用哪种方法该常数在与CPU类型有关的移植文件OS_CPU.H中定义page242020/5/22OS_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种开关中断的方法page252020/5/22C/OS-II中采用了3种开关中断的方法(续1)OS_CRITICAL_METHOD==2在堆栈中保存中断的开/关状态,然后再关中断实现OS_ENTER_CRITICAL()时,先在堆栈中保存中断的开/关状态,然后再关中断实现OS_EXIT_CRITICAL()时,从堆栈中弹出原来中断的开/关状态利用这种机制,不论用户在调用C/OS-II功能函数之前中断是开或关,函数的进入和返回状态都得到了保护。即:调用前中断的开/关状态,在调用之后保持不变page262020/5/22C/OS-II中采用了3种开关中断的方法(续2)OS_CRITICAL_METHOD==3把当前处理器的状态字(PSW)保存在C函数的局部变量中(如OS_CPU_SR)关中断时保存,开中断时恢复page272020/5/22C/OS-II中采用了3种开关中断的方法(续3)VoidSome_uCOS_II_Service(arguments){OS_CPU_SRcpu_sr;cpu_sr=get_processor_psw();disabl
本文标题:μCOS Ⅱ嵌入式操作系统及开发课件-3
链接地址:https://www.777doc.com/doc-5518021 .html