Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15367229
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

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!!!!

阅读(2612) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~