最新微软官方MSDN原版Win10系统下载

当前位置:主页 > 系统教程 > Win7教程 >

uCOSII在ARM处理器上移植过程中的中断处理:lol外围

时间:2021-10-14    来源:lol外围APP    人气:

本文摘要:uCOSII是一个源码公开发表、可移植、可烧结、可剪裁和守住式的动态多任务操作系统,其大部分源码是用ANSIC撰写,与处理器硬件涉及的部分用于汇编语言撰写。总量大约200讫的汇编语言部分被传输到低于限度,以便于重制到任何一种其它的CPU上。uCOSII最少可反对56个任务,其内核为潘顿式,总是继续执行准备就绪态的优先级最低的任务,并反对Semaphore(信号量)、Mailbox(邮箱)、MessageQueue(消息队列)等多种常用的进程间通信机制。

lol外围

uCOSII是一个源码公开发表、可移植、可烧结、可剪裁和守住式的动态多任务操作系统,其大部分源码是用ANSIC撰写,与处理器硬件涉及的部分用于汇编语言撰写。总量大约200讫的汇编语言部分被传输到低于限度,以便于重制到任何一种其它的CPU上。uCOSII最少可反对56个任务,其内核为潘顿式,总是继续执行准备就绪态的优先级最低的任务,并反对Semaphore(信号量)、Mailbox(邮箱)、MessageQueue(消息队列)等多种常用的进程间通信机制。

与大多商用RTOS有所不同的是,uCOSII公开发表所有的源代码.并可以免费取得,只对商业应用于缴纳少量License费用。uCOSII重制跟OS_CUP_C.C、OS_CPU_A.S、OS_CPU.H3个文件有关,中断处置的重制占有了相当大一部分内容。作为重制的一个重点,本文以标准中断(IRQ)为事例辩论了重制中的中断处置。

1uCOSII系统结构uCOSII的软硬件体系结构如图1。应用程序正处于整个系统的顶层.每个任务都可以指出自己独霸了CPU,因而可以设计沦为一个无限循环。大部分代码是用于ANSIC语言书写的,因此uCOSII的可移植性较好。尽管如此,依然必须用于C和汇编语言写出一些处理器涉及的代码。

uCOSII的重制必须符合以下拒绝:1)处理器的C编译器可以产生可交接代码:可以用于C调用转入和解散CriticalCode(临界区代码);2)处理器必需反对硬件中断,并且必须一个定点中断源;3)处理器须要能容纳一定数据的硬件堆栈;4)处理器必需能在CPU寄存器与内存和堆栈互相交换数据的指令。重制uCOSII的主要工作就是处理器和编译器涉及代码以及BSP(BoardSupportPackage)的撰写。uCOSII处理器牵涉到的代码获取uCOSII的系统服务,应用程序可以用于这些API函数展开内存管理、任务间通信以及创立、移除任务等。2uCOSII重制过程中必须留意的几个问题uCOSII重制的中断处置跟ARM体系结构和uCOSII处置中断的过程有关,必需留意这2个方面的问题才能高效重制。

2.1ARM处理器7种操作者模式用户模式(USERMODE)是ARM一般来说继续执行状态,用作继续执行大多数应用程序;较慢中断模式(FIQMODE)反对数据传输或地下通道处置;中断模式(IRQMODE)用作标准化中断处置;超级用户模式(SVCMODE)是一种操作系统受保护的模式:数据终止模式(ABTMODE)指令预取指终止、数据终止时转入该模式;未定义模式(UNDMODE)当继续执行未定义的指令时转入该模式;系统模式(SYSMODE)是操作系统一种授权的用户模式。除了用户模式之外,其他模式都不属于特权模式,特权模式用作中断服务、出现异常或者采访受保护的资源。特权模式中除系统模式之外另5种模式又称作出现异常模式,在重制过程中必需设置中断向量表来处置出现异常。uCOSII的重制主要处置标准中断(IRQ)、较慢中断(FIQ)和软件中断(SWI)。

