全部博文(2005)
分类:
2007-05-17 18:36:40
at91sam7s64调试心得(作者:gliethttp)
1.光盘上所有at91sam7s64的ads1.2或者IAR程序都没有对全局变量初始化和局部变量清零的代码,所以必须自己加上,内存仿真时不会
有问题,但是烧到Flash中时,就会出现因为全局变量没有初始化而造成的异常现象:
......
add r2, pc,#-(8+.-CInitData) ; @ where to read values (relative)
ldmia r2, {r0, r1, r3, r4}
cmp r0, r1 ; Check that they are different
beq EndRW
LoopRW
cmp r1, r3 ; Copy init data
ldrcc r2, [r0], #4
strcc r2, [r1], #4
bcc LoopRW
EndRW
mov r2, #0
LoopZI
cmp r3, r4 ; Zero init
strcc r2, [r3], #4
bcc LoopZI
b EndInitCCInitData
IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; Top of zero init segment
DCD |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
DCD |Image$$RW$$Base| ; Base of RAM to initialise
DCD |Image$$ZI$$Base| ; Base and limit of area
DCD |Image$$ZI$$Limit| ; Top of zero init segment
EndInitC
IMPORT Main
ldr r0, =Main
mov lr, pc
bx r0
......
2.对于象at91sam7s64这样的内存只有16k,rom只有64k的小型芯片,
尽量少用c库文件,如sprintf的加入会使代码陡然增加11k
3.当你的程序4K因为使用sprntf增加了11k数据后共15k,即使你的RO单元只有4K,RW和ZI一共才用了3.16K
但是因为sprintf中使用了过多堆栈,所以也可能会导致你烧写到Flash中程序的调试出现异常!
4.#define string0 "abc"
sizeof(string0) == 4 //程序编译时确定 字符串占用空间大小abc\0,所以4个
strlen(string0) == 3 //程序编译时确定 字符串的长度
总结:在at91sam7s64这种小内存、小flash中,只有避免使用c库函数,尤其是sprintf!!!!