金牌会员
 
- 积分
- 2775
- 金钱
- 2775
- 注册时间
- 2015-6-1
- 在线时间
- 394 小时
|
1金钱
第一个问题,例程里原有的是对TEXT_Buffer进行写和读,看着没问题,但是新加一个TEXT_Buffer2,发现没法对TEXT_Buffer2进行写操作,直接就会卡死在一个64位的赋值代码里:STMFLASH_BUF[i + secoff] = pBuffer[i];,注意这里并不是卡死在flash读写中,而是单纯卡死在64位数据的赋值中(因为我把所有flash读写代码都删了试的)。
折腾两天后发现:若TEXT_Buffer2为全局变量,只有当数据长度为4的倍数时才能读写;若TEXT_Buffer2为局部变量,则都可以进行读写。再找手册里写的,对flash操作必须是4字节对齐的。于是把全局变量的TEXT_Buffer2改为__align(4) TEXT_Buffer2就好使了。
所有第一个问题是例程的代码里少添了一个四字节对齐吗?另外我是不是可以这么理解?:当为全局变量时,数据等于是存在flash中的,所以所有数据必须按照flash要求的四字节对齐,而局部变量是临时申请了一块堆,是不需要像在flash里一样四字节对齐的。这么理解对吗?
第二个问题,main函数中字义了u8 datatemp[SIZE];其中SIZE为3,而这个变量用在了STMFLASH_Read(FLASH_SAVE_ADDR, (u32*)datatemp, SIZE * 2);,这显然是不对的吧?把一个u8的长度为3的数组,强转成了32位,还要在里面读出来18个字节,这啥情况呀?例程代码跑起来竟然是可以用的,想不明白这里的逻辑。随后我自己移了一个操作系统的代码,发现能读出来数据,但是会莫名其妙地崩溃,没找到崩溃原理和位置,但如果把u8 datatemp[SIZE];改为u8 datatemp[SIZE*8];或u64 datatemp[SIZE];就不会再崩了。所以我觉得例程中的写法是错的,可能能用,但是一定是自己没开那么大的空间(一共才开了3字节),就占别人的空间了(占了18个字节)。
所以这里是变量定义有误吗?
|
最佳答案
查看完整内容[请看2#楼]
测试完成,结果说一下,对新手有点儿用:
1、对于第一个问题,我的想法已经验证是对的,代码里就是需要加一个四字节对齐
2、对于第二个问题,代码肯定是错的。改成u8 datatemp;或u64 datatemp;就对了,只不过这套代码里只读写了一个数据,看不出来错,多打几个数据的话就会看到,第一个数组已经占用了第二个数组的空间。
3、对于局部变量,应该是存储空间是连续的,且是自动四字节对齐的。对于全局变量,其存储空间不连续,且不 ...
|