[ARM7]

[求助]LPC2132+Keil 4.5切换处理器模式遇到的问题

[复制链接]
869|0
手机看帖
扫描二维码
随时随地手机跟帖
demornov|  楼主 | 2015-10-6 00:41 | 显示全部楼层 |阅读模式
本帖最后由 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

这个问题困扰我快半个月了,一直搞不懂原因,请懂的兄弟们不吝指教!感激不尽!

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