启动代码定位问题
我用IAR5.2的环境,想让编译的代码整个放到不是0x00地址处(例如0x2000),设置完相应的.icf文件,可是编译后发现发现,真正的代码段是放到了0x2000处,但是cstartup.s的中断向量表还是从0x00处开始的,请问怎么样才能使cstartup.s的中断向量表从0x2000处开始。<br />以下为cstartup.s源文件:<br /><br />;********************************************************************************************************<br />; MACROS AND DEFINIITIONS<br />;********************************************************************************************************<br /><br /> ; Mode, correspords to bits 0-5 in CPSR<br />MODE_BITS DEFINE 0x1F ; Bit mask for mode bits in CPSR<br />USR_MODE DEFINE 0x10 ; User mode<br />FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode<br />IRQ_MODE DEFINE 0x12 ; Interrupt Request mode<br />SVC_MODE DEFINE 0x13 ; Supervisor mode<br />ABT_MODE DEFINE 0x17 ; Abort mode<br />UND_MODE DEFINE 0x1B ; Undefined Instruction mode<br />SYS_MODE DEFINE 0x1F ; System mode<br /> <br /><br />;********************************************************************************************************<br />; ARM EXCEPTION VECTORS<br />;********************************************************************************************************<br /><br /> SECTION .intvec:CODE:NOROOT(2)<br /> PUBLIC __vector<br /> PUBLIC __iar_program_start<br /><br /> IMPORT OS_CPU_ARM_ExceptUndefInstrHndlr<br /> IMPORT OS_CPU_ARM_ExceptSwiHndlr<br /> IMPORT OS_CPU_ARM_ExceptPrefetchAbortHndlr<br /> IMPORT OS_CPU_ARM_ExceptDataAbortHndlr<br /> IMPORT OS_CPU_ARM_ExceptIrqHndlr<br /> IMPORT OS_CPU_ARM_ExceptFiqHndlr<br /><br /> ARM<br /><br />__vector:<br /> LDR PC, ; Absolute jump can reach 4 GByte<br /> LDR PC, ; Branch to undef_handler<br /> LDR PC, ; Branch to swi_handler<br /> LDR PC, ; Branch to prefetch_handler<br /> LDR PC, ; Branch to data_handler<br />__vector_0x14:<br /> DC32 0 ; Reserved<br /> LDR PC, ; Branch to irq_handler<br /> LDR PC, ; Branch to fiq_handler<br /><br /><br /> DC32 __iar_program_start<br /> DC32 OS_CPU_ARM_ExceptUndefInstrHndlr<br /> DC32 OS_CPU_ARM_ExceptSwiHndlr<br /> DC32 OS_CPU_ARM_ExceptPrefetchAbortHndlr<br /> DC32 OS_CPU_ARM_ExceptDataAbortHndlr<br /> DC32 0<br /> DC32 OS_CPU_ARM_ExceptIrqHndlr<br /> DC32 OS_CPU_ARM_ExceptFiqHndlr<br /><br /><br />;********************************************************************************************************<br />; LOW-LEVEL INITIALIZATION<br />;********************************************************************************************************<br /><br /> SECTION FIQ_STACK:DATA:NOROOT(3)<br /> SECTION IRQ_STACK:DATA:NOROOT(3)<br /> SECTION SVC_STACK:DATA:NOROOT(3)<br /> SECTION ABT_STACK:DATA:NOROOT(3)<br /> SECTION UND_STACK:DATA:NOROOT(3)<br /> SECTION CSTACK:DATA:NOROOT(3)<br /> SECTION text:CODE:NOROOT(2)<br /> REQUIRE __vector<br /> EXTERN ?main<br /> PUBLIC __iar_program_start<br /> EXTERN lowlevel_init<br /><br />__iar_program_start:<br /><br />;********************************************************************************************************<br />; STACK POINTER INITIALIZATION<br />;********************************************************************************************************<br /><br /> MRS r0,cpsr ; Original PSR value<br /> BIC r0,r0,#MODE_BITS ; Clear the mode bits<br /> ORR r0,r0,#SVC_MODE ; Set SVC mode bits<br /> MSR cpsr_c,r0 ; Change the mode<br /> LDR sp,=SFE(SVC_STACK) ; End of SVC_STACK<br /><br /> BIC r0,r0,#MODE_BITS ; Clear the mode bits<br /> ORR r0,r0,#UND_MODE ; Set UND mode bits<br /> MSR cpsr_c,r0 ; Change the mode<br /> LDR sp,=SFE(UND_STACK) ; End of UND_STACK<br /><br /> BIC r0,r0,#MODE_BITS ; Clear the mode bits<br /> ORR r0,r0,#ABT_MODE ; Set ABT mode bits<br /> MSR cpsr_c,r0 ; Change the mode<br /> LDR sp,=SFE(ABT_STACK) ; End of ABT_STACK<br /><br /> BIC r0,r0,#MODE_BITS ; Clear the mode bits<br /> ORR r0,r0,#FIQ_MODE ; Set FIQ mode bits<br /> MSR cpsr_c,r0 ; Change the mode<br /> LDR sp,=SFE(FIQ_STACK) ; End of FIQ_STACK<br /><br /> BIC r0,r0,#MODE_BITS ; Clear the mode bits<br /> ORR r0,r0,#IRQ_MODE ; Set IRQ mode bits<br /> MSR cpsr_c,r0 ; Change the mode<br /> LDR sp,=SFE(IRQ_STACK) ; End of IRQ_STACK<br /><br /> BIC r0,r0,#MODE_BITS ; Clear the mode bits<br /> ORR r0,r0,#SYS_MODE ; Set System mode bits<br /> MSR cpsr_c,r0 ; Change the mode<br /> LDR sp,=SFE(CSTACK) ; End of CSTACK<br /><br /><br />;********************************************************************************************************<br />; ADDITIONAL INITIALIZATION<br />;********************************************************************************************************<br /><br /><br />;********************************************************************************************************<br />; CONTINUE TO ?main FOR ADDITIONAL INITIALIZATION<br />;********************************************************************************************************<br /><br /> LDR r0,=?main<br /> BX r0<br /><br /> END这个问题解决了,新问题又出现了
如果0x00处放了一个别的程序(例如Boot)的中断向量表,但是现在用程序的中断向量表被放到0x2000处。程序的运行流程为:先从Boot启动,然后跳至0x2000处运行应用程序代码,如果此时有中断产生,那么会跑到哪个地方的中断向量表呢?自己顶吧
调试的时候发现是回到Boot的中断向量表中。<br />现在想问:AT91SAM7X系列的ARM难道产生中断后必须先去找中断向量表?而不是像LPC系统的ARM,如果定义了向量中断,产生中断时就不需要去找中断向量表。是通过boot处的向量表再跳转到应用程序处吧
ARM的异常产生时都会跑到0地址开始的地方的。
一般情况下中断向量表都是从0起始
一般情况下中断向量表都是从0起始。<br />如果一定要在0x2000,可以二次跳转中断。
页:
[1]