嵌入式學習筆記 - freeRTOS vTaskPlaceOnEventList()函數解析

vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );

函數第一個參數為消息隊列等待插入鏈表,

void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait )
{
?? ?configASSERT( pxEventList );

?? ?/* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE
?? ?SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */

?? ?/* Place the event list item of the TCB in the appropriate event list.
?? ?This is placed in the list in priority order so the highest priority task
?? ?is the first to be woken by the event. ?The queue that contains the event
?? ?list is locked, preventing simultaneous access from interrupts. */
?? ?vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) );//將當前任務的事件屬性插入消息隊列等待插入鏈表

?? ?prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );//將當前任務的狀態屬性部分插入延時鏈表
}

結論:

也就是說一個任務有兩個屬性,

一個是狀態屬性,可能位于就緒列表,延時列表,掛起列表,其中一個

另一個是事件屬性,可能位于掛起等待列表,或者消息隊列等待列表

這種設計實現了事件與狀態管理的分離

以下是deepseek關于PendingReadyList的解釋,待證實供參考

FreeRTOS 會將?xPendingReadyList(或類似機制)中的任務轉移出去,主要發生在以下兩個關鍵時機:

  1. ?調度請求發生時(任務切換前)?:當系統需要執行任務切換時(例如調用?taskYIELD()、調用某些可能導致任務切換的 API、中斷服務程序(ISR)結束時請求調度?portYIELD_FROM_ISR())18,調度器核心函數?vTaskSwitchContext()?會被調用。在該函數的執行過程中,會檢查并處理?xPendingReadyList28。

  2. ?系統節拍中斷(SysTick)結束時?:在系統節拍中斷服務程序(SysTick ISR)的執行流程中,當它處理完時間相關的任務(如更新阻塞任務的延時計時器、處理時間片輪詢)后,在退出中斷前通常會觸發一個 PendSV 中斷(通過向中斷控制寄存器寫入特定值)1。后續 PendSV 中斷服務程序被執行時,其主要工作就是執行上下文切換(任務切換),此時同樣會調用?vTaskSwitchContext()?函數,從而處理?xPendingReadyList12。

?在?vTaskSwitchContext()?中具體做了什么??

  1. ?檢查調度器狀態?:首先確認調度器未被掛起或鎖定,否則不能進行任務切換1。
  2. ?查找最高優先級就緒任務?:調用類似?taskSELECT_HIGHEST_PRIORITY_TASK()?的宏來查找下一個應該運行的任務18。
  3. ?處理 PendingReady List?:?正是在查找最高優先級就緒任務之前或過程中,調度器會檢查?xPendingReadyList?27。對于?xPendingReadyList?中的每個任務:
    • 將其?xEventListItem?從?xPendingReadyList?中移除。
    • 根據該任務的優先級,將其?xStateListItem?插入到對應的優先級就緒列表 (pxReadyTasksLists[priority]) 中2。至此,該任務就被真正轉移到了就緒態列表,具備了被調度執行的資格
  4. ?選擇并切換任務?:完成?xPendingReadyList?的處理后,調度器繼續執行查找最高優先級就緒任務的操作(此時剛轉移過來的任務也參與了優先級比較),最終確定并切換到下一個要運行的任務 (更新?pxCurrentTCB)18。

?為什么會有?xPendingReadyList?

  • ?分離事件與狀態管理?:xEventListItem?用于事件相關的阻塞和解阻塞操作(如等待信號量、隊列、事件組等),而?xStateListItem?用于任務在狀態列表(就緒列表、阻塞列表等)中的管理2。
  • ?效率與原子性?:當一個任務在?中斷服務程序(ISR)? 中被事件喚醒(如 ISR 釋放了一個信號量或向隊列發送了數據),該任務需要從阻塞態轉移到就緒態。直接在 ISR 中操作就緒列表 (pxReadyTasksLists) 會增加 ISR 執行時間,且可能涉及到復雜的臨界區管理。將其臨時放入?xPendingReadyList?是一個輕量級的操作27。
  • ?延遲處理?:實際的轉移操作(從?xPendingReadyList?到?pxReadyTasksLists)被推遲到調度器下一次執行任務切換的上下文(在?vTaskSwitchContext()?中)進行,這通常是在退出中斷后的任務級上下文或 PendSV 中斷中,此時進行復雜的狀態列表操作更安全、更高效,也確保了任務狀態變更的原子性28。

