在用于STM32 IDE的Atolic TrueSTUDIO中处理STM32H7。仅C编码。使用FreeRTOS。
Ui08 *pointerSomething;
Ui64 localVariable;
pointerSomething=&addressOfSomething;
localVariable = *(Ui64*)(pointerSomething);
这些代码通常是有效的。
但我在一个案例中的一个用法是在一个类似的线程中;
thread begin //
Ui08 *pointerSomething;
Ui64 localVariable;
case 3:
pointerSomething=&addressOfSomething;
localVariable = *(Ui64*)(pointerSomething);
break;
thread end //
在这种情况下,当第二个序列出现时,我遇到了一个难题。我的意思是第一次在正常工作的情况下,但第二次在出现硬故障的情况下正好是localVariable = *(Ui64*)(pointerSomething);
的线路
thread begin //
Ui08 *pointerSomething;
Ui64 localVariable;
case 3:
pointerSomething=&addressOfSomething;
memcpy( &localVariable, pointerSomething, sizeof(localVariable) );
break;
thread end //
如果我改变了这些线,正如你在上面看到的那样,问题一直在解决。但我的问题是,为什么会出现这种问题,铸造类型的线路?
这里没有什么可猜测的。
gcc正在为Cortex-M7(thumb(编译指向LDRD
指令的64位指针双关语。LDRD
指令需要对齐的地址。这就是为什么当地址不对齐时,你会时不时地遇到hardFaults的原因。
https://godbolt.org/z/o9sPvfaon
您需要确保指针引用了正确对齐的数据。例如,在调试过程中,您可以:
case 3:
if((uint32_t)pointerSomething & 3)
{
__BKPT();
}
localVariable = *(Ui64*)(pointerSomething);
你将能够看到是什么导致HF。