2.2uCOSII中断号召的过程以IRQ中断为事例,假设CRPS中I_bit位为0,当有IRQ中断时,CPU强迫转入IRQ模式,当前的CPSR拷贝到SPSR_irq中,PC值留存在LR_irq中,改置CPSR中的I位以重开IRQ中断。数据留存之后,CPU擅自从0X00000018开始继续执行,PC值留存了OS_CPU_IRQ_ISR()的地址,然后继续执行OS_CPU_IRQ_ISR()。

在OS_CPU_IRQ_ISR()中OS_CPU_IRQ_ISR_Handler()被调用来检测中断源并继续执行中断。OS_CPU_IRQ_ISR_Handler()回到以后,OS_CPU_IRQ_ISR()又调用OSIntExit()来证实否有比ISR优先级更高的任务要继续执行。如果当前中断任务依然是优先级最低的任务,OSIntExit()回到,OS_CPU_IRQ_ISR()弹头出有中断堆栈,如果优先级更高的任务必须继续执行,OSIntExit()调用OSIntCtxSw()继续执行优先级更高的任务。

2.3uCOSII的临界段代码uCOSII用于关口中断来维护临界代码。它定义了2个宏来进中断(OS_EXIT_CRITICAL()),关口中断(OS_ENTER_CRITICAL())。

OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()有3种方法来构建,uCOSII建议用于第3种方法可以留存当前处理器状态的值。3uCOSII重制过程中的中断处置uCOSII中断处置跟CRT.S、OS_CPU_A.S和BSP.C有关,其重制过程主要有以下几个步骤。3.1在CRT.S中设置中断向量表格ARM的中断向量表格坐落于ROM的最底部,其地址范围为0X00000000~0X0000001C,设置如下:VECTORS:LDRPC,RESET_ADDRLDRPC,UNDEF_ADDRLDRPC,SWI_ADDRLDRPC,PABT_ADDRLDRPC,DABT_ADDRNOP/*保有向量*/LDRPC,IRQ_ADDRLDRPC,FIQ_ADDRRESET_ADDR:.WORDRESET_HANDLERUNDEF_ADDR:.WORDUNDEFHANDLERSWI_ADDR:.WORDSWIHANDLERPABT_ADDR:.WORDPABT_HANDLERDABT_ADDR:.WORDDABT_HANDLER.WORD0/*保有地址*/IRQ_ADDR:.WORDIRQ_HANDLERFIQ_ADDR:.WORDFIQHANDLERUNDEF_HANDLER:BUNDEF_HANDLERSWI_HANDLER:BSWI_HANDLERPABT_HANDLER:BPABT_HANDLERDABT_HANDLER:BDABT_HANDLERIRQ_HANDLER:BOS_CPU_IRQ_ISR/*函数调用到OS_CPU_IRQ_ISR(在OS_CPU_A.S中)*/FIQ_HANDLER:BOS_CPU_FIQ_ISR/*函数调用到OS_CPU_FIQ_ISR(在OS_CPU_A.S中)*/这里设置了标准中断出现异常(IRQ)和较慢中断出现异常(FIQ)的中断入口,其余出现异常都设置为死循环,当再次发生这些出现异常的时候,必需使系统废黜才能解散死循环。

