国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

如何處理RTOS錯誤和超時

星星科技指導員 ? 來源:嵌入式計算設計 ? 作者:Micro Digital ? 2022-06-29 09:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大多數 RTOS 提供對服務調用和其他類型錯誤的監控和報告。盡管人們普遍認為良好的錯誤處理有助于調試并提高可靠性,但很少有時間這樣做。問題是我們已經面臨實現主要項目目標的挑戰,處理錯誤是一種不受歡迎的麻煩。這是不幸的,因為良好的錯誤檢測和處理可以減少調試時間并有助于處理交付系統中的問題。

所需要的是將錯誤和超時管理合并到嵌入式系統中的簡單方法。有兩種錯誤報告,本地和中央。由于并非所有 RTOS 都提供后者,讓我們從前者開始。

本地錯誤報告

本地報錯基本上有兩種方法。第一個直接返回狀態信息并將所需結果放入作為參數提供的地址中。例如:

pYYBAGK7s3OAPsmdAAC2nr04VUM002.png

在這種情況下,任務控制塊 (TCB) 已被靜態定義。OSTaskCreate() 使用它的地址填寫 TCB 字段并返回 status = OK。如果發生錯誤,例如無效的 TCB 地址,則 status 是錯誤類型。這種方法的缺點是需要一個額外的參數來告訴將結果放在哪里以及需要靜態定義 TCB。

第二種方法直接返回結果,并將狀態放入當前任務的 TCB 中的一個字段中。例如:

pYYBAGK7s3mARRqKAACWwcVPRYE293.png

在這種情況下,TCB 是從池中動態分配的,如果成功,則 RTOS 返回其句柄。(句柄是taskA,它是一個指向taskA 的TCB 的指針。)如果不是,它返回NULL。在這種情況下,發生了錯誤或超時,并且狀態已存儲在 smx_ct-》err 中,其中 smx_ct 是當前任務,即嘗試創建 taskA 的任務。這些方法是等價的,但我更喜歡第二種,因為它更直接。

本地錯誤和超時處理

這是一種處理本地錯誤和超時的方法,而不會使主代碼復雜化:

poYBAGK7s4CABKoxAAMbVjsGTls165.png

在此示例中,while (1) 循環執行主要處理。它在 port_in 交換處等待消息。如果在 TMO 周期內收到一條消息,它會被處理,然后釋放,控制返回到消息接收。如果由于錯誤或超時未收到消息,則控制轉到 else 語句。如果發生超時 (SMXE_TMO),則會對其進行處理并控制返回消息接收,除非超時次數過多。否則,控制會跳出 while (1) 循環并轉到 switch 語句。在這里,存在所有 smx_MsgReceive() 錯誤類型的情況,以及超時過多的情況。

錯誤處理后,taskA_Main() 返回到調度程序,調度程序將其停止。這確保了 taskA 在問題得到解決之前不會造成進一步的損害。一旦問題得到解決,taskA 可以重新啟動,它會回到它的主處理循環。在調試時,停止任務有助于診斷問題并決定如何在已發布的系統中修復它。

taskA 也可以在不停止的情況下重新啟動,如無效 MCB 情況所示。在這種情況下,消息被丟棄,taskA 返回其主處理循環。重啟taskA是錯誤處理的程度。此外,任務重啟后沒有中斷,因為它之后不會執行任何語句。

此示例說明如何區分超時和錯誤以及如何區分錯誤類型。請注意,可能需要通知然后重試的超時處理保留在主 while 循環中,而錯誤處理在循環之外執行。這使得主循環更容易理解,因為它沒有雜亂的錯誤處理代碼。

通過將錯誤處理代碼與主處理代碼分開,更容易將時間和精力集中在后者上。在調試期間,switch 語句可能僅用于放置斷點的位置。稍后,它可能會用案例充實,如圖所示,或者用中央錯誤處理代替。

中央錯誤處理

中央錯誤處理減少了對本地錯誤處理的需求,如果由 RTOS 提供,則應使用它。每當 RTOS 服務或 RTOS 本身檢測到錯誤時,都會調用 RTOS 錯誤管理器 EM()。理想情況下,EM() 在系統堆棧中運行,因此處理錯誤不會導致任務堆棧溢出。這可能是一團糟,因為它是出乎意料的,而且 EM() 不太可能是可重入的。EM() 應該執行以下部分或全部操作:

將錯誤號加載到全局變量 errno 中。這是系統遇到的最后一個錯誤。

將錯誤號加載到當前任務的 tcb.err 字段中。如果在每個 RTOS 服務啟動時清除此字段,它將反映此任務使用的最后一個服務中發生的情況。如前所示,這對于本地錯誤管理是必要的。

增加一個全局錯誤計數器,errctr。這表明自系統啟動以來發生了多少錯誤。

為錯誤類型增加一個特定的計數器,errctrs[e]。這有助于確定交付的系統中出現了哪些問題。

將錯誤信息保存在錯誤緩沖區 EB 中,例如發生時間、errno 和發生錯誤的線程。

將錯誤信息保存在事件緩沖區 EVB 中,以便在使用內核感知插件時可以相對于其他事件顯示錯誤。

調用用戶掛鉤函數 EMHook() 以添加特定于錯誤和線程的處理。

如果當前任務損壞,則停止當前任務,如果錯誤不可恢復,則調用 EMExitHook() 重新啟動系統。

EM() 僅在發生錯誤時才會增加系統開銷。因此,可以將大量錯誤處理放入 EM() 中,而對正常系統操作的影響可以忽略不計。此外,相對于總代碼大小,代碼大小的增加很小。

決定使用什么

本地錯誤管理往往會增加主代碼的復雜性,使其變得更大、更慢。然而,錯誤通常可以在調用點得到最有效的處理,在某些情況下,這樣做是必不可少的。例如,在網絡軟件中,輸入數據包的空閑塊用完可能在重負載條件下是正常的。因此,在本地處理它是必要的。如前所述,這可以在不使主代碼嚴重復雜化的情況下完成。

但是,一旦調試完成,大多數錯誤將不再發生。超時可能是唯一需要處理的頻繁事件,并且可以相當簡單地處理它們。因此,在許多系統中,依賴中央錯誤管理可能是最佳選擇,因為它不會增加太多開銷,也不會使主代碼復雜化。然而,它允許查看錯誤發生的位置及其頻率。

使用 EMHook() 提供了一個中間地帶,可以為特定的錯誤和線程收集額外的信息。然后可以啟動錯誤或線程特定的恢復。

在典型系統中,許多路徑流經 RTOS,因此它處于檢測和處理錯誤的良好位置。一般來說,函數的返回值,尤其是 RTOS 服務,不應該在沒有檢查的情況下使用。不這樣做可能會導致嚴重的故障,并可能為惡意軟件提供入口點。完成主要代碼后,可以將注意力轉向適合已發布系統的錯誤處理的數量和類型。可能會選擇上述方法的某種組合。

審核編輯:郭婷

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

    關注

    5198

    文章

    20442

    瀏覽量

    333979
  • 計數器
    +關注

    關注

    32

    文章

    2315

    瀏覽量

    98170
  • RTOS
    +關注

    關注

    25

    文章

    866

    瀏覽量

    122975
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    請問沒有用到的I/0如何處理

    沒有用到的I/0如何處理
    發表于 01-12 06:29

    如何在Zephyr RTOS中實現延時和計時函數

    在實時操作系統(RTOS)中,時間管理是核心功能之一。無論是任務調度、超時控制,還是周期性事件,延時和計時機制都扮演著至關重要的角色。Zephyr RTOS作為一個輕量級、模塊化的開源系統,提供了
    的頭像 發表于 12-26 10:32 ?5427次閱讀
    如何在Zephyr <b class='flag-5'>RTOS</b>中實現延時和計時函數

    選擇RTOS的要點

    更小和資源有限的MCU。例如,CMX的CMX-RTX和CMX-Tiny+可運行在8位MCU到64位處理器上。 RTOS核心:調度和分割 大多數程序員不熟悉RTOS的限制和要求。大多數人通常因其性能
    發表于 12-12 08:00

    RTOS Crash 問題全維度分析與解決指南

    ) RT-Thread:動態內存耗盡觸發rt_system_heap_init失敗;FreeRTOS:隊列滿時xQueueSend超時無響應 中斷處理異常 1. 中斷優先級高于RTOS內核(搶占調度器)2. 中斷服務函數
    發表于 12-08 03:56

    串口空閑中斷與串口超時中斷介紹

    STM32的接收超時功能RTO)。 特點 基于時間閾值,與總線狀態無關。 可靈活配置超時時間。 需在每次收到數據時重置超時計數器。 應用場景 數據分段接收:處理間歇性數據流(如GP
    發表于 11-21 08:31

    Cortex-M0+處理器的HardFault錯誤介紹

    在ARM處理器中,如果一個程序產生了錯誤并且被處理器檢測到,就會產生錯誤異常。Cortex-M0+處理器只有一種異常用以
    的頭像 發表于 10-14 10:50 ?3378次閱讀
    Cortex-M0+<b class='flag-5'>處理</b>器的HardFault<b class='flag-5'>錯誤</b>介紹

    Stduio使用wifi模塊出錯如何處理

    外設為潘多拉IOT開發板,使用Stduio配置了wifi框架,但是代碼里在配置wifi模式時,沒有找到wlan0這個設備,wifi整個功能也用不了,請問應該如何處理。使用正點原子資料包里的rtthread測試demo,wifi工作正常,wifi模塊硬件沒有問題。
    發表于 10-10 08:18

    rtthread 4.1.1 lwip 2.1.2 由于系統計數溢出導致的發送超時何處理

    been written */ err = ERR_WOULDBLOCK; } else { /* partial write */ err = ERR_OK; } } 當系統計數器溢出時,不是會導致退出超時么?有什么處理比較好的
    發表于 09-24 07:49

    在rt-thread studio環境中之前編譯成功的項目(1234)重命名(test)后出現大批量的錯誤是什么原因造成?如何處理

    在rt-thread studio環境中之前編譯成功的項目(1234)重命名(test)后出現大批量的錯誤是什么原因造成?該如何處理?這很困擾,為啥重命名就能出現這樣的情況?
    發表于 09-17 06:58

    靜力水準儀在測量過程中遇到誤差如何處理?

    靜力水準儀在測量過程中遇到誤差如何處理?靜力水準儀在工程沉降監測中出現數據偏差時,需采取系統性處理措施。根據實際工況,誤差主要源于環境干擾、設備狀態、安裝缺陷及操作不當四類因素,需針對性解決。靜力
    的頭像 發表于 08-14 13:01 ?860次閱讀
    靜力水準儀在測量過程中遇到誤差如<b class='flag-5'>何處理</b>?

    使用RTOS的SDK,調整rtsmart-menuconfig出現編譯錯誤怎么解決?

    .想要啟用USB的Host主模式,在rtos_k230下改動rtsmart-menuconfig 2.進入RT-Thread Components---> 3.進入Device
    發表于 07-22 07:59

    請問中斷過多的時候進入硬件錯誤何處置?

    中斷過多的時候進入硬件錯誤何處置?是加看門狗還是加硬件錯誤處理
    發表于 07-21 06:11

    rtthread 4.1.1 lwip 2.1.2 由于系統計數溢出導致的發送超時何處理

    been written */ err = ERR_WOULDBLOCK; } else { /* partial write */ err = ERR_OK; } } 當系統計數器溢出時,不是會導致退出超時么?有什么處理比較好的
    發表于 06-13 08:07

    Cyusb3014讀取超時怎么處理

    我在官方SlaveFifoSync例程中,Host端程序偶爾會讀取數據WaitForXfer超時,給的超時時間足夠長,1500ms~30000ms都嘗試過了,沒有用。讀取超時的時候,FPGA出現
    發表于 05-09 07:42

    MCUX SDK FreeRTOS I2C驅動程序中沒有超時選項是怎么回事?

    (fsl_i2c_freertos.c) 不提供任何 I2C 傳輸超時機制。 當您調用 I2C_RTOS_Transfer() 時,它始終無限期地阻塞,因為它在等待傳輸完成。如果傳輸失敗,它只會永遠掛起。就我的目的而言,我
    發表于 04-11 08:05