?總結:?

FreeRTOS 在 ?任務調度請求發生時(包括顯式調用?taskYIELD()?或相關 API)? 和 ?系統節拍中斷(SysTick)觸發 PendSV 中斷后?,執行任務切換的核心函數?vTaskSwitchContext()。?正是在?vTaskSwitchContext()?函數中查找下一個要運行的任務之前,系統會檢查?xPendingReadyList,將其中的所有任務轉移到它們對應優先級的就緒列表 (pxReadyTasksLists) 中?。這種設計主要是為了高效、安全地處理從中斷上下文中喚醒的任務,分離事件處理和狀態管理12。

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

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

相關文章

Ubuntu 配置使用 zsh + 插件配置 + oh-my-zsh 美化過程

Ubuntu 配置使用 zsh 插件配置 oh-my-zsh 美化過程 引言zsh 安裝及基礎配置oh-my-zsh 安裝及美化配置oh-my-zsh 安裝主題美化配置主題自定義主題 插件安裝及配置官方插件查看及啟用插件安裝 主題文件備份.zshrcre5et_self.zsh-theme 同步發布在個人筆記Ubuntu 配置使用 zsh …

Xilinx FPGA 重構Multiboot ICAPE2和ICAPE3使用

一、FPGA Multiboot 本文主要介紹基于IPROG命令的FPGA多版本重構,用ICAP原語實現在線多版本切換。需要了解MultiBoot Fallback點擊鏈接。 如下圖所示,ICAP原語可實現flash中n1各版本的動態切換,在工作過程中,可以通過IPROG命令切…

springMVC-11 中文亂碼處理

前言 本文介紹了springMVC中文亂碼的解決方案,同時也貼出了本人遇到過的其他亂碼情況,可以根據自身情況選擇合適的解決方案。 其他-jdbc、前端、后端、jsp亂碼的解決 Tomcat導致的亂碼解決 自定義中文亂碼過濾器 老方法,通過javaW…

mysql-innoDB存儲引擎事務的原理

InnoDB 存儲引擎支持 ACID 事務,其事務機制是通過 Redo Log(重做日志)、Undo Log(回滾日志) 和 事務日志系統 來實現的。下面詳細解析 InnoDB 事務的工作原理。 1.事務的基本特性(ACID) 特性描…

在GIS 工作流中實現數據處理

通過將 ArcPy 應用于實際的 GIS 工作流,我們可以高效地完成數據處理任務,節省大量時間和精力。接下來,本文將結合具體案例,詳細介紹如何運用 ArcPy 實現 GIS 數據處理的全流程。 數據讀取與合并 假設我們有多個 shapefile 文件&a…

第十四屆藍橋杯_省賽B組(C).冶煉金屬

題目如下: 拿到題我們來看一下,題目的意思,就是求出N個記錄中的最大最小值,言外之意就是,如果超過了這個最大值不行,如果小于這個最小值也不行,所以我們得出,這道題是一個二分答案的題目&#x…

??Android 如何查看CPU架構?2025年主流架構有哪些??

在開發安卓應用或選購手機時,了解設備的CPU架構至關重要。不同的架構影響性能、兼容性和能效比。那么,??如何查看安卓設備的CPU架構?2025年主流架構有哪些?不同架構之間有什么區別??? 本文將為你詳細解答。 ??1.…

飛算 JavaAI 2.0.0:開啟老項目迭代維護新時代

在軟件開發領域,老項目的迭代與維護一直是開發團隊面臨的難題。代碼邏輯混亂、技術棧陳舊、開發效率低下等問題,讓老項目改造猶如一場 “噩夢”。而飛算 JavaAI 2.0.0 版本的正式上線,通過三大核心能力升級,為老項目開發帶來了全新…

Linux初步介紹

