C语言的字节型指针转换为字型指针导致死机

2019-07-21 04:45发布

本帖最后由 ZDawn 于 2019-3-4 15:48 编辑

测试代码如下:
uint8_t a[8] = {0};
int main(void)
{
    uint32_t temp;
    uint32_t *p = (uint32_t *)&a[0];


    temp = *p;    //运行此句会硬件跑飞
    while(1);
}


这种情况会是什么原因呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
edmund1234
2019-07-22 13:15
本帖最后由 edmund1234 于 2019-3-5 14:49 编辑
ZDawn 发表于 2019-3-5 12:05
是GD32的问题,在ST上使用字类型指针指向一个 不是4倍数的地址时候(比如0x07),MCU是会分两次存取完成的 ...

uint32_t *p = (uint32_t *)&a[0];   -----(1
uint16_t *p = (uint16_t *)&a[0];  -------(2

a 在1)的情况下要4字节对齐, 在2)的情况下要2字节对齐
这跟ST或GD 无关

只要你把a放在地址最后一位是7, temp = *p; 就会触发HardFault_Handler异常, 不管是ST还是GD

如果说ST没事, 那你查看一下a这时的地址吧, 看它还是不是尾数是7

不要把美丽的误会当成经验

一周热门 更多>