huochaosuma 发表于 2017-7-28 16:27:59

STM32F072芯片遇到一个字节对齐的问题

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 函数里就会死在奇数地址上。




求大神指点!!



wm20031015 发表于 2017-7-28 17:47:38

看cortex m0的手册

huochaosuma 发表于 2017-7-29 17:46:15

最后这个问题看汇编代码发现:
main 函数里的代码被优化掉了,但是read_platform_sn 函数里的没有被优化掉。M0不允许对奇数地址访问所以出了异常,谢谢!

huochaosuma 发表于 2017-7-29 17:46:31

wm20031015 发表于 2017-7-28 17:47
看cortex m0的手册

已经解决,谢谢!!

xmshao 发表于 2017-7-31 16:06:31

本帖最后由 xmshao 于 2017-10-20 14:53 编辑

是对齐的问题。

页: [1]
查看完整版本: STM32F072芯片遇到一个字节对齐的问题