91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

如何處理RTOS錯(cuò)誤和超時(shí)

星星科技指導(dǎo)員 ? 來(lái)源:嵌入式計(jì)算設(shè)計(jì) ? 作者:Micro Digital ? 2022-06-29 09:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大多數(shù) RTOS 提供對(duì)服務(wù)調(diào)用和其他類型錯(cuò)誤的監(jiān)控和報(bào)告。盡管人們普遍認(rèn)為良好的錯(cuò)誤處理有助于調(diào)試并提高可靠性,但很少有時(shí)間這樣做。問(wèn)題是我們已經(jīng)面臨實(shí)現(xiàn)主要項(xiàng)目目標(biāo)的挑戰(zhàn),處理錯(cuò)誤是一種不受歡迎的麻煩。這是不幸的,因?yàn)榱己玫腻e(cuò)誤檢測(cè)和處理可以減少調(diào)試時(shí)間并有助于處理交付系統(tǒng)中的問(wèn)題。

所需要的是將錯(cuò)誤和超時(shí)管理合并到嵌入式系統(tǒng)中的簡(jiǎn)單方法。有兩種錯(cuò)誤報(bào)告,本地和中央。由于并非所有 RTOS 都提供后者,讓我們從前者開(kāi)始。

本地錯(cuò)誤報(bào)告

本地報(bào)錯(cuò)基本上有兩種方法。第一個(gè)直接返回狀態(tài)信息并將所需結(jié)果放入作為參數(shù)提供的地址中。例如:

pYYBAGK7s3OAPsmdAAC2nr04VUM002.png

在這種情況下,任務(wù)控制塊 (TCB) 已被靜態(tài)定義。OSTaskCreate() 使用它的地址填寫(xiě) TCB 字段并返回 status = OK。如果發(fā)生錯(cuò)誤,例如無(wú)效的 TCB 地址,則 status 是錯(cuò)誤類型。這種方法的缺點(diǎn)是需要一個(gè)額外的參數(shù)來(lái)告訴將結(jié)果放在哪里以及需要靜態(tài)定義 TCB。

第二種方法直接返回結(jié)果,并將狀態(tài)放入當(dāng)前任務(wù)的 TCB 中的一個(gè)字段中。例如:

pYYBAGK7s3mARRqKAACWwcVPRYE293.png

在這種情況下,TCB 是從池中動(dòng)態(tài)分配的,如果成功,則 RTOS 返回其句柄。(句柄是taskA,它是一個(gè)指向taskA 的TCB 的指針。)如果不是,它返回NULL。在這種情況下,發(fā)生了錯(cuò)誤或超時(shí),并且狀態(tài)已存儲(chǔ)在 smx_ct-》err 中,其中 smx_ct 是當(dāng)前任務(wù),即嘗試創(chuàng)建 taskA 的任務(wù)。這些方法是等價(jià)的,但我更喜歡第二種,因?yàn)樗苯印?/p>

本地錯(cuò)誤和超時(shí)處理

這是一種處理本地錯(cuò)誤和超時(shí)的方法,而不會(huì)使主代碼復(fù)雜化:

poYBAGK7s4CABKoxAAMbVjsGTls165.png

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

錯(cuò)誤處理后,taskA_Main() 返回到調(diào)度程序,調(diào)度程序?qū)⑵渫V?。這確保了 taskA 在問(wèn)題得到解決之前不會(huì)造成進(jìn)一步的損害。一旦問(wèn)題得到解決,taskA 可以重新啟動(dòng),它會(huì)回到它的主處理循環(huán)。在調(diào)試時(shí),停止任務(wù)有助于診斷問(wèn)題并決定如何在已發(fā)布的系統(tǒng)中修復(fù)它。

taskA 也可以在不停止的情況下重新啟動(dòng),如無(wú)效 MCB 情況所示。在這種情況下,消息被丟棄,taskA 返回其主處理循環(huán)。重啟taskA是錯(cuò)誤處理的程度。此外,任務(wù)重啟后沒(méi)有中斷,因?yàn)樗蟛粫?huì)執(zhí)行任何語(yǔ)句。

