本帖最后由 demornov 于 2015-10-6 00:50 编辑
Hi, All
小弟遇到个百思不得其解的问题,具体是这样的:
1). 执行一段汇编代码(Arm7的IRQ Handler),里面会调用1个C语言程序:
;/**************************Interrupt Handler*************************/
PRESERVE8 ; 8-Byte aligned Stack
AREA IRQ_Area, CODE, READONLY
ARM
EXPORT IRQ_Handler
IMPORT __ManageInt ;这个C函数是我要调用的,带有一个参数(IRQ_BIND)
IMPORT IRQ_BIND ; __ManageInt的参数
IRQ_Handler
STMFD SP!, {R0-R12, LR}
LDR R0, =IRQ_BIND
BL __ManageInt
LDMFD SP!, {R0-R12, LR}
B __IntCtxSw
;/********************************************************************/
2). __IntCtxSw里面会切换处理器的模式:
;/**********************Interrupt Context Switch**********************/
PRESERVE8 ; 8-Byte aligned Stack
AREA Int_Ctx_Sw_Area, CODE, READONLY
ARM
EXPORT __IntCtxSw
__IntCtxSw
;1. Store CPU Registers, First: R4-R12, R14, CPSR, PC; Second: R0-R3
STMFD SP!, {R0-R3} ; Store R0-R3 In IRQ Stack
MRS R0, SPSR ; Store CPSR In R0
MOV R1, LR ; Store PC In R1
MSR CPSR_c, #Mode_SYS ; Enter System Mode,到这里应该要切换处理器模式, 但就是切换不了,一直在IRQ模式
3). 老版本的程序用的是__TimeTick(原形:void __TimeTick(void)),现在改调用__ManageInt(原形:void __ManageInt(INTBIND))就有了这个问题,难道说IRQ程序的模式切换和函数类型有关?
;/**************************Interrupt Handler*************************/
PRESERVE8 ; 8-Byte aligned Stack
AREA IRQ_Area, CODE, READONLY
ARM
EXPORT IRQ_Handler
IMPORT __TimeTick
IRQ_Handler
STMFD SP!, {R0-R12, LR}
BL __TimeTick ;调用这个函数可以切换处理器模式
LDMFD SP!, {R0-R12, LR}
B __IntCtxSw
4). 在IRQ_Handler里面调用MSR CPSR_c, #xxxx, 还是不能切换模式:
PRESERVE8 ; 8-Byte aligned Stack
AREA IRQ_Area, CODE, READONLY
ARM
EXPORT IRQ_Handler
IMPORT __ManageInt
IMPORT __TimeTick
IMPORT IRQ_BIND
IMPORT TASK_SW_ON
IRQ_Handler
STMFD SP!, {R0-R12, LR}
MSR CPSR_c, #Mode_SYS ;这里也切换不了模式,一执行就重新进入IRQ中断。。。。。
LDR R0, =IRQ_BIND
BL __ManageInt
LDMFD SP!, {R0-R12, LR}
B __IntCtxSw
这个问题困扰我快半个月了,一直搞不懂原因,请懂的兄弟们不吝指教!感激不尽! |