内容发布更新时间 : 2024/11/19 6:21:29星期一 下面是文章的全部内容请认真阅读。
周立功ARM调试心得
2008-9-11调试\实验箱\心得:
1、在调试\嵌入式系统实验教程(二)\\开发板出厂编程程序\\液晶显示程序\\LCM_Disp\的程序时,想使用外部RAM进行仿真调试,在将ADS1.2中的\
Command Line\的\改为\totals -entry 0x80000000 -scatter .\\src\\mem_b.scf\时,编译时总是出现错误信息\,经梁工(宝琼)提示:\这是由于程序空间超出范围,需要改一个参数。\
打开关于外部RAM调试的分散加载文件\发现所有的程序调试地址都是指向0x81000000的Flash地址空间,而不是0x80000000的RAM地址空间(此时硬件电路板上的短路片RAM接CS0、Flash接CS1),后把0x81******全部改为0x80******,编译调试都正常。
2、不正常现象:在调试\实验箱时,每次实验箱断电或实验箱上复位按键后,H-Flash的Load操作都要重新执行一遍(或者简单一点:只要在H-Flash -> Programming -> Check 按钮上点击一下也可以),否则下载程序后实验箱运行不了。
(先是在选用DebugInExram出现这种情况,后选用RelOutChip则不会出现这种情况。)
<2008-9-12> 另外,每次重新启动H-JTAG和H-Flash后,都要将H-Flash重新设一遍。
3、 现象:在调试GB_Disp工程时,程序无法正常运行。
分析:当调试的程序中包含中断时,分散加载文件\的\项设置不能从0x40000000开始,而应该从0x40000040开始(给中断向量留下空间),否则程序无法调试。(先是在选用RelOutChip出现这种情况,后选用DebugInExram也出现这种情况。)
< 2008-9-12 htwang注: 上面的解释并不正确,因为在调试其他中断实验的过程中,配置文件\的\项设置成从0x40000000开始也可以正常运行。(估计可能是存储器映射的问题)
打开GB_Disp工程\文件,果然发现在函数\中将存储器映射寄存器初始化成\= 0x2\,这是选用的用户RAM模式,中断向量也从静态RAM重新映射。如果想映射到用户外部存储器模式,应该改为\= 0x3\(见《ARM嵌入式系统基础教程》P166 或《深入浅出ARM7-LPC2200》P119)。按此方式更改后,实际调试也正常。 >
(2008-9-12)结论:要么把该工程文件\中的\项改成从0x40000040开始;要么把该工程文件\中的存储器映射初始化为\= 0x3\。
4、在调试中断程序时,如果使用IRQ.S中的汇编宏定义程序和
\代替原来的C语言函数中断方式(当然同时将代码\改为\(uint32)IRQ_Eint3_Handler; \),则应将C语言中断函数\IRQ_Eint3(void)\改写成\。
否则调试是出现的情况就是程序在\和中断函数\里面反复执行,再也退不出来。
2008-9-12调试\实验箱\心得:
5、现象:在自己编写定时器中断程序时,如果自己用工程模板\Image for lpc2200\建立工程并编写中断程序后,调试过程中总是不能进入中断,但是用定时中断的事例程序可以进入。
原因:经将自己建立的模板工程文件中的\文件和事例程序中的比较,发现在模板工程的\文件中的堆栈初始化代码\中有一行语句为: ;设置系统模式堆栈
MSR CPSR_c, #0xdf LDR SP, =StackUsr
这就将IRQ和FIQ都禁止了,需要将\改为\#0x5f\来打开IRQ中断才行。
6、现象:用C语言编写中断函数时,如void __irq Timer0Int(void){ },该中断函数必须放在主函数main()的上方,否则编译时会出现错误(因为主函数需要调用语句\):
1)Error: (Serious) C2933E: type disagreement for \
2) Error: C2456E: undeclared name, inventing 'extern int Timer0Int'
解决方法:在主函数前面加上声明\(ZLG李工),此时编译应该不会再出现上述的问题,但如果此时Debug运行时不正常,需在ADS1.2(编程软件)执行操作\后,再重新编译调试。
如果把C语言编写的中断函数放到其他文件中,也是类似的处理方法,如:\
7、在ADS软件中int类型占用4个字节的空间。
8、ALIGN=2 ,即定义2的n次幂对齐方式(梅工(程宇))。(见ARM指令集ARM_zhiling.pdf)
9、SvcStackSpace SPACE SVC_STACK_LEGTH * 4;其中的SPACE为字节空间定义(梅工(程宇)),并用0对之进行初始化。(见ARM指令集ARM_zhiling.pdf)
10、要想看到所有文件(函数)对FLASH和RAM的使用情况,在编译选项设置->ARM Linker -> Listings -> Listings的\和\前面的复选框选中,编译后即可输出想要的详细信息(梅工(程宇))。
11、实验箱上的ZLG7290芯片由于内部键盘处理程序没有去抖动和防连击处理,所以用起来不太好用。(据说ZLG7290芯片只是ZLG用一款单片机写了软件贴了个商标)
2008-9-16调试\实验箱\心得:
12、中断使能寄存器VICVectEnable写入1,对应通道的中断使能;写入0,无效。如指令:
VICIntEnable = 1 << 6; VICIntEnable = 1 << 4;
指令这两条指令之后,通道6和通道4都被中断使能。
(课本《深入浅出ARM7--LPC2200》的P164有详细说明)
13、在任务Task定义的局部变量与定义的静态局部变量功能等同,因为任务不可能返回,只能被中断(大部分是定时中断,也可能是其他中断)所打断,这时中断会保存相应的现场。(自我理解,没有看到相关资料上如此解释)
14、用typedef定义的结构体不能多次用#include 包含,否则会出现错误: Error:(Serious) C2930E: duplicate definition of ' ***'
<2008-9-16 htwang注:上述结论并不正确,出现这种情况是因为一个有typedef的头文件在同一个文件中include包含了两次。
>
2008-9-17调试\实验箱\心得:
15、因为任务创建成功后OSTaskCreate()即进行任务的调度OS_Sched(),因而与此
相关的事件创建(如消息邮箱)程序要放在先创建的任务中,而不是放在即将创建的高优先级任务中。
<2008-9-17 htwang注:上述结论不正确,因为任务创建后并不会马上运行,它创建后的切换操作总是会切换到最高优先级的任务运行,而一般我们都是用高优先级的任务进行所有低优先级任务的创建,因此任务仍然会返回起始任务继续创建其它任务。所以与此相关的事件创建(如消息邮箱)程序必须要放在相关的即将创建的高优先级任务中。 >