在线时间44 小时
UID3122892
ST金币363
蝴蝶豆2
注册时间2015-4-30
该用户从未签到
高级会员
- 最后登录
- 2018-9-3
|
1.L4的FLASH只支持双字写入,写入连续的字符就必须进行64位整型转换。
2.如下面这个程序:
- 1 char ID[11]={0}; //声明一个数组ID
- 2 strncpy(ID,"PA10235871",10);//将一串字符写入数组内部
- 3 u8 *ps=(char *)ID; //将ID的地址传递给指针ps
- 4 uint64_t I=*(uint64_t *)ID; //进行64位整型转换
- 5 I=*(uint64_t *)ps;
复制代码 问题就在于,第四步和第五步,这两步是我在出现问题之后,用来对比分析的。第四步执行无误,第五步会触发硬件错误。后来我分析汇编代码,发现第四步的汇编指令使用的LDR指令,而第五步使用的LDRD指令
关键就在于LDRD指令,这个指令 LDRD Ra,Rb,[xxx] "从XXX地址中取出64位数据,存入Ra、Rb寄存器中"。
XXX这个地址必须双字对齐(即是8的倍数) !!出错的第五步,ID[11]的首地址的确不是8的倍数,后来我换了一个变量(地址满足双字对齐),果然第五步就没有问题了。
那么,问题就来了,这种变量分配,不可能每个都去指定固定地址,一旦出现双字不对齐的地址,就会导致转换出错,这怎么搞?
3.问题如下:
(1)上述程序错误是否真的是LDRD指令的问题?
(2)L4芯片内部FLASH写入字符型数据,有更好的方式么?【官方例程用的64位强制转换】
|
|