精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

實戰經驗 | 數據意外變化導致條件判斷流程異常

STM32單片機 ? 來源:未知 ? 2023-12-07 10:00 ? 次閱讀


關鍵詞:數據意外變化導致條件判斷流程異常


目錄預覽

1、問題描述

2、問題分析

3、小結


01

問題描述


用戶使用的 MCU 型號是 STM32H750VB。


在客戶的代碼中有多個條件語句,在條件里面的變量數值沒有變化的情況下執行了條件里面的邏輯。有點類似如下 C 語句 :



即變量 A 在明明沒有變化且條件不滿足的情況下, 程序運行時偏偏執行了條件內部的代碼. 很奇怪的現象。一時很難判斷是編譯器的問題還是芯片問題.


了解到客戶的代碼中使用了第三方庫, xx.o 文件, 像這樣的條件有 80 多個, 每次出現問題的具體變量并不是固定哪一個, 但是在大概 10 分鐘內肯定會有其中一個出現執行邏輯問題。隨意動一下代碼問題就不出現, 或者出現的位置發生變化 ; 用 KEIL 編譯器去設置斷點, 想看該變量信息, 也會導致問題不再出現。


02

問題分析


一開始查看 errta sheet, 看到以下相關內容 :



即懷疑問題跟 AXI SRAM 相關. 查看客戶的這些變量, 確實是存放在 AXI SRAM 中. 由于任何修改代碼都可能導致問題不再出現, 因此所有嘗試須建立在不修改代碼的基礎上, 不然無法說明問題。


于是讓客戶用 STM32CubeProgrammer 以 hot plug 模式連接 MCU, 按照勘誤手冊中 2.2.9 節所描述的 workaround 方式將 AXI_TARG7_FN_MOD 寄存器的 READ_ISS_OVERRIDE 位通過地址的方式直接修改 :



結果發現并沒什么效果. 于是排除了這種可能性.


一開始也懷疑問題可能跟 Cache 有關, 于是測試下關閉 Cahce 會怎么樣. 通過 KEIL 調試模式下,暫停住 CPU 運行, 然后手動關閉 D-Cache :



結果發現問題消失不見 ! 說明問題肯定跟 Cache 有關.


但客戶的代碼最終肯定是不能關閉 Cache 的, 想到內核中有一個寄存器可以打開全局 Cache 的write throght 模式, 如下編程手冊中的 CACR 寄存器的 FORCEWT 位 :



結果發現, 客戶的代碼本身就已經打開 :



看樣子此模式與此問題無關. 得換個思路.


考慮到問題跟內存數據有關, 代碼又不能動. 但是得想辦法讓內存中數據的位置動動, 看看會有什么效果 ?


通過修改 KEIL 的鏈接配置文件.sct 文件, 將變量隨意動動, 結果發現問題也會消失不見 ! 這說明,數據的地址跟問題絕對有關聯.那么具體是哪些數據呢 ?


為了精確定位到與哪些變量有關, 查看 KEIL 生成的 map 文件, 按地址倒序將每個程序中所用到的.o 的對應變量逐個挪移動 DTCM RAM 中.



為什么要倒序呢? 主要是因為, 假如先挪低地址的變量, 肯定會導致高地址的變量向低地址移動.這好比, 如果先抽掉下面的磚頭, 那么上面的磚頭會自動移動下面去. 假如先抽掉上面的磚頭情況就不一樣了, 下面的磚頭還會保持不動. 這就是為什么先挪移上面的磚頭的意義, 也就是所謂的倒序.


通過這種方式, 最終定位到問題跟 heap_4.o 文件以及用戶使用到的第三方提供的 xx.o 文件中的ZI 數據有關. 只要保持這兩種數據位置不變, 那么問題就可以穩定觸發, 一旦其中任何一個位置有所變動, 問題就消失不見.



現在我們知道規律了, 那么只要固定好這兩種 ZI 數據位置不變的情況下, 再去嘗試修改代碼, 結果發現, 此時修改代碼不再會對結果產生影響! 換句話說, 現在可以自由修改代碼了.


