uCOSII复制中的中断处理-欧宝体育

//提供新的中断功能}//所有中断继续执行并解散}中断处理程序依赖于中断控制器的中断调用顺序,所以uCOSII属于OS_CPU_IRQ_ISR_Handler()属于用户程序的一部分。//通知中断控制器中断结束}当定点中断再次发生时,调用OS_CPU_IRQ_ISRHandler(),获取ostickSr()的地址并继续执行,调用ostickSr()中的OSTimeTick(),获取uCOSII的周期信号源。

本文摘要://提供新的中断功能}//所有中断继续执行并解散}中断处理程序依赖于中断控制器的中断调用顺序,所以uCOSII属于OS_CPU_IRQ_ISR_Handler()属于用户程序的一部分。//通知中断控制器中断结束}当定点中断再次发生时,调用OS_CPU_IRQ_ISRHandler(),获取ostickSr()的地址并继续执行,调用ostickSr()中的OSTimeTick(),获取uCOSII的周期信号源。

继续执行

UCOSII是一个动态的多任务操作系统,其源代码是公开发布的、可移植的、可移植的、可裁剪的和可保存的。它的源代码大部分是用ANSIC写的,与处理器硬件相关的部分是用汇编语言写的。总量在200份左右的汇编语言部分在限额以下传输,以便在任何其他CPU上复制。UCOSII可以反对至少56个任务,它的内核是Pan Dun,它总是继续执行就绪状态下优先级最低的任务,它反对信号量、邮箱、消息队列等很多常见的进程间通信机制。

与大多数商业RTOS不同,uCOSII公开发布所有源代码,这些源代码可以免费获得,并且只为商业应用支付少量许可费。uCOSII的复制与OS_CUP_C.C,OS_CPU_A.S,OS_CPU有关。

H3,而中断处理的再现占据了很大一部分内容。作为复制的一个关键点,本文以IRQ为例讨论了复制中的中断处理。

1uCOSII系统架构uCOSII软硬件架构如图1所示。该应用程序位于整个系统的顶部。每个任务都可以指出它支配着CPU,所以可以设计成无限循环。大部分代码都是用ANSIC语言写的,所以uCOSII是可移植的。

尽管如此,写一些与处理器相关的代码,必须用C语言和汇编语言。uCOSII的复制必须满足以下拒绝条件:1)处理器的c编译器可以产生可转移代码:可以用于c调用转移和化解CriticalCode2)处理器必须反对硬件中断,必须有定点中断源;3)处理器需要能容纳一定数据的硬件栈;4)处理器必须能够在CPU寄存器、内存和堆栈之间交换数据指令。复制uCOSII的主要工作是编写处理器和编译器以及BSP(BoardSupportPackage)中涉及的代码。uCOSII处理器中涉及的代码得到uCOSII的系统服务,应用程序可以用于这些API函数扩展内存管理、任务间通信、创建和删除任务等。

模式

2 uCOSII繁殖过程中必须注意的几个问题。ucosii再现的中断处理与ARM架构和uCOSII处理中断的过程有关。这两个问题需要引起重视,才能高效地再现。2.1 ARM处理器USERMODE的七种操作员模式是ARM一般继续执行的状态,用于继续执行大多数应用;慢中断模式(FIQMODE)反对数据传输或地下通道处置;中断模式(IRQMODE)作为标准化的中断处理;超级用户模式(SVCMODE)是一种操作系统受保护的模式:数据终止模式(ABTMODE)指示预取终止,当数据终止时,转入该模式;未定义模式(undefine mode)在未定义指令继续执行时转移到该模式;系统模式是操作系统的授权用户模式。

除了用户模式以外,其他模式都不是特权模式,特权模式用于中断服务、产生异常或访问受保护的资源。在特权模式下,除系统模式外的其他五种模式也称为异常模式。

在再现过程中,必须设置中断向量表来处理异常情况。uCOSII的复制主要处理标准中断(IRQ)、慢速中断(FIQ)和软件中断(SWI)。

2.2 ucosii中断调用过程以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用于网关中断,维护关键代码。它定义了两个宏:入口中断(OS_EXIT_CRITICAL())和门中断(OS_ENTER_CRITICAL())。OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()有三种构建方式,uCOSII建议第三种方式可以保留当前处理器状态的值。

3 uCOSII再现过程中的中断处理uCOSII中断处理与CRT有关。S,OS_CPU_A.S和BSP。c,而复制过程主要包括以下步骤。

