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

? ? 第一部分? ? ? 移除掛起等待列表中的任務? ? ?

????????????????while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )//循環尋找直到為空,把全部任務掃描一遍
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );//獲取掛起等待列表中的任務的控制塊指針
?? ??? ??? ??? ??? ?( void ) uxListRemove( &( pxTCB->xEventListItem ) );? //從事件列表中刪除
?? ??? ??? ??? ??? ?( void ) uxListRemove( &( pxTCB->xStateListItem ) );//從掛起列表中刪除
?? ??? ??? ??? ??? ?prvAddTaskToReadyList( pxTCB ); //加入就緒列表

?? ??? ??? ??? ??? ?/* If the moved task has a priority higher than the current
?? ??? ??? ??? ??? ?task then a yield must be performed. */
?? ??? ??? ??? ??? ?if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?xYieldPending = pdTRUE;? //如果恢復的等待列表中的此任務優先級大于當前任務,使能切換
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?else
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?mtCOVERAGE_TEST_MARKER();
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}

第二部分 補齊錯過的systick計數以及相應的處理

UBaseType_t uxPendedCounts = uxPendedTicks; /* Non-volatile copy. */

?? ??? ??? ??? ??? ?if( uxPendedCounts > ( UBaseType_t ) 0U )
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?do
?? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ?if( xTaskIncrementTick() != pdFALSE ) //xTaskIncrementTick()函數用于是否有延時到期的任務,并將其恢復到就緒列表,如果其優先級比當前任務高,則同時使能切換標志,注意僅僅是使能標志,未實際切換。并將切換標志返回
?? ??? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ?xYieldPending = pdTRUE; //需要任務切換
?? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ?else
?? ??? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ?mtCOVERAGE_TEST_MARKER();
?? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ?--uxPendedCounts;
?? ??? ??? ??? ??? ??? ?} while( uxPendedCounts > ( UBaseType_t ) 0U ); //循環補齊systick計數,才能找到所有到期任務,因為循環一次xConstTickCount只能加一次,加到跟當前TickCount值相同才能找處所有xNextTaskUnblockTime到期的任務

?? ??? ??? ??? ??? ??? ?uxPendedTicks = 0;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?else
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?mtCOVERAGE_TEST_MARKER();
?? ??? ??? ??? ??? ?}

第三部分 判斷是否需要切換任務

if( xYieldPending != pdFALSE )? //如果xYieldPending為1,在上面兩部分得到的值
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?#if( configUSE_PREEMPTION != 0 )
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?xAlreadyYielded = pdTRUE;? ?//感覺邏輯上應該把下一句切換移到這個條件編譯里面如果configUSE_PREEMPTION 定義為 0,就不進行任務切換同時xAlreadyYielded也不賦值為1,就是記錄為沒切換過,可能是因為這種情況下taskYIELD_IF_USING_PREEMPTION()未定義(如下圖所示),默認為taskYIELD_IF_USING_PREEMPTION()不起作用,所以不對xAlreadyYielded進行賦值

另外我的理解configUSE_PREEMPTION 定義為 0時,xYieldPending 不可能等于pdTRUE?因為如果configUSE_PREEMPTION == 0任務不可能在延時列表,也不可能在掛起等待就緒列表,進入掛起等待就緒列表是從延時列表進入的
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?#endif
?? ??? ??? ??? ??? ?taskYIELD_IF_USING_PREEMPTION();? // 進行實際的任務切換,這一條很關鍵,也就是說xTaskResumeAll( )函數是能進行實際的任務切換的,不只是判斷是否認該切換,上面有個#if并不是if,很容易理解成此語句不執行
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?mtCOVERAGE_TEST_MARKER();
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?mtCOVERAGE_TEST_MARKER();
?? ??? ?}
?? ?}
?? ?taskEXIT_CRITICAL();

?? ?return xAlreadyYielded;//? 返回是否切換過的標志,如果未切換過,出去后是一定要切換的,因為將當前任務加到等待插入列表,以及延時列表之后,當前任務要處于阻塞狀態,是一定要切換到其他任務的