考慮到此問題與 Cache 有關, 于是接下來通過 MPU 設置將 heap_4.o 所在區域的 Cache 功能關閉, 結果發現問題消失.




Heap_4.o 的 ZI 數據是存放在 SRAM2 中的 0x3002 E050 位置.



現在的現象是,Heap_4.o 的 ZI 數據只需要固定在這個位置, 問題就能穩定重現,只不過將其對應的cache 關閉, 問題則消失.


那么此區域默認的 Cache 屬性是怎么樣的呢? 這個在 AN4839 中可以找到其默認屬性:



于是我們通過代碼, 將其 MPU 屬性再次配置其默認屬性:




結果問題可以重現. 這再次說明, cache 屬性對結果有影響.


但是此時還無法對其產生的過程細節進行解釋.


與此同時, 嘗試關閉客戶使用第三方庫 xx.o 文件中的數據 cache, 問題也同樣會消失。這說明, 此問題跟客戶所使用的第三方庫是有關系的, 其數據在 cache 中產生了一致性問題.


于是詢問客戶這個第三方庫是如何來的? 他們回復是一家歐洲公司提供的, 且是以 M4 內核編譯的.


很明顯, 在使用原則上, M4 編譯出來的.o 文件, 就不應該用在 H7 工程上.


以 M4 為內核編譯的.o 文件放到 M7 工程中會產生什么樣的影響? 雖然理論上, M7 內核的指令集是向下兼容的, 但是也需要考慮 M7 內核相關的一些特性, 比如 Cache, memory barrier 等等. 不能完全確保不會出問題, 最保險就是重新以 M7 內核編譯這個.o 文件.


由于這個第三方.o 文件客戶自己也是無法知道其內部是如何實現的, 因此, 問題的具體產生過程是沒辦法進一步調查了. 但定位到這個.o 文件已經是當前能得到的最終結果.


03

小結


本文最終問題的真相雖有點匪夷所思, 但這正反映了當前國內軟件應用上的混亂情況. 本文所描述的問題根本原因雖然很另類, 但所涉及到的方法卻對開發者有一定的參考意義, 在不能動代碼的情況下, 需要挪動數據的位置, 這就必須對編譯器有一定的了解. 雖也不至于太難, 但對很多開發都來說, 對編譯器的了解未必很深, 因此, 一開始很多人就會卡住。另外, 對 MPU 的了解也是一大門檻. 因此, 特奉上此文, 以供參考.


完整內容請點擊“閱讀原文”下載原文檔。


原文標題:實戰經驗 | 數據意外變化導致條件判斷流程異常

文章出處:【微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6023

    文章

    44376

    瀏覽量

    628383
  • STM32
    +關注

    關注

    2258

    文章

    10828

    瀏覽量

    352483

原文標題:實戰經驗 | 數據意外變化導致條件判斷流程異常