Linux是一種開源的類Unix操作系統內核,廣泛應用于服務器、桌面、嵌入式設備等各種計算平臺。它由Linus Torvalds于1991年首次開發,因其穩定性、安全性和靈活性,被全球開發者和企業廣泛采用。 特點: 開放性(開源&#…

OneNet + openssl + MQTT

1.OneNet 使用的教程 1.在網絡上搜索onenet,注冊并且登錄賬號。 2.產品服務-----物聯網服務平臺立即體驗 3.在底下找到立即體驗進去 4.產品開發------創建產品 5.關鍵是選擇MQTT,其他的內容自己填寫 6.這里產品以及開發完成,接下來就是添加設…

行為設計模式之Memento(備忘錄)

行為設計模式之Memento(備忘錄) 前言: 備忘錄設計模式,有點像vmware快照可以回滾,idea的提交記錄同樣可以混滾,流程引擎中流程可以撤銷到或者回滾到某個指定的狀態。 1)意圖 在不破壞封裝性的…

動畫直播如何顛覆傳統?解析足球籃球賽事的數據可視化革命

在5G和AI技術快速發展的今天,體育賽事直播正在經歷一場深刻的變革。傳統視頻直播雖然能提供真實的比賽畫面,但在戰術可視化、數據深度和交互體驗方面存在明顯短板。而基于實時數據驅動的動畫直播技術,正通過創新的方式彌補這些不足&#xff0…

二刷蒼穹外賣 day01

nginx nginx反向代理 將前端發送的請求由nginx轉發到后端服務器 好處: 提速:nginx本身可緩存數據 負載均衡:配置多臺服務器,大量請求來臨可均衡分配 保證后端安全:不暴露后端服務真實地址 server{listen 80;server_…

5.2 HarmonyOS NEXT應用性能診斷與優化:工具鏈、啟動速度與功耗管理實戰

HarmonyOS NEXT應用性能診斷與優化:工具鏈、啟動速度與功耗管理實戰 在HarmonyOS NEXT的全場景生態中,應用性能直接影響用戶體驗。通過專業的性能分析工具鏈、針對性的啟動速度優化,以及精細化的功耗管理,開發者能夠構建"秒…

模型訓練-關于token【低概率token, 高熵token】

Qwen團隊新發現:大模型推理能力的提高僅由少數高熵 Token 貢獻 不要讓低概率token主導了LLM的強化學習過程 一 低概率詞元問題 論文:Do Not Let Low-Probability Tokens Over-Dominate in RL for LLMs 在RL訓練過程中,低概率詞元&#xff08…

XCTF-web-easyupload

試了試php,php7,pht,phtml等,都沒有用 嘗試.user.ini 抓包修改將.user.ini修改為jpg圖片 在上傳一個123.jpg 用蟻劍連接,得到flag

gRPC、WebSocket 與 HTTP 的核心區別對比

gRPC、WebSocket 與 HTTP 的核心區別對比,涵蓋通信模式、協議特性及適用場景: 🔄 ?一、通信模式? ?HTTP? ?單向請求-響應?:客戶端發起請求,服務器返回響應后連接立即關閉13。?無狀態協議?:每次請求…

Android第十三次面試總結(四大 組件基礎)

Activity生命周期和四大啟動模式詳解 一、Activity 生命周期 Activity 的生命周期由一系列回調方法組成,用于管理其創建、可見性、焦點和銷毀過程。以下是核心方法及其調用時機: ?onCreate()?? ?調用時機?:Activity 首次創建時調用。?…

講講JVM的垃圾回收機制

垃圾回收就是對內存堆中已經死亡或者長時間沒有使用的對象進行清楚或回收。 JVM 在做 GC 之前,會先搞清楚什么是垃圾,什么不是垃圾,通常會通過可達性分析算法來判斷對象是否存活。 在確定了那些垃圾可以被回收后,垃圾回收器&…

QT軟件外包開發費用

國內QT軟件外包開發費用是一個非常復雜的問題,沒有一個固定的價格,它受到多種因素的影響。以下將詳細闡述影響QT軟件外包開發費用的主要因素,并提供大致的價格區間供參考(請注意,這些價格僅為估算,實際報價…