?四 若未發生實際任務切換的處理

以下函數是xTaskResumeAll() 的調用函數,是將消息加入隊列的一個函數

???if( prvIsQueueFull( pxQueue ) != pdFALSE )
?? ??? ??? ?{
?? ??? ??? ??? ?traceBLOCKING_ON_QUEUE_SEND( pxQueue );
?? ??? ??? ??? ?vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );


?? ??? ??? ??? ?if( xTaskResumeAll() == pdFALSE ) //如果xTaskResumeAll()內未發生實際切換
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?portYIELD_WITHIN_API();?
// 強制進行任務切換,也就是說一定要切換一次
?? ??? ??? ??? ?}

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

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

相關文章

大數據+智能零售:數字化變革下的“智慧新零售”密碼

大數據+智能零售:數字化變革下的“智慧新零售”密碼 大家好,今天咱們聊聊一個火到不行的話題:大數據在智能零售中的應用。這個領域,不僅是技術的“硬核戰場”,更是商業創新的風口浪尖。誰能玩轉數據,誰就能掌控消費者心智,實現銷售爆發。 咱們不搞枯燥學術,而是用最“…

react 常見的閉包陷阱深入解析

一、引子 先來看一段代碼,你能說出這段代碼的問題在哪嗎? const [count, setCount] = useState(0); useEffect(() => {const timer = setTimeout(() => {setCount(count + 1);}, 1000);return () => clearTimeout(timer); }, []);正確答案: 這段代碼存在閉包陷阱…

零基礎在實踐中學習網絡安全-皮卡丘靶場(第十五期-URL重定向模塊)

本期內容和之前的CSRF,File inclusion有聯系,復習后可以更好了解 介紹 不安全的url跳轉 不安全的url跳轉問題可能發生在一切執行了url地址跳轉的地方。如果后端采用了前端傳進來的(可能是用戶傳參,或者之前預埋在前端頁面的url地址)參數作為了跳轉的目…

Python訓練營---DAY48

DAY 48 隨機函數與廣播機制 知識點回顧: 隨機張量的生成:torch.randn函數卷積和池化的計算公式(可以不掌握,會自動計算的)pytorch的廣播機制:加法和乘法的廣播機制 ps:numpy運算也有類似的廣播機…

什么是ANSYS ACT? ACT又可以分為哪幾類?

ANSYS作為目前仿真界主流軟件之一,除了給用戶提供其強大的功能之外,還給用戶提供了高度自定義定制的權限。所謂定制,也即用戶可以根據自己仿真需求修改現有功能并展示全新功能的產品內操作。定制的目標是改變現有的用戶體驗,以滿足…

電路圖識圖基礎知識-電動機正反轉控制電路詳解(二十)

1. 轉換開關手動正反轉控制電路 轉換開關(QS)又稱倒順開關,是一種手動控制裝置,可切換電動機的旋轉方向。它具有三個工作位置:正向、停止和反向。 工作原理: 閉合總電源開關 QS若需正向運轉,將…

Spring Boot微服務架構(十):Docker與K8S部署的區別

Spring Boot微服務在Docker與Kubernetes(K8S)中的部署存在顯著差異,主要體現在技術定位、管理能力、擴展性及適用場景等方面。以下是兩者的核心區別及實踐對比: 一、技術定位與核心功能 Docker 功能:專注于單節點容器化…

性能剖析:在 ABP 框架中集成 MiniProfiler 實現性能可視化診斷

🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 實現性能可視化診斷 📚 目錄 🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 實現性能可視化診斷一、為什么選擇 MiniProfiler? 🧐二、集成 MiniProf…

ESP32 在Arduino開發環境中,如果程序運行報錯如何定位程序報錯是哪行代碼

在開發中,我們常常會遇到編譯正常,但是運行過程中程序報錯,然后重啟,在這種情況下,又沒法知道是哪段程序引起的,現在我們就來解決這個問題。 其實ESP32的SDK中已經附帶這些debug的工具了。 首先如果我們程…

