针对STM32 IDE的Atolic TrueSTUDIO的C中的指针投射问题



在用于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。

相关内容

  • 没有找到相关文章

最新更新