此示例說(shuō)明如何區(qū)分超時(shí)和錯(cuò)誤以及如何區(qū)分錯(cuò)誤類型。請(qǐng)注意,可能需要通知然后重試的超時(shí)處理保留在主 while 循環(huán)中,而錯(cuò)誤處理在循環(huán)之外執(zhí)行。這使得主循環(huán)更容易理解,因?yàn)樗鼪](méi)有雜亂的錯(cuò)誤處理代碼。

通過(guò)將錯(cuò)誤處理代碼與主處理代碼分開(kāi),更容易將時(shí)間和精力集中在后者上。在調(diào)試期間,switch 語(yǔ)句可能僅用于放置斷點(diǎn)的位置。稍后,它可能會(huì)用案例充實(shí),如圖所示,或者用中央錯(cuò)誤處理代替。

中央錯(cuò)誤處理

中央錯(cuò)誤處理減少了對(duì)本地錯(cuò)誤處理的需求,如果由 RTOS 提供,則應(yīng)使用它。每當(dāng) RTOS 服務(wù)或 RTOS 本身檢測(cè)到錯(cuò)誤時(shí),都會(huì)調(diào)用 RTOS 錯(cuò)誤管理器 EM()。理想情況下,EM() 在系統(tǒng)堆棧中運(yùn)行,因此處理錯(cuò)誤不會(huì)導(dǎo)致任務(wù)堆棧溢出。這可能是一團(tuán)糟,因?yàn)樗浅龊跻饬系模?EM() 不太可能是可重入的。EM() 應(yīng)該執(zhí)行以下部分或全部操作:

將錯(cuò)誤號(hào)加載到全局變量 errno 中。這是系統(tǒng)遇到的最后一個(gè)錯(cuò)誤。

將錯(cuò)誤號(hào)加載到當(dāng)前任務(wù)的 tcb.err 字段中。如果在每個(gè) RTOS 服務(wù)啟動(dòng)時(shí)清除此字段,它將反映此任務(wù)使用的最后一個(gè)服務(wù)中發(fā)生的情況。如前所示,這對(duì)于本地錯(cuò)誤管理是必要的。

增加一個(gè)全局錯(cuò)誤計(jì)數(shù)器,errctr。這表明自系統(tǒng)啟動(dòng)以來(lái)發(fā)生了多少錯(cuò)誤。

為錯(cuò)誤類型增加一個(gè)特定的計(jì)數(shù)器,errctrs[e]。這有助于確定交付的系統(tǒng)中出現(xiàn)了哪些問(wèn)題。

將錯(cuò)誤信息保存在錯(cuò)誤緩沖區(qū) EB 中,例如發(fā)生時(shí)間、errno 和發(fā)生錯(cuò)誤的線程。

將錯(cuò)誤信息保存在事件緩沖區(qū) EVB 中,以便在使用內(nèi)核感知插件時(shí)可以相對(duì)于其他事件顯示錯(cuò)誤。

調(diào)用用戶掛鉤函數(shù) EMHook() 以添加特定于錯(cuò)誤和線程的處理。

如果當(dāng)前任務(wù)損壞,則停止當(dāng)前任務(wù),如果錯(cuò)誤不可恢復(fù),則調(diào)用 EMExitHook() 重新啟動(dòng)系統(tǒng)。

EM() 僅在發(fā)生錯(cuò)誤時(shí)才會(huì)增加系統(tǒng)開(kāi)銷。因此,可以將大量錯(cuò)誤處理放入 EM() 中,而對(duì)正常系統(tǒng)操作的影響可以忽略不計(jì)。此外,相對(duì)于總代碼大小,代碼大小的增加很小。

決定使用什么