Python 包管理器 uv 介紹

Python 包管理器 uv 全面介紹 uv 是由 Astral(熱門工具 Ruff 的開發者)推出的下一代高性能 Python 包管理器和構建工具,用 Rust 編寫。它旨在解決傳統工具(如 pip、virtualenv、pip-tools)的性能瓶頸,同時…

win10啟動時小鍵盤燈默認不亮怎么辦

第一步,按winR,打開運行。 第二步,輸入regedit,打開注冊表。 第三步,在注冊表編輯器中,依次展開HKEY_ USERS --》.DEFAULT --》Control Panel --》Keyboard , 第四步,選中Keyboard 之后在右側窗…

C盤的“下載”修改位置時出錯了,怎么還原

本來想修改“下載”的位置,結果直接成D盤的快捷鍵了。 正常應該是D盤里面的一個文件夾,而不是D盤。 而且打開D盤,里面的文件夾,全部按照時間分區顯示了,而不是正常的文件顯示。 解決辦法: 1、還原下載路…

量化面試綠皮書:7. 100的階乘中有多少個尾隨零

文中內容僅限技術學習與代碼實踐參考,市場存在不確定性,技術分析需謹慎驗證,不構成任何投資建議。 7. 100的階乘中有多少個尾隨零 Q: 100 ! 100! 100!(100 的階乘)中有多少個尾隨零? A: 100 ! 100! 100…

Java 常用 API 分類總結(算法競賽考前速記篇)- 適用于算法競賽(如 CCF CSP、藍橋杯、NOI)

以下是Java 常用 API 的系統性總結,特別適用于算法競賽(如 CCF CSP、藍橋杯、NOI)場景。按照功能分類,并給出代表性方法及簡要用法說明,方便復習與帶入考場: ? Java 常用 API 分類總結(算法競賽…

重復文件管理 一鍵清理重復 圖片 文檔 免費 超輕量無廣告

各位電腦小衛士們!今天給你們介紹一款超厲害的軟件——ZZYDupFile,它是專門搞重復文件管理的輕量級工具,能幫咱快速找到并清理電腦里的重復文件。接下來我就詳細說說它的那些優點。 軟件下載地址安裝包 首先說說它的核心功能。它查重有好幾…

本地部署企業郵箱,讓企業辦公更安全高效

在當今數字化辦公時代,企業郵箱作為企業溝通協作的重要工具,承載著企業業務往來和辦公協同的重要職能。基于安全性、個性化需求、系統集成等方面的考量,越來越多的企業傾向于選擇本地部署企業郵箱,本地化部署不僅能夠有效守護企業…

基于深度強化學習的智能機器人導航系統

前言 隨著人工智能技術的飛速發展,機器人在日常生活和工業生產中的應用越來越廣泛。其中,機器人導航技術是實現機器人自主移動的關鍵。傳統的導航方法依賴于預設的地圖和路徑規劃算法,但在復雜的動態環境中,這些方法往往難以適應。…

gorm 配置數據庫

介紹 GORM 是 Go 語言中最流行的 ORM(對象關系映射)庫之一,基于數據庫操作的封裝,提供類似 Django ORM / SQLAlchemy 的開發體驗。 特性描述支持多種數據庫MySQL、PostgreSQL、SQLite、SQL Server、ClickHouse 等自動遷移自動根…

k8s4部署

configMap configmap概述:數據會存儲在etcd數據庫,其應用場景主要在應用程序的配置 configmap支持的類型(1)鍵值對(2)多行數據 pod使用configmap資源有兩種常見的方式(1)變量注入&a…

2025HNCTF - Crypto

Crypto lcgp 題目: from Crypto.Util.number import * import gmpy2 import random n getPrime(1024) flag bH&NCTF{ str(uuid.uuid4()).encode() b} flagbytes_to_long(flag) e 2024 cpow(e, flag, n)class LCG:def __init__(self, seed, a, b, m):sel…