UCOS-II系统使用FIQ中断

有些产品需要及时检测外部的输入信号,这时要采用中断。LPC2214的中断分为FIQ和IRQ.FIQ可以嵌套IRQ中断。把需要及时处理的输入信号配置成FIQ中断。

ARM中设计FIQ中断是为了在快速处理的场合使用。如果也在FIQ里面进行任务调度则需要对任务状态进行保存和恢复处理。这样和用IRQ相比,优势并不明显。

在移植时为了加快FIQ处理,在FIQ里面不进行任务调度,仅仅是按照ATPCS的规定,保存一些不被用户FIQ处理程序保护的寄存器,然后调用用户FIQ处理子程序。调用完毕后恢复不被用户FIQ处理子程序保护的寄存器,退出。

在FIQ中断地址0x0000001c处定义

LDR PC,FIQ_ADDR

FIQ_Addr DCD FIQ_Handler

FIQ_Handler

STMFD SP!, {R0-R3, LR} ; 入栈

BL FIQ_Exception ; 调快速中断程序

LDMFD SP!, {R0-R3, LR} ; 出栈

SUBS PC, LR, #4 ; 返回当初的地址

在发生FIQ中断时,ARM硬件进入FIQ异常模式,禁止IRQ,FIQ中断,跳转到0x0000001c处执行。也就是开始执行FIQ_Handler函数。

void FIQ_Exception(void)

{

……

}

就是FIQ中断处理函数。

在ARM里移植了UCOS-II系统时,使用FIQ有几个地方需要注意。

FIQ中断要保证及时处理,F标志始终不能置1,在os_cpu_a.s文件中。

OS_CPU_IRQ_ISR函数中

会进行模式切换,在切换到系统模式和IRQ模式时

MSR CPSR_c, #(NOINT1 :OR: IRQMODE)

MSR CPSR_c, #(NOINT1 :OR: SYSMODE)

NOINT1应该为0x80.只关闭IRQ中断。如果关闭FIQ中断,在执行IRQ中断函数时,FIQ中断将被屏蔽。

OS_ENTER_CRITICAL ()对应的OSCPUSaveSR函数中,也不能关闭FIQ中断。

ORR R1,R0,#NOINT1

NOINT1应为0x80,如果关闭FIQ中断,在临界区执行时,FIQ中断也会被屏蔽。

移植过程中只要注意F标志必须始终为0就可以了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注