欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

3天內(nèi)不再提示

實戰(zhàn)經(jīng)驗 | 數(shù)據(jù)意外變化導致條件判斷流程異常

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


關(guān)鍵詞:數(shù)據(jù)意外變化導致條件判斷流程異常


目錄預(yù)覽

1、問題描述

2、問題分析

3、小結(jié)


01

問題描述


用戶使用的 MCU 型號是 STM32H750VB。


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



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


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


02

問題分析


一開始查看 errta sheet, 看到以下相關(guān)內(nèi)容 :



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


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



結(jié)果發(fā)現(xiàn)并沒什么效果. 于是排除了這種可能性.


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



結(jié)果發(fā)現(xiàn)問題消失不見 ! 說明問題肯定跟 Cache 有關(guān).


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



結(jié)果發(fā)現(xiàn), 客戶的代碼本身就已經(jīng)打開 :



看樣子此模式與此問題無關(guān). 得換個思路.


考慮到問題跟內(nèi)存數(shù)據(jù)有關(guān), 代碼又不能動. 但是得想辦法讓內(nèi)存中數(shù)據(jù)的位置動動, 看看會有什么效果 ?


通過修改 KEIL 的鏈接配置文件.sct 文件, 將變量隨意動動, 結(jié)果發(fā)現(xiàn)問題也會消失不見 ! 這說明,數(shù)據(jù)的地址跟問題絕對有關(guān)聯(lián).那么具體是哪些數(shù)據(jù)呢 ?


為了精確定位到與哪些變量有關(guān), 查看 KEIL 生成的 map 文件, 按地址倒序?qū)⒚總€程序中所用到的.o 的對應(yīng)變量逐個挪移動 DTCM RAM 中.



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


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



現(xiàn)在我們知道規(guī)律了, 那么只要固定好這兩種 ZI 數(shù)據(jù)位置不變的情況下, 再去嘗試修改代碼, 結(jié)果發(fā)現(xiàn), 此時修改代碼不再會對結(jié)果產(chǎn)生影響! 換句話說, 現(xiàn)在可以自由修改代碼了.


考慮到此問題與 Cache 有關(guān), 于是接下來通過 MPU 設(shè)置將 heap_4.o 所在區(qū)域的 Cache 功能關(guān)閉, 結(jié)果發(fā)現(xiàn)問題消失.




Heap_4.o 的 ZI 數(shù)據(jù)是存放在 SRAM2 中的 0x3002 E050 位置.



現(xiàn)在的現(xiàn)象是,Heap_4.o 的 ZI 數(shù)據(jù)只需要固定在這個位置, 問題就能穩(wěn)定重現(xiàn),只不過將其對應(yīng)的cache 關(guān)閉, 問題則消失.


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



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




結(jié)果問題可以重現(xiàn). 這再次說明, cache 屬性對結(jié)果有影響.


但是此時還無法對其產(chǎn)生的過程細節(jié)進行解釋.


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


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


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


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


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


03

小結(jié)


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


完整內(nèi)容請點擊“閱讀原文”下載原文檔。


原文標題:實戰(zhàn)經(jīng)驗 | 數(shù)據(jù)意外變化導致條件判斷流程異常

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

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

    關(guān)注

    6044

    文章

    44628

    瀏覽量

    638994
  • STM32
    +關(guān)注

    關(guān)注

    2273

    文章

    10926

    瀏覽量

    357793

原文標題:實戰(zhàn)經(jīng)驗 | 數(shù)據(jù)意外變化導致條件判斷流程異常

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

