簡體   English   中英

STM32 未對齊訪問

[英]STM32 unaligned access

程序會定期進入 HardFault_Handler。 在寄存器HFSR設置位FORCEDUFSR寄存器組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, &ethbroadcast,
                (struct eth_addr *)netif->hwaddr, &netif->ip_addr, &ethzero,
                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, &ethbroadcast,
                &hwaddr, &netif->ip_addr, &ethzero,
                ipaddr, ARP_REQUEST);

快速檢查etharp.c的其余部分etharp.c發現很多這樣的演員表,其中一些是無害的,但至少有一兩個其他的也可能有問題。

lwIP 2.x 已於去年年中(2018 年)發布。 我的經驗是,從 1.4x 轉換到 2.x 不會引起任何/太多問題,因此最好切換。 這類問題(如果它們是實際問題)可能已經修復。

此外,F4x 系列是 Cortex-M4,因此它們可以進行非對齊訪問。 如果您使用使用 Cortex-M0+ 內核的 F0xx 或 L0xx 系列,它只會導致問題。

我不知道這是否已經解決了。 但是我在其中一個項目中遇到了(STM32F746)同樣的問題。 以下是 IAR 的一份應用說明:

STM32 未對齊訪問

解決方案:只需添加

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM