文章
博客 网店

 STM32F0地址对齐问题


    Cortex-M0处理器只支持Thumb代码,在访问存储器时地址也必须是双字节地址(最后一位为0),如果不是就意味着处理试图切换到arm状态,这样会产生硬件错误,也就是HardFault_Handler异常。
    在C程序中也需要考虑此问题,看一下如下代码:

   uint8_t array[128];
   
   void f(uint8_t *buf)
   {
    uint32_t *p;
    uint32_t v;

    p=(uint32_t *)buf; //强制类型转换
    v=*p; //此处会产生错误,因为传递过来的buf+1地址是字节地址
    ....
   }

   void main(int)
   {
    ...
    ...
    f(buf+1); //如果是f(buf)那么可能不会出错,因为编译器会给buf安排一个对齐的地址
    while(1)
    {
    }
   }


在上面的代码中由于强制类型转换访问32位数据的指令会因为存储器地址对齐问题而发生硬件错误;
所以在C程序中强制类型转换时一定要注意地址对齐问题;在实际程序中应尽量避免类似的代码,或者数据类型间复制时使用类似下面的代码:

   void f(uint8_t *buf)
   {
    uint32_t i,v;

    v=buf[3];
    v<<=8;
    v+=buf[2];
    v<<=8;
    v+=buf[1];
    v<<=8;
    v+=buf[0];
    
    ....
   }


芯艺工作室    蒙ICP备06005492号
Copyright© 2004-2023 ChipArt Studio All Rights Reserved