at91sam7s256 linux,at91sam7s64调试心得

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值