hi,大神们好: 我遇到一个有点奇怪的问题, 当对flash中的地址执行读操作的时候,发现奇数地址按照2字节读会崩溃。 具体代码如下: #define PAGE1_BASE_ADDRESS 0x0800F800 uint8_t read_platform_sn(void) { uint16_t agc_tmp_a = 0; agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+0); agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+2); agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+3); agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+4); agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+5); agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+6); agc_tmp_a = *(uint16_t*)(PAGE1_BASE_ADDRESS+7); } int main(void) { uint16_t agc_tmp = 0; FLASH_Unlock(); agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+0); agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+1); agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+2); agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+3); agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+4); agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+5); agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+6); agc_tmp = *(uint16_t*)(PAGE1_BASE_ADDRESS+7); read_platform_sn(); while(1) { ; } } 1. main函数内 FLASH_Unlock(); 之后,然后对PAGE1_BASE_ADDRESS 开始的8个字节进行按照2字节读取,没有任何问题。 2. 进入read_platform_sn 函数里,依然对PAGE1_BASE_ADDRESS 开始的8个字节进行按照2字节读取,但是会崩溃在奇数地址上。 我发现规律是8条对FLASH的访问,在main函数里都不会死。但是放到read_platform_sn 函数里就会死在奇数地址上。 求大神指点!! |
main 函数里的代码被优化掉了,但是read_platform_sn 函数里的没有被优化掉。M0不允许对奇数地址访问所以出了异常,谢谢!
已经解决,谢谢!!
是对齐的问题。