3.2重制中断任务转换中断任务转换(OSIntCtxSw)和任务转换函数(OSCtxSw)较为相近,主要有以下几步构成:1)调用OSTaskSwHook()2)OSPrioCur=OSPrioHighRdy3)OSTCBCur=OSTCBHighRdy4)SP=OSTCBHighRdy-OSTCBStkPtr//提供低优先级的任务堆栈指针5)从低优先级的任务的堆栈中弹出高优先级的任务上下文6)继续执行低优先级的任务3.3重制中断服务程序以IRQ中断为事例中断服务程序(OS_CPU_IRQ_ISR)主要依据上面所叙述的uCOSII中断号召的过程撰写,其主要代码如下:LDRR0,OS_IntNestingLDRBR1,[R0]ADDR1,R1,#1STRBR1,[R0]CMPR1,#lBNEOS_CPU_IRQ_ISR_1LDRR4,OS_TCBCurLDRR5,[R4]STRSP,[R5]OS_CPU_IRQ_ISR_1:MSRCPSR_c,#(NO_INT|IRQ32_MODE)//转换到SVC模式LDRR0,OS_CPU_IRQ_ISR_HandlerMOVLR,PCBXR0MSRCPSR_c,#(NO_INT|SVC32_MODE)//转换到SVC模式LDRR0,OS_IntExit//OSIntExit()MOVLR,PCBXR0在代码中省略了现场工作寄存器的维护与完全恢复及工作模式的转换。3.4重制中断处理程序以IRQ中断为事例,重制中断处理程序:C程序voidOS_CPU_IRQ_ISR_Handler(void){PFNCTpfnct;//定义中断函数指针pfnct=(PFNCT)VICVectAddr;//提供函数地址while(pfnct!=(PFNCT)0){(*pfnct)();//调用中断函数pfnct=(PFNCT)VICVectAddr;//提供新的中断函数}//所有中断都继续执行完解散}中断处理程序倚赖中断控制器的中断号召顺序,所以uCOSII把OS_CPU_IRQ_ISR_Handler()归属于用户程序的一部分。

在中断回到之前,中断处理程序要处置完了所有的中断号召,以防止在多个中断同时号召或中断处理过程中号召中断的情况下,转入OS_CPU_IRQ_ISR()和解散OS_CPU_IRQ_ISR()时,OS_CPU_IRQ_ISR()消耗留存CPU寄存器的堆栈空间。另外,在OS_CPU_IRQ_ISR_Handler()中不要清CPSR的I位来对外开放中断,因为没适当用于中断嵌套,OS_CPU_IRQ_ISR_Handler()在回到之前不会检查并处置所有的中断。3.5撰写中断函数中断函数一般使用C语言撰写,uCOSII建议中断函数不应尽可能较短,一般作法是在中断函数中缓存数据,给任务发送到一个信号来处置数据。中断函数的地址在系统初始化的时候要改置人中断向量寄存器(VICVectAddr0~15)。

由于向量中断控制器(VIC)的类似结构,在中断函数中要写出一次中断向量寄存器(VICVectAddr)。4中断处置的应用于示例uCOSII要获取周期性信号源,用作构建时间延时和证实超时。节奏亲率有误10~100Hz。

时钟节奏源可以由专门的硬件定时器产生,以下就以IRQ中断方式产生节奏源为示例。初始化中断控制器:C程序voidVICInit(void){VICIntEnClr=0xfffff;VICDefVectAddr=-(INT32U)Non_Vect_IRQ_Handler;VICVectAddr0=(INT32U)OSTickISR;VICVectCntl0=(0x20|0x04);VICIntEnable=14;}定时器0中断函数:C程序voidOSTickISR(void){TO_IR=0xff;OSTimeTick();//调用OSTimeTick()VICVectAddr=0;//通报中断控制器中断完结}当定点中断再次发生时调用OS_CPU_IRQ_ISRHandler(),获得OSTickISR()的地址并继续执行,在OSTickISR()中调用OSTimeTick()为uCOSII获取周期性信号源。此代码在GNU工具链ARM-GCC下编译器通过,并在EasyARM2100研发实验板上获得检验。5结束语通过示例描写了在uCOSII重制过程中的中断处置所必须留意的几个问题和标准化方法,经笔者在GNU工具链下编译器、调试,并在实验板上获得很好的检验。

这种重制方案的中断函数都用于C语言撰写,具备较好的移植性,不利于对有所不同市场需求的用户展开中断扩展,强化了中断嵌套时uCOSII运营的稳定性,使重制具备更佳的通用性。


本文关键词:lol外围,uCOSII,在,ARM,处理器,上,移植,过程,中的,中断

本文来源:lol外围-www.yumekatsu.com

相关文章

Win7教程排行榜

更多>>

U盘装系统排行榜

更多>>

系统教程排行榜

更多>>

公众号