程序定期进入HardFault_Handler。在寄存器HFSR
中设置位FORCED
和UFSR
寄存器集UNALIGNED
。
该项目使用STM32F417,FreeRtos,LWIP。在大多数情况下,堆栈中的错误是LWIP功能。错误很少发生一次
几天。
该程序使用标志--no_unaligned_access
进行编译。
目前还不清楚为什么会出现这样的错误 - 虽然--no_unaligned_access
标志已启用,甚至每隔几天,其次是否可以处理或忽略此错误并继续执行该程序?
答案 0 :(得分:0)
(我知道这是OQ之后的几年。如果仍然有用,请发布。)
我正在使用一个LWIP 1.4.1的项目,该项目的确存在至少一个未对齐的访问错误;我现在已修复它。 (我正在研究这是否是已知问题。)
在src/netif/etharp.c: etharp_request()
return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast,
(struct eth_addr *)netif->hwaddr, &netif->ip_addr, ðzero,
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, ðbroadcast,
&hwaddr, &netif->ip_addr, ðzero,
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的一份应用笔记:
解决方案:只需添加
SCB->CCR = SCB->CCR & ~(1<<3);//Resetting the 3rd bit (meant for enabling hardfault for unaligned access)
检查它是否仍然与您相关。
就我而言,我使用的是打包结构,这导致了此问题。经过上述选项1的修复后,它对我而言无济于事。