STM32未对齐访问

时间:2016-12-19 08:57:28

标签: arm stm32

程序定期进入HardFault_Handler。在寄存器HFSR中设置位FORCEDUFSR寄存器集UNALIGNED。 该项目使用STM32F417,FreeRtos,LWIP。在大多数情况下,堆栈中的错误是LWIP功能。错误很少发生一次 几天。 该程序使用标志--no_unaligned_access进行编译。 目前还不清楚为什么会出现这样的错误 - 虽然--no_unaligned_access标志已启用,甚至每隔几天,其次是否可以处理或忽略此错误并继续执行该程序?

3 个答案:

答案 0 :(得分:0)

(我知道这是OQ之后的几年。如果仍然有用,请发布。)

我正在使用一个LWIP 1.4.1的项目,该项目的确存在至少一个未对齐的访问错误;我现在已修复它。 (我正在研究这是否是已知问题。)

src/netif/etharp.c: etharp_request()

  return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, &ethbroadcast,
                (struct eth_addr *)netif->hwaddr, &netif->ip_addr, &ethzero,
                ipaddr, ARP_REQUEST);

强制转换(struct eth_addr *)netif->hwaddr导致netif->hwaddr的不对齐被丢弃。 memcpy()中随后的etharp_raw()会发生故障。

我烦恼的解决方案是分配对齐的临时存储,然后传递该临时存储:

  struct eth_addr hwaddr;
  memcpy(hwaddr.addr, netif->hwaddr, ETHARP_HWADDR_LEN);

  return etharp_raw(netif, &hwaddr, &ethbroadcast,
                &hwaddr, &netif->ip_addr, &ethzero,
                ipaddr, ARP_REQUEST);

快速查看etharp.c的其余部分,可以发现很多这样的强制类型转换,其中一些是无害的,但至少有另外一两个也有可能出错。

答案 1 :(得分:0)

lwIP 2.x已于去年中旬(2018)发布。我的经验是,从1.4x切换到2.x不会引起任何/很多问题,因此最好进行切换。这类问题(如果是实际问题)可能已经解决。

此外,F4x系列是Cortex-M4,因此它们可以进行未对齐的访问。如果您使用的是使用Cortex-M0 +内核的F0xx或L0xx系列,只会引起问题。

答案 2 :(得分:0)

我不知道这是否已经解决。但在其中一个项目期间,我遇到了与(STM32F746)相同的问题。这是IAR的一份应用笔记:

STM32 unaligned access

解决方案:只需添加

SCB->CCR = SCB->CCR & ~(1<<3);//Resetting the 3rd bit (meant for enabling hardfault for unaligned access)

检查它是否仍然与您相关。

就我而言,我使用的是打包结构,这导致了此问题。经过上述选项1的修复后,它对我而言无济于事。