本地錯(cuò)誤管理往往會(huì)增加主代碼的復(fù)雜性,使其變得更大、更慢。然而,錯(cuò)誤通??梢栽谡{(diào)用點(diǎn)得到最有效的處理,在某些情況下,這樣做是必不可少的。例如,在網(wǎng)絡(luò)軟件中,輸入數(shù)據(jù)包的空閑塊用完可能在重負(fù)載條件下是正常的。因此,在本地處理它是必要的。如前所述,這可以在不使主代碼嚴(yán)重復(fù)雜化的情況下完成。

但是,一旦調(diào)試完成,大多數(shù)錯(cuò)誤將不再發(fā)生。超時(shí)可能是唯一需要處理的頻繁事件,并且可以相當(dāng)簡(jiǎn)單地處理它們。因此,在許多系統(tǒng)中,依賴中央錯(cuò)誤管理可能是最佳選擇,因?yàn)樗粫?huì)增加太多開(kāi)銷,也不會(huì)使主代碼復(fù)雜化。然而,它允許查看錯(cuò)誤發(fā)生的位置及其頻率。

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

在典型系統(tǒng)中,許多路徑流經(jīng) RTOS,因此它處于檢測(cè)和處理錯(cuò)誤的良好位置。一般來(lái)說(shuō),函數(shù)的返回值,尤其是 RTOS 服務(wù),不應(yīng)該在沒(méi)有檢查的情況下使用。不這樣做可能會(huì)導(dǎo)致嚴(yán)重的故障,并可能為惡意軟件提供入口點(diǎn)。完成主要代碼后,可以將注意力轉(zhuǎn)向適合已發(fā)布系統(tǒng)的錯(cuò)誤處理的數(shù)量和類型。可能會(huì)選擇上述方法的某種組合。

