|
我用的ADS1.2+ H-JTAG调试的LPC2364,AXD仿真的时候,<br />Vectors LDR PC, Reset_Addr ;0<br /> LDR PC, Undef_Addr ;4<br /> LDR PC, SWI_Addr ;8<br /> LDR PC, PAbt_Addr ;c<br /> LDR PC, DAbt_Addr ;10<br /> NOP ;14 Reserved Vector <br /><br />从Vectors行开始单步执行,LDR PC, Reset_Addr 执行之后不是跳转,而是顺序执行LDR PC, Undef_Addr,后面也全部相同,从Regisers窗口观察Current里的pc值,和指令相对应,00>04>08>0c。之前还有遇到就是进入main()后,一部分函数执行完毕后,继续执行剩下的函数,结果到函数返回的‘}’后,有时候跳到数据或指令异常,或跳到main()后紧跟的那个'{'行首,感觉很怪异,想不出什么解决办法,感觉和启动代码,或者scatter文件相关。<br />启动代码:<br /> PRESERVE8<br /> <br />; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs<br /><br />Mode_USR EQU 0x10<br />Mode_FIQ EQU 0x11<br />Mode_IRQ EQU 0x12<br />Mode_SVC EQU 0x13<br />Mode_ABT EQU 0x17<br />Mode_UND EQU 0x1B<br />Mode_SYS EQU 0x1F<br /><br />I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled<br />F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled<br /><br />;// <h> Stack Configuration (Stack Sizes in Bytes)<br />;// <o0> Undefined Mode <0x0-0xFFFFFFFF:8><br />;// <o1> Supervisor Mode <0x0-0xFFFFFFFF:8><br />;// <o2> Abort Mode <0x0-0xFFFFFFFF:8><br />;// <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8><br />;// <o4> Interrupt Mode <0x0-0xFFFFFFFF:8><br />;// <o5> User/System Mode <0x0-0xFFFFFFFF:8> <br />;// </h><br /><br />;定义堆栈的大小,最终工作在系统模式,栈名StackUsr,只给了起始位置,未指定大小<br />SVC_STACK_LEGTH EQU 0 ;单位为字<br />FIQ_STACK_LEGTH EQU 0<br />IRQ_STACK_LEGTH EQU 512<br />ABT_STACK_LEGTH EQU 0<br />UND_STACK_LEGTH EQU 0<br /><br />;USR_STACK_LEGTH EQU 1024 ;设定用户模式栈<br /><br />Heap_Size EQU 1024<br /><br /> IMPORT __use_no_semihosting_swi<br /> IMPORT __use_two_region_memory<br /><br /> IMPORT TargetResetInit<br /> IMPORT FIQ_Exception<br /> IMPORT __main<br /> <br />;The emported labels<br />;给外部使用的标号在这声明<br />; EXPORT bottom_of_heap<br /> EXPORT bottom_of_Stacks<br />; EXPORT top_of_heap<br /> EXPORT StackUsr <br /> EXPORT Reset_Handler<br /> EXPORT __user_initial_stackheap<br /> <br />; Area Definition and Entry Point<br />; Startup Code must be linked first at Address at which it expects to run.<br /><br /> CODE32<br /> AREA RESET, CODE, READONLY<br /> ENTRY<br /><br />; Exception Vectors<br />; Mapped to Address 0.<br />; Absolute addressing mode must be used.<br />; Dummy Handlers are implemented as infinite loops which can be modified.<br /><br />Vectors LDR PC, Reset_Addr ;0<br /> LDR PC, Undef_Addr ;4<br /> LDR PC, SWI_Addr ;8<br /> LDR PC, PAbt_Addr ;c<br /> LDR PC, DAbt_Addr ;10<br /> NOP ;14 Reserved Vector <br /> ;LDR PC, IRQ_Addr <br /> LDR PC, [PC, #-0x0120] ;18 Vector from VicVectAddr<br /> LDR PC, FIQ_Addr ;1c<br /><br />Reset_Addr DCD Reset_Handler ;20<br />Undef_Addr DCD Undef_Handler ;24<br />SWI_Addr DCD SWI_Handler ;28<br />PAbt_Addr DCD PAbt_Handler ;2c<br />DAbt_Addr DCD DAbt_Handler ;20<br /> DCD 0xB9206E28 ;34 Reserved Address <br />IRQ_Addr DCD IRQ_Handler ;38<br />FIQ_Addr DCD FIQ_Handler ;3c<br /><br />Undef_Handler B Undef_Handler ;40<br />SWI_Handler B SWI_Handler ;44<br />PAbt_Handler B PAbt_Handler ;48<br />DAbt_Handler B DAbt_Handler ;4c <br />IRQ_Handler B IRQ_Handler ;40<br />FIQ_Handler B FIQ_Handler ;44 <br /> <br />Reset_Handler <br />; Enter Undefined Instruction Mode and set its Stack Pointer<br /> MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit<br /> LDR SP, StackUnd<br /><br />; Enter Abort Mode and set its Stack Pointer<br /> MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit<br /> LDR SP, StackAbt<br /><br />; Enter FIQ Mode and set its Stack Pointer<br /> MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit<br /> LDR SP, StackFiq<br /><br />; Enter IRQ Mode and set its Stack Pointer<br /> MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit<br /> LDR SP, StackIrq<br /><br />; Enter Supervisor Mode and set its Stack Pointer<br /> MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit<br /> LDR SP, StackSvc<br /><br />; Enter Sys Mode and set its Stack Pointer<br />; MSR CPSR_c, #Mode_SYS:OR:I_Bit:OR:F_Bit<br />; LDR SP, StackSys<br /><br />; Enter User Mode and set its Stack Pointer<br />; MSR CPSR_c, #Mode_USR <br /> MSR CPSR_c, #Mode_SYS:OR:F_Bit<br /> LDR SP, =StackUsr<br /> <br /> BL TargetResetInit <br />; Enter the C code<br /> LDR R0, =__main<br /> BX R0<br />; B __main<br /><br />;// <h> Heap Configuration<br />;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF><br />;// </h><br /><br />; User Initial Stack & Heap<br />; AREA |.text|, CODE, READONLY<br />__user_initial_stackheap <br /> LDR R0,=bottom_of_heap ;heap基地址<br /> LDR r1,=StackUsr ;栈基地址<br /> LDR r2,=top_of_heap ;heap长度限制值<br /> LDR r3,=bottom_of_Stacks ;栈长度限制值<br /> MOV pc,lr<br /> <br />StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4<br />StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4<br />StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4<br />StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4<br />StackUnd DCD UndStackSpace + (UND_STACK_LEGTH - 1)* 4<br /><br /> IF :DEF: EN_CRP<br /> IF . >= 0x1fc<br /> INFO 1,"\nThe data at 0x000001fc must be 0x87654321.\nPlease delete some source before this line."<br /> ENDIF<br />CrpData<br /> WHILE . < 0x1fc<br /> NOP<br /> WEND<br />CrpData1<br /> DCD 0x87654321 ;/*When the Data is 为0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */<br /> ENDIF<br /> <br />;/* 分配堆栈空间 */<br /> AREA MyStacks, DATA, NOINIT, ALIGN=2<br />SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;Stack spaces for Administration Mode 管理模式堆栈空间<br />IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;Stack spaces for Interrupt ReQuest Mode 中断模式堆栈空间<br />FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;Stack spaces for Fast Interrupt reQuest Mode 快速中断模式堆栈空间<br />AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend Mode 中止义模式堆栈空间<br />UndStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 未定义模式堆栈<br /><br /> AREA Heap, DATA, NOINIT, ALIGN=3<br />bottom_of_heap SPACE 1<br /><br /> AREA StackBottom, DATA, NOINIT, ALIGN=3<br />bottom_of_Stacks SPACE 1<br /><br /> AREA HeapTop, DATA, NOINIT, ALIGN=3<br />top_of_heap SPACE 1 <br /><br /> AREA Stacks, DATA, NOINIT, ALIGN=3<br />StackUsr SPACE 1 <br /><br /> END<br /><br />scatter文件:<br />ROM_LOAD 0x0<br />{<br /> ROM_EXEC 0x0<br /> {<br /> Startup_a.o (RESET, +First)<br /> * (+RO)<br /> }<br /><br /> ERAM 0x40000000 UNINIT<br /> {<br /> * (+RW,+ZI)<br /> } <br /> <br /> MYSTACKS +0 UNINIT<br /> {<br /> Startup_a.o (MyStacks)<br /> } <br /><br /> HEAP +0 UNINIT <br /> {<br /> Startup_a.o (Heap)<br /> }<br /> <br /> HEAP_BOTTOM +256 UNINIT <br /> {<br /> Startup_a.o (HeapTop)<br /> }<br /> <br /> USERSTACKS +0 UNINIT<br /> {<br /> Startup_a.o (StackBottom)<br /> } <br /> <br /> STACKS_BOTTOM 0x40002000 UNINIT ;//LPC2364<br /> {<br /> Startup_a.o (Stacks)<br /> } <br />}<br /><br />启动代码和scatter文件都是仿照ZLG2200模板写的。<br /> |
|