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];
....
}
|
|