審核編輯:郭婷

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

    關(guān)注

    5198

    文章

    20435

    瀏覽量

    333932
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2315

    瀏覽量

    98165
  • RTOS
    +關(guān)注

    關(guān)注

    25

    文章

    866

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)沒(méi)有用到的I/0如何處理?

    沒(méi)有用到的I/0如何處理?
    發(fā)表于 01-12 06:29

    如何在Zephyr RTOS中實(shí)現(xiàn)延時(shí)和計(jì)時(shí)函數(shù)

    在實(shí)時(shí)操作系統(tǒng)(RTOS)中,時(shí)間管理是核心功能之一。無(wú)論是任務(wù)調(diào)度、超時(shí)控制,還是周期性事件,延時(shí)和計(jì)時(shí)機(jī)制都扮演著至關(guān)重要的角色。Zephyr RTOS作為一個(gè)輕量級(jí)、模塊化的開(kāi)源系統(tǒng),提供了
    的頭像 發(fā)表于 12-26 10:32 ?5403次閱讀
    如何在Zephyr <b class='flag-5'>RTOS</b>中實(shí)現(xiàn)延時(shí)和計(jì)時(shí)函數(shù)

    選擇RTOS的要點(diǎn)

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

    RTOS Crash 問(wèn)題全維度分析與解決指南

    ) RT-Thread:動(dòng)態(tài)內(nèi)存耗盡觸發(fā)rt_system_heap_init失??;FreeRTOS:隊(duì)列滿時(shí)xQueueSend超時(shí)無(wú)響應(yīng) 中斷處理異常 1. 中斷優(yōu)先級(jí)高于RTOS內(nèi)核(搶占調(diào)度器)2. 中斷服務(wù)函數(shù)
    發(fā)表于 12-08 03:56

    串口空閑中斷與串口超時(shí)中斷介紹

    STM32的接收超時(shí)功能RTO)。 特點(diǎn) 基于時(shí)間閾值,與總線狀態(tài)無(wú)關(guān)。 可靈活配置超時(shí)時(shí)間。 需在每次收到數(shù)據(jù)時(shí)重置超時(shí)計(jì)數(shù)器。 應(yīng)用場(chǎng)景 數(shù)據(jù)分段接收:處理間歇性數(shù)據(jù)流(如GP
    發(fā)表于 11-21 08:31

    Cortex-M0+處理器的HardFault錯(cuò)誤介紹

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

    Stduio使用wifi模塊出錯(cuò)如何處理

    外設(shè)為潘多拉IOT開(kāi)發(fā)板,使用Stduio配置了wifi框架,但是代碼里在配置wifi模式時(shí),沒(méi)有找到wlan0這個(gè)設(shè)備,wifi整個(gè)功能也用不了,請(qǐng)問(wèn)應(yīng)該如何處理。使用正點(diǎn)原子資料包里的rtthread測(cè)試demo,wifi工作正常,wifi模塊硬件沒(méi)有問(wèn)題。
    發(fā)表于 10-10 08:18

    rtthread 4.1.1 lwip 2.1.2 由于系統(tǒng)計(jì)數(shù)溢出導(dǎo)致的發(fā)送超時(shí)何處理

    been written */ err = ERR_WOULDBLOCK; } else { /* partial write */ err = ERR_OK; } } 當(dāng)系統(tǒng)計(jì)數(shù)器溢出時(shí),不是會(huì)導(dǎo)致退出超時(shí)么?有什么處理比較好的
    發(fā)表于 09-24 07:49

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

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

    靜力水準(zhǔn)儀在測(cè)量過(guò)程中遇到誤差如何處理?

    靜力水準(zhǔn)儀在測(cè)量過(guò)程中遇到誤差如何處理?靜力水準(zhǔn)儀在工程沉降監(jiān)測(cè)中出現(xiàn)數(shù)據(jù)偏差時(shí),需采取系統(tǒng)性處理措施。根據(jù)實(shí)際工況,誤差主要源于環(huán)境干擾、設(shè)備狀態(tài)、安裝缺陷及操作不當(dāng)四類因素,需針對(duì)性解決。靜力
    的頭像 發(fā)表于 08-14 13:01 ?858次閱讀
    靜力水準(zhǔn)儀在測(cè)量過(guò)程中遇到誤差如<b class='flag-5'>何處理</b>?

    使用RTOS的SDK,調(diào)整rtsmart-menuconfig出現(xiàn)編譯錯(cuò)誤怎么解決?

    .想要啟用USB的Host主模式,在rtos_k230下改動(dòng)rtsmart-menuconfig 2.進(jìn)入RT-Thread Components---> 3.進(jìn)入Device
    發(fā)表于 07-22 07:59

    請(qǐng)問(wèn)中斷過(guò)多的時(shí)候進(jìn)入硬件錯(cuò)誤何處置?

    中斷過(guò)多的時(shí)候進(jìn)入硬件錯(cuò)誤何處置?是加看門狗還是加硬件錯(cuò)誤處理?
    發(fā)表于 07-21 06:11

    rtthread 4.1.1 lwip 2.1.2 由于系統(tǒng)計(jì)數(shù)溢出導(dǎo)致的發(fā)送超時(shí)何處理?

    been written */ err = ERR_WOULDBLOCK; } else { /* partial write */ err = ERR_OK; } } 當(dāng)系統(tǒng)計(jì)數(shù)器溢出時(shí),不是會(huì)導(dǎo)致退出超時(shí)么?有什么處理比較好的
    發(fā)表于 06-13 08:07

    Cyusb3014讀取超時(shí)怎么處理?

    我在官方SlaveFifoSync例程中,Host端程序偶爾會(huì)讀取數(shù)據(jù)WaitForXfer超時(shí),給的超時(shí)時(shí)間足夠長(zhǎng),1500ms~30000ms都嘗試過(guò)了,沒(méi)有用。讀取超時(shí)的時(shí)候,F(xiàn)PGA出現(xiàn)
    發(fā)表于 05-09 07:42

    MCUX SDK FreeRTOS I2C驅(qū)動(dòng)程序中沒(méi)有超時(shí)選項(xiàng)是怎么回事?

    (fsl_i2c_freertos.c) 不提供任何 I2C 傳輸超時(shí)機(jī)制。 當(dāng)您調(diào)用 I2C_RTOS_Transfer() 時(shí),它始終無(wú)限期地阻塞,因?yàn)樗诘却齻鬏斖瓿伞H绻麄鬏斒?,它只?huì)永遠(yuǎn)掛起。就我的目的而言,我
    發(fā)表于 04-11 08:05