收藏 人收藏

    評論

    相關(guān)推薦

    提升開關(guān)電源效率的理論分析與實戰(zhàn)經(jīng)驗

    在這里有電源技術(shù)干貨、電源行業(yè)發(fā)展趨勢分析、最新電源產(chǎn)品介紹、眾多電源達人與您分享電源技術(shù)經(jīng)驗,關(guān)注我們,與中國電源行業(yè)共成長! 提升開關(guān)電源效率的理論分析與實戰(zhàn)經(jīng)驗 引言 開關(guān)電源設(shè)計中,為獲得
    的頭像 發(fā)表于 01-09 10:04 ?383次閱讀
    提升開關(guān)電源效率的理論分析與<b class='flag-5'>實戰(zhàn)經(jīng)驗</b>

    vSAN數(shù)據(jù)恢復—異常斷電導致虛擬機無法啟動的vSAN數(shù)據(jù)恢復案例

    異常斷電導致vSAN存儲上層虛擬機無法啟動。
    的頭像 發(fā)表于 01-08 13:18 ?140次閱讀
    vSAN<b class='flag-5'>數(shù)據(jù)</b>恢復—<b class='flag-5'>異常</b>斷電<b class='flag-5'>導致</b>虛擬機無法啟動的vSAN<b class='flag-5'>數(shù)據(jù)</b>恢復案例

    使用MCUXpresso for VS Code插件開發(fā)Zephyr的hello world

    本期來到Zephyr實戰(zhàn)經(jīng)驗演練,小編帶著大家一起使用MCUXpresso for VS Code插件來開發(fā)一個屬于Zephyr的hello world。
    的頭像 發(fā)表于 01-03 09:21 ?666次閱讀
    使用MCUXpresso for VS Code插件開發(fā)Zephyr的hello world

    AD7616輸出異常導致后續(xù)控制的IGBT炸掉怎么解決?

    AD7616在正常工作30個小時后出現(xiàn)輸出保持狀態(tài),后經(jīng)過一段時間,驅(qū)動和FPGA有交互,但輸出異常導致后續(xù)控制的IGBT炸掉。目前AD7616是在硬件并口且未使用復位功能。初步判斷是外部干擾造成的AD7616輸出
    發(fā)表于 12-19 06:32

    VTT供電電源變換是否會導致DDR的Leveling出現(xiàn)time out的異常?

    存在最大20mV的變化量,正常的時候,該值的變化量一般在幾個mV。 現(xiàn)在,想要請問下,①VTT供電電源變換是否會導致 DDR 的Leveling 出現(xiàn)time out的異常?②VTT
    發(fā)表于 12-06 06:09

    技術(shù)干貨驛站 ▏深入理解C語言:掌握C語言條件判斷,從if到switch的應(yīng)用

    在編程中,條件判斷語句是控制程序流程的核心元素之一。它們使得程序能夠根據(jù)不同的輸入和狀態(tài),做出相應(yīng)的決策。特別是在C語言中,條件判斷語句的使
    的頭像 發(fā)表于 11-09 01:10 ?451次閱讀
    技術(shù)干貨驛站 ▏深入理解C語言:掌握C語言<b class='flag-5'>條件</b><b class='flag-5'>判斷</b>,從if到switch的應(yīng)用

    TI電量計通訊異常的分析經(jīng)驗

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

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

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

    服務(wù)器數(shù)據(jù)恢復—異常斷電導致RAID信息丟失的數(shù)據(jù)恢復案例

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

    服務(wù)器數(shù)據(jù)恢復—異常斷電導致存儲癱瘓的數(shù)據(jù)恢復案例

    系統(tǒng)盤是統(tǒng)一大小,數(shù)據(jù)盤大小不確定,數(shù)據(jù)盤是精簡模式。 服務(wù)器存儲故障: 機房斷電導致服務(wù)器存儲異常關(guān)機,加電后存儲無法使用。
    的頭像 發(fā)表于 06-25 13:41 ?379次閱讀
    服務(wù)器<b class='flag-5'>數(shù)據(jù)</b>恢復—<b class='flag-5'>異常</b>斷電<b class='flag-5'>導致</b>存儲癱瘓的<b class='flag-5'>數(shù)據(jù)</b>恢復案例

    PLC出現(xiàn)問題時如何快速判斷是CPU異常

    CPU異常是較為常見且影響較大的問題之一。本文將從多個方面探討如何快速判斷PLC出現(xiàn)問題時是否為CPU異常,并提供相應(yīng)的解決方法和建議。
    的頭像 發(fā)表于 06-12 11:13 ?1014次閱讀

    HarmonyOS實戰(zhàn)開發(fā)-合理選擇條件渲染和顯隱控制

    。 反例 沒有使用容器限制條件渲染組件的刷新范圍,導致條件變化會觸發(fā)創(chuàng)建和銷毀該組件,影響該容器內(nèi)所有組件都會刷新。 @Entry @Component struct
    發(fā)表于 05-10 15:16

    服務(wù)器數(shù)據(jù)恢復—異常斷電導致RAID管理信息丟失的數(shù)據(jù)恢復案例

    使用。 服務(wù)器故障: 機房供電幾次意外中斷,服務(wù)器出現(xiàn)故障前最后一次異常斷電重啟后RAID報錯,提示無法找到存儲設(shè)備,進入RAID管理模塊做任何操作都死機,重啟服務(wù)器后問題依舊,用戶聯(lián)系北亞企安數(shù)據(jù)恢復中心尋求幫助。
    的頭像 發(fā)表于 04-30 15:34 ?401次閱讀

    lc振蕩電路判斷是否起振的相位條件是什么

    起振條件是指一個電路能夠在沒有任何外部干擾的情況下,自發(fā)地產(chǎn)生振蕩信號的條件。對于LC振蕩電路,起振條件是通過判斷電路在穩(wěn)定狀態(tài)下的相位關(guān)系來決定是否起振。 LC振蕩電路是由一個電感(
    的頭像 發(fā)表于 03-01 11:23 ?3281次閱讀

    服務(wù)器數(shù)據(jù)恢復-異常斷電導致服務(wù)器故障的數(shù)據(jù)恢復案例

    服務(wù)器數(shù)據(jù)恢復環(huán)境: dell某型號服務(wù)器中有一組通過raid卡組建的raid10,該raid陣列中一共有4塊磁盤。上層部署XenServer虛擬化平臺,作為網(wǎng)站服務(wù)器使用。 服務(wù)器故障: 服務(wù)器異常斷電導致服務(wù)器上的一臺
    的頭像 發(fā)表于 02-28 15:15 ?927次閱讀
    服務(wù)器<b class='flag-5'>數(shù)據(jù)</b>恢復-<b class='flag-5'>異常</b>斷電<b class='flag-5'>導致</b>服務(wù)器故障的<b class='flag-5'>數(shù)據(jù)</b>恢復案例