cstartup.s文件<br />;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />;;<br />;; Part one of the system initialization code,<br />;; contains low-level<br />;; initialization.<br />;;<br />;; Copyright 2006 IAR Systems. All rights reserved.<br />;;<br />;; $Revision: 21638 $<br />;;<br /><br /> MODULE ?cstartup<br /><br /> ;; Forward declaration of sections.<br /> SECTION IRQ_STACK:DATA:NOROOT(3)<br /> SECTION FIQ_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 /><br />;<br />; The module in this file are included in the libraries, and may be<br />; replaced by any user-defined modules that define the PUBLIC symbol<br />; __iar_program_start or a user defined start symbol.<br />;<br />; To override the cstartup defined in the library, simply add your<br />; modified version to the workbench project.<br /><br /> SECTION .intvec:CODE:NOROOT(2)<br /><br /> PUBLIC __vector<br /> PUBLIC __iar_program_start<br /> PUBLIC __vector_0x14<br /> <br /> EXTERN undef_handler, swi_handler, prefetch_handler<br /> EXTERN data_handler, irq_handler, fiq_handler<br /> ARM ; Always ARM mode after reset <br />__vector:<br /> ldr pc,[pc,#24] ; Absolute jump can reach 4 GByte<br />__undef_handler:<br /> ldr pc,[pc,#24] ; Branch to undef_handler<br />__swi_handler:<br /> ldr pc,[pc,#24] ; Branch to swi_handler<br />__prefetch_handler:<br /> ldr pc,[pc,#24] ; Branch to prefetch_handler<br />__data_handler<br /> ldr pc,[pc,#24] ; Branch to data_handler<br />__vector_0x14<br /> dc32 0xFFFFFFFF<br />__irq_handler:<br /> ldr pc,[pc, #-0x0120] ; Branch to irq_handler<br />__fiq_handler:<br /> ldr pc,[pc,#24] ; Branch to fiq_handler<br /><br /> ; Constant table entries (for ldr pc) will be placed at 0x20<br /> dc32 __iar_program_start<br /> dc32 __undef_handler<br /> dc32 __swi_handler<br /> dc32 __prefetch_handler<br /> dc32 __data_handler<br /> dc32 0xFFFFFFFF<br /> dc32 0xFFFFFFFF<br /> dc32 __fiq_handler<br /><br />; --------------------<br />; Mode, correspords to bits 0-5 in CPSR<br /><br />MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR<br /><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 />CP_DIS_MASK DEFINE 0xFFFFFFF2<br /><br /> SECTION .text:CODE:NOROOT(2)<br /><br /> EXTERN ?main<br /> REQUIRE __vector<br /> EXTERN low_level_init<br /><br /> ARM<br /><br />__iar_program_start:<br />?cstartup:<br /><br />I_Bit DEFINE 0x80 ; when I bit is set, IRQ is disabled<br />F_Bit DEFINE 0x40 ; when F bit is set, FIQ is disabled<br /><br />#define VIC_INT_ENABLE 0xFFFFF014<br />; Disable all interrupts<br /> ldr r0,=VIC_INT_ENABLE<br /> mov r1,#0xFFFFFFFF<br /> str r1,[r0]<br /><br />; Execution starts here.<br />; After a reset, the mode is ARM, Supervisor, interrupts disabled.<br />; Initialize the stack pointers.<br />; The pattern below can be used for any of the exception stacks:<br />; FIQ, IRQ, SVC, ABT, UND, SYS.<br />; The USR mode uses the same stack as SYS.<br />; The stack segments must be defined in the linker command file,<br />; and be declared above.<br /><br /> mrs r0,cpsr ; Original PSR value<br /> bic r0,r0,#MODE_MSK ; Clear the mode bits<br /> orr r0,r0,#SVC_MODE ; Set Supervisor 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_MSK ; Clear the mode bits<br /> orr r0,r0,#UND_MODE ; Set Undefined mode bits<br /> msr cpsr_c,r0 ; Change the mode<br /> ldr sp,=SFE(UND_STACK) ; End of UND_MODE<br /> <br /> bic r0,r0,#MODE_MSK ; Clear the mode bits<br /> orr r0,r0,#ABT_MODE ; Set Data abort 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_MSK ; Clear the mode bits<br /> orr r0,r0,#FIQ_MODE ; Set FIR 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_MSK ; 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_MSK | I_Bit | F_Bit ; 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 />#ifdef __ARMVFP__<br />; Enable the VFP coprocessor.<br /> mov r0, #BASE_ARD_EIM ; Set EN bit in VFP<br /> fmxr fpexc, r0 ; FPEXC, clear others.<br /><br />; Disable underflow exceptions by setting flush to zero mode.<br />; For full IEEE 754 underflow compliance this code should be removed<br />; and the appropriate exception handler installed.<br /> mov r0, #0x01000000 ; Set FZ bit in VFP<br /> fmxr fpscr, r0 ; FPSCR, clear others.<br />#endif<br /><br />; Add more initialization here<br /><br /><br />; Continue to ?main for more IAR specific system startup<br /><br /> ldr r0,=?main<br /> bx r0<br /><br /> END<br /><br /><br />
|