3.1在阴极射线管中设置中断向量表。s ARM的中断向量表位于ROM底部,地址范围为0X00000000 ~ 0X0000001C。设置如下:Vectors:LDRPC、reset _ addrlRPC、undef _ addrlRPC、swi _ addrlRPC、Pabt _ addrlrpc、dabt _ addr nop/* hold vector */ldrpc、IRQ _ addrlrpc、FIQ _ ADDRRESET _ ADDR:word reset _ HANDLERUNDEF _ addr :WORDUNDEFHANDLERSWI_ADDR:WORDSWIHANDLERPABT_ADDR:WORDPABT_HANDLERDABT_ADDR:WORD DABT_HANDLER。WORD0/*保留地址*/IRQ_ADDR:WORDIRQ_HANDLERFIQ_ADDR:*函数调用os _ CPU _ IRQ _ ISR(在OS_CPU_A.S中)*/FIQ _ handler:Bos _ CPU _ FIQ _ ISR/*函数调用OS_CPU_IRQ_ISR当这些异常再次发生时,有必要禁用系统来消除无限循环。

中断

3.2再现中断任务转换中断任务转换(OSIntCtxSw)和任务转换功能(OSCtxSw)类似, 主要由以下几个步骤组成:1)调用ostras swhook()2)osporiocur=osporiohighrdd 3)ostcbcur=ostcbhighlydy 4)sp=ostcbhighlydy-ostcbstkptr//提供一个低优先级任务栈指针5)从低优先级任务栈中弹出一个高优先级任务上下文6)继续执行低优先级任务3.3中断服务程序的重现以IRQ中断为例中断服务程序(OS_CPU_IRQ_ISR)主要是按照uCOSII的程序编写的其主要代码如下:ldr0、OS _ intuningldrbr1、[r0] addr1、r1、# 1strr1、[r0] cmpr1、# lbneos _ CPU _ IRQ _ ISR _ 1LDRR04、OS _ tcbcurrdr5、[R4] strsp、[r5]OS _ CPU _ IRQ _ ISR _ 1: mscpsr _ c、#(no _ int | IRQ 32 _ mode)//转换到SVC模式ldr Os _ CPU _ IRQ _ ISR _ handlermovlr OS _ intexit//ositexit()mov lr,pcbxr0省略了代码中字段工作寄存器的维护和完全恢复以及工作模式的转换。3.4中断处理程序的重现以IRQ中断为例,重现中断处理程序:C程序void OS _ CPU _ IRQ _ ISR _ Handler(void){ pfnctpnct;//定义中断函数指针PFNCT=(PFNCT)vicvecddr;//提供函数地址while(pfnct!=(PFNCT)0){(* . PFNCT)();//调用中断函数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建议中断函数不要尽可能短。

通常的做法是在中断函数中缓存数据,并向任务发送信号来处理数据。当系统初始化时,中断功能的地址应该被改变到中断向量寄存器(vicvectadr0 ~ 15)。

由于向量中断控制器(VIC)的结构相似,中断向量寄存器(VICVectAddr)应该在中断函数中写入一次。4中断处理实例uCOSII的应用需要获取周期信号源,作为施工延时和确认超时。10 ~ 10~100Hz错节奏亲率。

时钟节奏源可以由一个特殊的硬件定时器产生。下面是一个通过IRQ中断生成节奏源的例子。初始化中断控制器:c程序voitvicinit(void){ vicentin clr=0x fffff;vicdefvecddr=-(INT32U)Non _ Vect _ IRQ _ Handler;vicvecttaddr 0=(INT32U)osticlsr;vicvectntl 0=(0x 20 |0x 04);VICIntEnable=14}定时器0中断功能:c程序void(void){ to _ IR=0xff;OSTimeTick();//调用OSTimeTick()vicvecddr=0;//通知中断控制器中断结束}当定点中断再次发生时,调用OS _ CPU _ IRQ _ ISRHandler(),获取ostick Sr()的地址并继续执行,调用ostick Sr()中的OSTimeTick(),获取uCOSII的周期信号源。

该代码通过了GNU工具链ARM-GCC下的编译器,并在EasyARM2100 R&D实验板上进行了测试。5.结论通过实例描述了uCOSII复制过程中必须注意的几个问题和标准化方法。作者在GNU工具链下进行编译和调试,在实验板上得到了很好的测试。

这种重现方案的中断功能全部用C语言编写,移植性好,不利于针对不同市场需求的用户进行中断扩展,加强了中断嵌套时uCOSII操作的稳定性,使重现具有更好的通用性。

本文关键词:欧宝体育,函数,再现,中断

本文来源:欧宝体育-www.viagraaga.com

相关文章

网站地图xml地图