文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    TI電量計通訊異常的分析經驗

    電子發燒友網站提供《TI電量計通訊異常的分析經驗.pdf》資料免費下載
    發表于 08-23 10:12 ?0次下載
    TI電量計通訊<b class='flag-5'>異常</b>的分析<b class='flag-5'>經驗</b>

    plc突然斷電會導致什么異常

    PLC(Programmable Logic Controller,可編程邏輯控制器)是一種廣泛應用于工業自動化領域的控制器。當PLC突然斷電時,可能會導致一些異常情況,這些異常情況可能
    的頭像 發表于 07-25 10:11 ?516次閱讀

    服務器數據恢復—異常斷電導致RAID信息丟失的數據恢復案例

    意外斷電導致raid硬件損壞或者riad管理信息丟失等raid模塊損壞而導致數據丟失的情況非常普遍。正常情況下,磁盤陣列一旦創建完成就不會再對管理模塊中的信息進行更改,但是raid管理
    的頭像 發表于 07-01 11:21 ?201次閱讀

    XMC1402串口半雙工接收異常導致數據丟幀的原因?

    ,如下所示 3異常現象如下 3.1 XMC1402接收到完整數據幀后并未回復,導致數據丟幀,見下圖 3.2檢查異常接收
    發表于 02-01 08:11

    怎么判斷干式變壓器噪聲異常

    超出了這個范圍,就屬于異常噪音。本文將介紹如何判斷干式變壓器噪聲異常。 第一步:了解正常范圍 首先,我們需要了解干式變壓器的正常噪音范圍。根據經驗,通常情況下,干式變壓器的噪音應該在4
    的頭像 發表于 01-26 16:06 ?1285次閱讀

    服務器斷電導致raid模塊損壞的數據恢復案例

    情況,北亞企安數據恢復工程師初步判斷服務器故障原因是意外斷電導致的raid模塊損壞,經過詳細檢測發現是異常斷電
    的頭像 發表于 12-25 14:29 ?423次閱讀

    燃油系統壓力異常導致什么故障現象

    燃油系統壓力異常可能導致多種問題和故障,因為正常的燃油壓力對引擎性能至關重要。
    的頭像 發表于 12-12 11:15 ?610次閱讀
    燃油系統壓力<b class='flag-5'>異常</b>會<b class='flag-5'>導致</b>什么故障現象

    javaweb從入門到實戰

    的學習和實踐。本文將為大家詳述JavaWeb的入門以及實戰經驗,希望能幫助到正在追求JavaWeb技術的開發者。 入門 1.1 Java基礎知識 在學習JavaWeb之前,首先要掌握Java語言的基礎知識,包括面向對象的概念、類與對象、繼承與多態、異常處理等。理解這些基礎
    的頭像 發表于 12-03 11:44 ?1357次閱讀

    sql怎么在where條件判斷

    在SQL中,WHERE條件用于篩選符合特定條件的記錄。它提供了一種在查詢中過濾數據的方法,使您能夠根據所需的特定條件對查詢結果進行更精確的控制。 在WHERE子句中,您可以使用各種操作
    的頭像 發表于 11-23 11:30 ?1596次閱讀

    python if 多條件并列判斷

    Python中的if語句允許我們根據條件執行不同的代碼塊。有時候我們需要同時判斷多個條件是否滿足,并根據結果執行不同的代碼塊。在這篇文章中,我們將會進行詳盡、詳實且細致的介紹。 首先,我們來看
    的頭像 發表于 11-21 16:40 ?1303次閱讀

    華秋這場技術研討邀請了哪些重磅嘉賓

    運作流程,精通SMT生產設備及工藝流程,熟練掌握各工序制程及全制程工藝要求,對SMT異常分析,及不良問題改良具備成熟實戰經驗。 參會福利 路線指引小貼示 自駕:導航定位至新一代產業園
    發表于 11-17 14:42

    華秋這場技術研討邀請了哪些重磅嘉賓?

    運作流程,精通SMT生產設備及工藝流程,熟練掌握各工序制程及全制程工藝要求,對SMT異常分析,及不良問題改良具備成熟實戰經驗。 參會福利 路線指引小貼示 自駕:導航定位至新一代產業園
    發表于 11-17 14:40

    PLC現場安裝、調試全流程實戰經驗

    深入了解設計資料、對系統工藝流程,特別是工藝對各生產設備的控制要求要有全面的了解,在此基礎上,按子系統繪制工藝流。程聯鎖圖、系統功能圖、系統運行邏輯框圖、這將有助于對系統運行邏輯的深刻理解,是前期技術準備的重要環節。
    的頭像 發表于 11-14 16:38 ?820次閱讀

    實戰經驗 | TrustZone 架構下 LPBAM 使用導致的 HardFault

    從 bootloader 跳轉到app。在之前版本都是正常跳轉的,某一天 IAR 從 9.20 升級到 9.30 后,程序跳轉失敗,并且會導致 hardfault,想知道為什么會失敗。 圖1.IAR9.20
    的頭像 發表于 10-20 15:05 ?500次閱讀
    <b class='flag-5'>實戰經驗</b> | TrustZone 架構下 LPBAM 使用<b class='flag-5'>導致</b>的 HardFault

    一文詳解python條件判斷

    今天給大家帶來python條件判斷
    發表于 10-01 10:48 ?661次閱讀