[英]STM32 unaligned access
程序會定期進入 HardFault_Handler。 在寄存器HFSR
設置位FORCED
和UFSR
寄存器組UNALIGNED
。 項目使用STM32F417、FreeRtos、LWIP。 在大多數情況下,堆棧中的錯誤是 LWIP 函數。 該錯誤很少發生幾天一次。 該程序使用標志--no_unaligned_access
編譯。 目前還不清楚為什么會出現這樣的錯誤——而--no_unaligned_access
標志是啟用的,甚至每隔幾天,其次是否可以處理或忽略這個錯誤並繼續程序?
(我知道這是 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
被丟棄。 etharp_raw memcpy()
的后續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
的其余部分etharp.c
發現很多這樣的演員表,其中一些是無害的,但至少有一兩個其他的也可能有問題。
lwIP 2.x 已於去年年中(2018 年)發布。 我的經驗是,從 1.4x 轉換到 2.x 不會引起任何/太多問題,因此最好切換。 這類問題(如果它們是實際問題)可能已經修復。
此外,F4x 系列是 Cortex-M4,因此它們可以進行非對齊訪問。 如果您使用使用 Cortex-M0+ 內核的 F0xx 或 L0xx 系列,它只會導致問題。
我不知道這是否已經解決了。 但是我在其中一個項目中遇到了(STM32F746)同樣的問題。 以下是 IAR 的一份應用說明:
解決方案:只需添加
SCB->CCR = SCB->CCR & ~(1<<3);//Resetting the 3rd bit (meant for enabling hardfault for unaligned access)
檢查它是否仍然與您相關。
就我而言,我使用的是導致此問題的打包結構。 在上面提到的選項 1 修復之后,我就離開了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.