Arm Lin" />

周立功ARM调试心得

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

周立功ARM调试心得

2008-9-11调试"SmartARM2200 V2.02实验箱"心得:

1、在调试"E:\htwang\smart2200v201\ARM嵌入式系统实验教程(二)\开发板出厂编程程序\液晶显示程序\LCM_Disp"的程序时,想使用外部RAM进行仿真调试,在将ADS1.2中的"DebugInExram Settings->Arm Linker -> Output -> Equivalent Command Line"的"-info totals -entry 0x8100000 -scatter .\src\mem_b.scf"改为"-info totals -entry 0x80000000 -scatter .\src\mem_b.scf"时,编译时总是出现错误信息"Error: L6206E: Entry point(0x80000000) lies outside the images",经梁工(宝琼)提示:"这是由于程序空间超出范围,需要改一个参数。"

打开关于外部RAM调试的分散加载文件"mem_b.scf"发现所有的程序调试地址都是指向0x81000000的Flash地址空间,而不是0x80000000的RAM地址空间(此时硬件电路板上的短路片RAM接CS0、Flash接CS1),后把0x81******全部改为0x80******,编译调试都正常。

2、不正常现象:在调试"SmartARM2200 V2.02"实验箱时,每次实验箱断电或实验箱上复位按键后,H-Flash的Load操作都要重新执行一遍(或者简单一点:只要在H-Flash -> Programming -> Check 按钮上点击一下也可以),否则下载程序后实验箱运行不了。

(先是在选用DebugInExram出现这种情况,后选用RelOutChip则不会出现这种情况。)

<2008-9-12> 另外,每次重新启动H-JTAG和H-Flash后,都要将H-Flash重新设一遍。

3、现象:在调试GB_Disp工程时,程序无法正常运行。

分析:当调试的程序中包含中断时,分散加载文件"mem_*.scf"的"IRAM "项设置不能从0x40000000开始,而应该从0x40000040开始(给中断向量留下空间),否则程序无法调试。(先是在选用RelOutChip出现这种情况,后选用DebugInExram也出现这种情况。)

< 2008-9-12 htwang注: 上面的解释并不正确,因为在调试其他中断实验的过程中,配置文件"mem_*.scf"的"IRAM "项设置成从0x40000000开始也可以正常运行。(估计可能是存储器映射的问题)

打开GB_Disp工程"target.c"文件,果然发现在函数"void TargetResetInit(void)"中将存储器映射寄存器初始化成"MEMMAP =0x2",这是选用的用户RAM模式,中断向量也从静态RAM重新映射。如果想映射到用户外部存储器模式,应该改为"MEMMAP =0x3"(见《ARM嵌入式系统基础教程》P166 或《深入浅出ARM7-LPC2200》P119)。按此方式更改后,实际调试也正常。

>

(2008-9-12)结论:要么把该工程文件"mem_bscf"中的"IRAM "项改成从0x40000040开始;要么把该工程文件"target.c"中的存储器映射初始化为"MEMMAP =0x3"。

4、在调试中断程序时,如果使用IRQ.S中的汇编宏定义程序和"IRQ_Eint3_Handler HANDLER IRQ_Eint3"代替原来的C语言函数中断方式(当然同时将代码"VICVectAddr0 = (uint32)IRQ_Eint3;"改为"VICVectAddr0 = (uint32)IRQ_Eint3_Handler; "),则应将C语言中断函数"void __irq IRQ_Eint3(void)"改写成"void IRQ_Eint3(void)"。

否则调试是出现的情况就是程序在"IRQ_Eint3_Handler HANDLER IRQ_Eint3"和中断函数"void __irq IRQ_Eint3(void){}"里面反复执行,再也退不出来。

2008-9-12调试"SmartARM2200 V2.02实验箱"心得:

5、现象:在自己编写定时器中断程序时,如果自己用工程模板"ARM Executable Image for lpc2200"建立工程并编写中断程序后,调试过程中总是不能进入中断,但是用定时中断的事例程序可以进入。

原因:经将自己建立的模板工程文件中的"Startup.s"文件和事例程序中的比较,发现在模板工程的"Startup.s"文件中的堆栈初始化代码"InitStack "中有一行语句为:

;设置系统模式堆栈

MSR CPSR_c, #0xdf

LDR SP, =StackUsr

这就将IRQ和FIQ都禁止了,需要将"MSR CPSR_c, #0xdf"改为"MSR CPSR_c, #0x5f"来打开IRQ中断才行。

6、现象:用C语言编写中断函数时,如void __irq Timer0Int(void){ },该中断函数必须放在主函数main()的上方,否则编译时会出现错误(因为主函数需要调用语句"VICVectAddr0 = (uint32)Timer0Int;"):

1)Error: (Serious) C2933E: type disagreement for "Timer0Int"

2) Error: C2456E: undeclared name, inventing 'extern int Timer0Int'

解决方法:在主函数前面加上声明"void __irq Timer0Int(void);"(ZLG李工),此时编译应该不会再出现上述的问题,但如果此时Debug运行时不正常,需在ADS1.2(编程软件)执行操作"Project -> Remove Object Code "后,再重新编译调试。

如果把C语言编写的中断函数放到其他文件中,也是类似的处理方法,如:"extern void __irq Timer0Int(void);"

相关文档
最新文档