通過BUG(prvIdleTask、pxTasksWaitingTerminatio不斷跳轉問題)了解空閑函數(prvIdleTask)和TCB

一、前言與問題

在基于 FreeRTOS 的嵌入式系統中,我使用 STM32F1 開發一個 MQTT 客戶端應用,涉及兩個主要任務:

  • ATRecvParser:負責解析 Wi-Fi 模塊的 AT 命令響應(如 OK、ERROR 和 +IPD 數據)。
  • MQTT_Client_Task:通過 MQTT 協議連接服務器,訂閱主題并發布消息。

在運行過程中,程序出現以下異常:

  1. 調用棧跳轉:調試器顯示程序在 prvIdleTask(空閑任務)prvCheckTasksWaitingTermination(FreeRTOS 內部清理函數)之間反復跳轉,無法正常運行。
  2. TCB 異常:任務控制塊(TCB)的 pxTCB 值顯示為 0xA5A5A5A5(未初始化值),表明 TCB 可能損壞。

    二、了解空閑任務prvIdleTask、pxTasksWaitingTerminatio、TCB

    1、什么是空閑任務-----prvIdleTask

    1.調用時間

    在沒有其他任務可運行時(沒有任何其他任務處于就緒態)保持 CPU 忙碌

    2.調用例子:

    系統中有三個任務:defaultTaskATRecvParser MQTT_Client_Task

    • defaultTask 調用 osDelay(1),幾乎一直處于阻塞態。
    • ATRecvParser 因 HAL_AT_Secv 阻塞。
    • MQTT_Client_Task 已刪除,不再調度。

    此時,當系統中無其他就緒任務時,調度器將 CPU 分配給 prvIdleTask。

    ? 3.特征

    • 自動創建,優先級最低(通常為 0)。
    • prvIdleTask 是一個無限循環任務,包含 for(;;) 循環,定期檢查系統狀態。
    • 執行低優先級操作(如電源管理鉤子)。
    • 調用 prvCheckTasksWaitingTermination 清理已刪除任務。
    • (避免進入低功耗模式,視配置而定)。

    二、什么是pxTasksWaitingTerminatio

    • prvCheckTasksWaitingTermination
      • 這是 FreeRTOS 內部函數(定義在 tasks.c 中),負責檢查并清理 pxTasksWaitingTermination 列表中的已刪除任務。
      • 當任務被 vTaskDelete 標記為待刪除時,FreeRTOS 將其 TCB 加入該列表。prvCheckTasksWaitingTermination 會釋放 TCB 和棧內存,但前提是任務列表有效且資源可用。
      • 如果 TCB 指針無效或列表遍歷出錯,函數可能進入死循環或異常狀態。

    關系:

    • prvIdleTask 是 prvCheckTasksWaitingTermination 的調用者之一。空閑任務在系統空閑時運行,負責清理工作,因此當 MQTT_Client_Task 刪除后,prvIdleTask 會嘗試調用 prvCheckTasksWaitingTermination。

    三、TCB

    TCB(Task Control Block,任務控制塊) 是 FreeRTOS 中用于管理任務的核心數據結構。它存儲了一個任務的所有關鍵信息,以便 FreeRTOS 調度器能夠正確地創建、調度、暫停或刪除任務。TCB 包含以下主要內容:任務的棧指針。任務狀態:如運行態、就緒態、阻塞態等。任務優先級:決定調度順序。任務名稱:用于調試。

    以下是一個TCB的內容:在這里展現的是一個損壞的TCB,正常 TCB:pxTCB 應為有效地址(如 0x20001000),pxTopOfStack 指向棧頂,xStateListItem 包含有效列表項。

    問題:

    每個任務都有一個獨立的 TCB。那我上面的prvCheckTasksWaitingTermination();有不是一個任務,為什么可以看見他的TCB?

    • pxTCB 并不是 prvCheckTasksWaitingTermination 自己的 TCB(因為它不是任務),而是它正在處理的某個已刪除任務(如 MQTT_Client_Task)的 TCB。
    • FreeRTOS 的 TCB 是動態分配的,當任務刪除時,TCB 被加入 pxTasksWaitingTermination,等待清理。prvCheckTasksWaitingTermination 從列表中取出 TCB,賦值給局部變量 pxTCB 進行處理。

    四、TCB損壞導致pxTasksWaitingTerminatio和prvIdleTask之間跳轉

    正常情況下,MQTT_Client_Task 刪除后,ATRecvParser 阻塞,系統中無就緒任務,prvIdleTask 運行并通過 prvCheckTasksWaitingTermination 清理資源,隨后持續運行直到有任務就緒。

    TCB 損壞原因

    • 棧溢出:MQTT_Client_Task 的棧(2048 字節)可能不足,溢出覆蓋 TCB 內存。
    • 內存不足:堆內存(2032 字節)可能無法分配 TCB 或棧,導致無效指針。
    • 任務刪除異常:vTaskDelete(NULL) 在網絡操作未完成時執行,TCB 狀態不一致。
    • 互斥鎖死鎖:at_ret_mutex 未解鎖,阻塞 ATSendCmd,影響 mqtt_connect,導致 TCB 未正確更新。

    我就是因為刪除的任務重,at_ret_mutex 未解鎖就把任務刪除了,導致資源為釋放,TCB損壞

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/news/908417.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/news/908417.shtml
    英文地址,請注明出處:http://en.pswp.cn/news/908417.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    繼MySQL之后的技術-JDBC-從淺到深-02

    目錄 概念 編程六部曲 SQL注入和statement 工具類的封裝 JDBC事務 模糊查詢 批處理 數據庫連接池 Apache-DBUtils BasicDao 概念 JDBC為訪問不同的數據庫提供了統一的接口,為使用者屏蔽了細節問題。 Java程序員使用JDBC,可以連接任何提供了JD…

    【配置 YOLOX 用于按目錄分類的圖片數據集】

    現在的圖標點選越來越多,如何一步解決,采用 YOLOX 目標檢測模式則可以輕松解決 要在 YOLOX 中使用按目錄分類的圖片數據集(每個目錄代表一個類別,目錄下是該類別的所有圖片),你需要進行以下配置步驟&#x…

    淺談python如何做接口自動化

    工具與環境準備 開發工具 PyCharm專業版:支持項目視圖、代碼導航、調試功能和主流框架開發官方資源:JetBrains PyCharm 數據庫操作 使用mysqlclient庫操作MySQL(Django官方推薦)安裝命令:pip install mysqlclient1.3.…

    知識圖譜技術概述

    一、概述 知識圖譜(Knowledge Graph) 是一種基于圖結構的語義網絡,用于表示實體及其之間的關系,旨在實現更智能的知識表示和推理。它通過將現實世界中的各類信息抽象為 “實體-關系-實體” 的三元組結構,構建出復雜的知…

    NodeJS Koa 后端用戶會話管理,JWT, Session,長短Token,本文一次性講明白

    前言 前幾天,我寫了一篇文章,《我設計的一個安全的 web 系統用戶密碼管理流程》。其中著重點是講的如何利用非對稱加密進行安全的設計,并在講述了原理之后,又寫了 《node 后端和瀏覽器前端,有關 RSA 非對稱加密的完整…

    0.5S 級精度背后:DJSF1352-RN-6 如何讓儲能電站的每 1kWh 都「有跡可循」?

    1、背景 在能源轉型的時代洪流里,大型儲能電站作為保障電網穩定運行、平衡能源供需的核心基礎設施,其戰略價值愈發凸顯。而儲能電站的高效運轉,始終離不開精準的電能計量體系支撐。今日為您重點推介一款針對 1500V 儲能系統研發的專業電能表…

    Linux運維筆記:服務器安全加固

    文章目錄 背景加固措施1. 修改用戶密碼2. 使用公鑰認證替代密碼登錄3. 強化系統安全4. 掃描與清理殘留威脅5. 規范軟件管理(重點) 注意事項總結 提示:本文總結了大學實驗室 Linux 電腦感染挖礦病毒后的安全加固措施,重點介紹用戶密…

    Pycharm 配置解釋器

    今天更新了一版pycharm,因為很久沒有配置解釋器了,發現一直失敗。經過來回試了幾次終于成功了,記錄一下過程。 Step 1 Step 2 這里第二步一定要注意類型要選擇python 而不是conda。 雖然我的解釋器是conda 里面建立的一個環境。挺有意思的

    【Linux】awk 命令詳解及使用示例:結構化文本數據處理工具

    【Linux】awk 命令詳解及使用示例:結構化文本數據處理工具 引言 awk 是一種強大的文本處理工具和編程語言,專為處理結構化文本數據而設計。它的名稱來源于其三位創始人的姓氏首字母:Alfred Aho、Peter Weinberger 和 Brian Kernighan。 基…

    MS1023/MS1224——10MHz 到 80MHz、10:1 LVDS 并串轉換器(串化器)/串并轉換器(解串器)

    產品簡述 MS1023 串化器和 MS1224 解串器是一對 10bit 并串 / 串并轉 換芯片,用于在 LVDS 差分底板上傳輸和接收 10MHz 至 80MHz 的并行字速率的串行數據。起始 / 停止位加載后,轉換為負載編 碼輸出,串行數據速率介于 120Mbps…

    跟我學c++中級篇——理解類型推導和C++不同版本的支持

    一、類型推導 在前面反復分析過類型推導(包括前面提到的類模板參數推導CTAD),類型推導其實就是滿足C語言這種強類型語言的要求即編譯期必須確定對象的數據類型。換一句話說,理論上如果編譯器中能夠自動推導所有的相關數據類型&am…

    vue3+TS+eslint9配置

    記錄eslint升級到9.x的版本之后遇到的坑 在 ESLint 9 中,配置方式發生了變化。Flat Config 格式(eslint.config.js 或 .ts)不再支持 extensions 選項。所以vscode編輯器中的 extensions 需要注釋掉,要不然保存的時候不會格式化。…

    書籍推薦 --- 《篳路維艱:中國經濟社會主義路徑的五次選擇》

    蕭冬連.篳路維艱:中國社會主義路徑的五次選擇[M]. 前不久看完的這本書,還是蠻受震撼的。 這本書比較細致地(引用了很多的史料)、從中央高層的視角講解了從新中國成立一直到改革開放初期這30多年里(1949---1980年代)發生在我國的幾次重大事件(三大改造、第一個五年計…

    C++課設:簡易日歷程序(支持傳統節假日 + 二十四節氣 + 個人紀念日管理)

    名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊) 專欄介紹:《編程項目實戰》 目錄 一、為什么要開發一個日歷程序&#xff…

    (三)動手學線性神經網絡:從數學原理到代碼實現

    1 線性回歸 線性回歸是一種基本的預測模型,用于根據輸入特征預測連續的輸出值。它是機器學習和深度學習中最簡單的模型之一,但卻是理解更復雜模型的基礎。 1.1 線性回歸的基本元素 概念理解: 線性回歸假設輸入特征和輸出之間存在線性關系。…

    二十五、面向對象底層邏輯-SpringMVC九大組件之HandlerMapping接口設計

    一、引言:MVC架構的交通樞紐 在Spring MVC框架中,HandlerMapping接口扮演著"請求導航儀"的關鍵角色,它決定了HTTP請求如何被路由到對應的Controller處理器。作為MVC模式的核心組件之一,HandlerMapping在請求處理的生命…

    凌晨四點的星光

    凌晨四點的城市像臺停止運轉的老舊機器,陳明裹緊外套踩著路燈的殘影往家走。鍵盤敲擊聲仿佛還在耳邊回響,他揉了揉酸澀的眼睛,手機屏幕突然亮起,是妻子發來的消息:“孩子又發燒了,我帶他去醫院。” 這是他…

    Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 電子聯鎖

    Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 電子聯鎖

    LeetCode 熱題 100 74. 搜索二維矩陣

    LeetCode 熱題 100 | 74. 搜索二維矩陣 大家好,今天我們來解決一道經典的算法題——搜索二維矩陣。這道題在 LeetCode 上被標記為中等難度,要求我們在一個滿足特定條件的二維矩陣中查找一個目標值。如果目標值在矩陣中,返回 true&#xff1b…

    如何在 HTML 中添加按鈕

    原文:如何在 HTML 中添加按鈕 | w3cschool筆記 (請勿將文章標記為付費!!!!) 在網頁開發中,按鈕是用戶界面中不可或缺的元素之一。無論是用于提交表單、觸發動作還是導航&#xff0…