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

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

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

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

FreeRTOS任務調(diào)度器外部接口、以及大體作用,基本組成情況

Q4MP_gh_c472c21 ? 來源:嵌入式ARM ? 作者:逸珺 ? 2020-12-24 15:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

學習梳理一下FreeRTOS任務管理單元實現(xiàn)思路,代碼分析基于V10.4.3。從本文開始計劃寫個圖解freeRTOS內(nèi)核系列筆記分享給朋友們,希望大家喜歡。文章中或有錯誤,也請留言交流指正

本文主要學習梳理FreeRTOS任務管理器的基本原理,大體框架。

內(nèi)核任務管理器需求

先來對比一下裸奔系統(tǒng)與RTOS應用系統(tǒng)的編程模型,看看兩種編程的不同畫風。

裸奔系統(tǒng)

在不用RTOS的單片機應用開發(fā)時,編程模型大概是這樣的畫風:

db8ffb76-45b8-11eb-8b86-12bb97331649.png

程序的主體是一個死循環(huán),該應用程序由一系列協(xié)同工作的函數(shù)片段組成,相互實現(xiàn)邏輯配合,實現(xiàn)用戶業(yè)務需求。該應用程序獨占單片機,常規(guī)的單片機系統(tǒng)都僅有有一個計算單元核。

普通外設I/O,這里所說I/O是指廣義的I/O,比如GPIO、PWM、ADCDAC、LCD顯示(當然這里并不嚴謹,比如ADC,DAC、LCD等也可以產(chǎn)生中斷)等。中斷函數(shù)將異步事件接收成或報文或標志或數(shù)值,在與主循環(huán)發(fā)生邏輯關(guān)聯(lián)。

中斷外設,比如UART、USBI2C、定時器、DMA等根據(jù)應用需求而使用的中斷。這些中斷都需要相應的中斷函數(shù)進行處理異步中斷事件。對于輸出可能采樣主動輸出,一般由主循環(huán)某一個動作執(zhí)行;對于輸入設備或許采用輪詢方式,在與主循環(huán)進行耦合。

RTOS應用系統(tǒng)

在一個基于RTOS應用系統(tǒng)中,其編程模型大致是下面這樣一個畫風,有多個并行的任務在相對長的宏觀時間維度看起來,多個任務是并行運行的,但對于常規(guī)單片機而言(一般都是單核),任一時刻只有一個任務或中斷函數(shù)在獨占CPU核。

dbbe5854-45b8-11eb-8b86-12bb97331649.png

常見的RTOS沒有設備驅(qū)動模型,沒有對外設設備進行抽象,中斷函數(shù)將會由用戶或調(diào)用RTOS 機制,比如event/signal等與任務進行通信

任務間還有可能需要通信,或傳遞消息,或完成某項需求相互間需要同步等

同樣任務需要與硬件普通IO外設進行打交道,或入或出。但有可能是這個任務實現(xiàn),也有可能是哪個任務執(zhí)行。完全取決于開發(fā)人員如何設計。

RTOS實現(xiàn)任務的切入切出,切入使某任務運行;切出使某任務掛起,出讓CPU,暫停運行。

RTOS充當?shù)讓又С止δ?,RTOS還提供豐富的時間管理,隊列、郵箱等機制供應用開發(fā)使用。

......

對于單片機而言,一般只有一個核,所有RTOS為了方便理解,可以看成是最最主要的目就是通過軟件方法將硬件CPU核程序運行環(huán)境抽象為每一個應用任務虛擬出一個軟核。這樣從時間維度上看起來多任務是并行的,而事實上這種并行是偽并行。

dc1a7f8a-45b8-11eb-8b86-12bb97331649.png

上圖僅僅為理解RTOS作用方便,這種虛擬核本質(zhì)上并不存在,只是將硬件CPU核的運行時上下文(PC指針、狀態(tài)寄存器等寄存器組、任務運行時臨時變量等)通過快照保存切入切出而實現(xiàn)多任務的偽并行運行。

FreeRTOS任務管理器需求

從前文看出,任務管理要實現(xiàn)任務的切入、切出,則首先需要對任務進行抽象描述,以實現(xiàn)在CPU上能夠?qū)崿F(xiàn)切換。根據(jù)閱讀代碼以及文獻加上自己的理解,將內(nèi)核任務管理器的主要功能需求大致梳理成下面這樣一張用例圖Use case Diagram,僅僅為理解方便,或許并不嚴謹。

dc47f4d8-45b8-11eb-8b86-12bb97331649.png

從上圖,大致可以看出FreeRTOS任務調(diào)度器需要以下一些功能需求:

任務抽象描述,一個任務一般本質(zhì)上是一個死循環(huán)程序片段(當然也有任務運行著會退出被殺掉的可能)。對于任務的抽象:

一般會有任務的執(zhí)行主體,利用函數(shù)主體函數(shù)指針進行抽象

RTOS常規(guī)都是的基于優(yōu)先級搶占調(diào)度算法,因此需要抽象出哪個任務具有更高概率能被執(zhí)行,用優(yōu)先級進行描述

任務需要得以切換,就需要將任務在切換間的臨時狀態(tài)進行保存,棧機制就能很好的滿足這樣的需求,因此每個任務都有一個或大或小的任務棧。其本質(zhì)上是一片連續(xù)的FILO(先入后出)內(nèi)存。

.....

任務創(chuàng)建、刪除等API接口,供應用開發(fā)使用。

任務調(diào)度器控制接口,啟動調(diào)度器、停止調(diào)度器、掛起所有任務、恢復運行等調(diào)度器接口。

任務雜項信息接口,比如獲取任務狀態(tài)、tick信息、調(diào)試、獲取任務名等API接口

任務調(diào)度算法,基于調(diào)度策略對運行時的任務進行調(diào)度,或掛起、或運行、或就緒等,主要根據(jù)調(diào)度策略管理任務的切入切出。這里主要涉及到任務間上下文切換、任務與中斷函數(shù)間的上下文切換兩種場景。

抽象C運行時環(huán)境,現(xiàn)代RTOS應用系統(tǒng)一般基于C語言,抽象C運行時環(huán)境,這里主要指棧,當然很多RTOS內(nèi)核也內(nèi)核堆,freeRTOS也不例外。熟悉C編程的朋友都知道,堆內(nèi)存由malloc/free函數(shù)操作集提供用戶接口,既然C堆已有,為何RTOS內(nèi)核重新造輪子?為啥內(nèi)核額外需要實現(xiàn)自己的堆管理器呢?這大體是基于下面些緣由:

編譯器C堆實現(xiàn),在小型嵌入式系統(tǒng)上有時候并不能直接使用。

C堆的實現(xiàn)可能相對較大,占用了較大代碼空間。比較浪費有限的代碼存儲空間。

C堆很少是線程安全的。

C堆申請執(zhí)行時間不是確定的, 執(zhí)行功能所需的時間因調(diào)用而異。

C堆會在單片機有限的內(nèi)存資源引發(fā)內(nèi)存碎片問題。

C堆會使鏈接器配置復雜化。

C堆如引發(fā)未知錯誤,不便于調(diào)試。

FreeRTOS任務描述抽象

dcb19dca-45b8-11eb-8b86-12bb97331649.png

對于其中幾項必須的關(guān)鍵數(shù)據(jù)域描述一下其抽象作用:

pxTopOfStack:指向任務棧棧頂指針

xStateListItem:任務狀態(tài)鏈表描述節(jié)點,用于動態(tài)將該任務添加、刪除到就緒或阻塞任務對列鏈表中

xEventListItem:事件鏈表描述節(jié)點,描述本任務相關(guān)事件,用于將本任務添加到事件鏈表中。

uxPriority:任務優(yōu)先級,用于描述本任務的優(yōu)先級。

pxStack:任務棧指針,指向本任務的任務棧。

pcTaskName:任務名字符串存儲區(qū),長度可配。默認為16字節(jié)

其他的數(shù)據(jù)域,可裁剪實現(xiàn)一些更豐富的功能,比如主要用于防治優(yōu)先級反轉(zhuǎn)的優(yōu)先級繼承機制,trace追蹤功能等。限于篇幅,也主要梳理任務管理器的主要原理,就不展開了。

任務創(chuàng)建刪除管理

FreeRTOS為用戶提供一組函數(shù)集用于任務的創(chuàng)建、刪除等管理,先看任務的創(chuàng)建API:

xTaskCreate/xTaskCreateStatic 都是用于創(chuàng)建任務而用,其區(qū)別在于:

xTaskCreate 申請任務控制塊以及棧從內(nèi)核堆申請

xTaskCreateStatic 創(chuàng)建的任務,其任務控制塊內(nèi)存以及任務棧內(nèi)存由用戶傳入?;蛟S有朋友會問StaticTask_t這不是任務控制塊嘛,仔細看看其結(jié)構(gòu)定義其內(nèi)存對齊及大小剛好是前面說的任務控制塊的定義。

xTaskCreateRestricted() /xTaskCreateRestrictedStatic(),主要用于在有或使能MPU單元的芯片中創(chuàng)建任務。這里的MPU是指Memory Protection Unit (MPU),不是微處理器的意思。這兩者的區(qū)別與上面兩個API類似,主要在于其內(nèi)存分配方式不同,xTaskCreateRestricted是從內(nèi)核堆動態(tài)申請,xTaskCreateRestrictedStatic用戶傳入。

PRIVILEGED_FUNCTION 這個宏是用于存儲保護單元芯片的。

這幾個任務創(chuàng)建函數(shù)都是用于任務創(chuàng)建,任務一旦創(chuàng)建就會被插入任務就緒鏈表中,當調(diào)度器調(diào)度啟動后就按任務狀態(tài)機根據(jù)調(diào)度策略以及外部輸入事件進行調(diào)度接管。這里以xTaskCreate繪制一下其內(nèi)在干了些啥:

dcfc9af0-45b8-11eb-8b86-12bb97331649.png

再看看另外兩個函數(shù):

o4YBAF_kSxaAdRRhAAAqUyKbKfE918.jpg

vTaskAllocateMPURegions: 定義一組內(nèi)存保護單元(MPU)區(qū)域,供MPU受限任務使用.

vTaskDelete: 刪除用使用xTaskCreate()或xTaskCreateStatic()創(chuàng)建的任務。

任務控制管理接口

pIYBAF_kSzKANjjhAADQex0DNEM347.jpg

這一系列的API接口操作集主要用于對任務進行掛起延時、獲取優(yōu)先級、自中斷函數(shù)獲取優(yōu)先級、掛起、恢復運行等操作。基本從其函數(shù)名就可以看出其作用。比如:

vTaskDelay調(diào)用,會使調(diào)用該函數(shù)的任務進入阻塞狀態(tài)一段時間,時間為傳入的tick數(shù)。

這里需要注意的是有的函數(shù)在中斷函數(shù)體里面不可以調(diào)用,需要使用專用版本,具體可以看看手冊或注釋。

調(diào)度器控制接口

o4YBAF_kS0SAKlIGAAA2n1n171k428.jpg

這一組函數(shù)API集主要用于調(diào)度器的啟動、停止控制:

vTaskStartScheduler,主要用于待用戶任務創(chuàng)建好后,硬件初始化后,啟動內(nèi)核調(diào)度器

vTaskEndScheduler,可用于停止內(nèi)核調(diào)度器,一般很少用到,在一些安全相關(guān)的應用可能會在出故障時主動停止調(diào)度器。

vTaskSuspendAll,掛起所有任務,可以用用戶邏輯主動掛起所有的任務

xTaskResumeAll,恢復所有任務為就緒態(tài)。

任務雜項API集

我根據(jù)代碼及注釋及自己理解,將這些API歸類到雜項API集合:

pIYBAF_kS2eALpnfAADvoaBzhRg859.jpg

o4YBAF_kS22Abh_WAACTpsQ3fUU002.jpg

這些函數(shù)具體作用就不贅述,這里僅僅梳理分類,用到時候查手冊即可。

跨平臺移植接口

這些接口不同硬件平臺需要做具化的移植,做差異化的處理,但是對于FreeRTOS統(tǒng)一了內(nèi)部調(diào)用的接口。這樣的思路在應用開發(fā)時也可以考慮使用,對于公共部分可以抽象出統(tǒng)一的接口,這樣在不同平臺上可以很方便的進行移植。對于這些接口后面有機會學習整理分享。

對于用例圖中的其他部分,核心調(diào)度部分以及上下文切換,篇幅所限留在后面學習整理分享。

總結(jié)一下

本文基本學習梳理了一下對于FreeRTOS任務調(diào)度器外部接口、以及大體作用,基本組成情況,水平所限,文章中錯誤難免,歡迎交流指正。

責任編輯:xj

原文標題:圖解FreeRTOS 原理系列之任務管理器基本框架

文章出處:【微信公眾號:嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

    關(guān)注

    14

    文章

    499

    瀏覽量

    66934
  • 任務管理器
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    7942

原文標題:圖解FreeRTOS 原理系列之任務管理器基本框架

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

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

    FreeRTOS入門資料

    性和可靠性。 FreeRTOS是一個迷你的實時操作系統(tǒng)內(nèi)核。作為一個輕量級的操作系統(tǒng),功能包括:任務管理、時間管理、信號量、消息隊列、內(nèi)存管理、記錄功能、軟件定時、協(xié)程等,可基本滿足較小系統(tǒng)的需要
    發(fā)表于 01-23 06:38

    基于大模型的發(fā)射任務調(diào)度與過程保障分系統(tǒng)平臺的應用與未來發(fā)展

    ? ? 基于大模型的發(fā)射任務調(diào)度與過程保障分系統(tǒng)航天智能化升級核心方案 ? ?北京華盛恒輝大模型的發(fā)射任務調(diào)度與過程保障分系統(tǒng),是航天領(lǐng)域智能化升級的核心支撐。該系統(tǒng)憑借多源數(shù)據(jù)融合、
    的頭像 發(fā)表于 12-24 10:36 ?256次閱讀

    大模型驅(qū)動的發(fā)射任務智能調(diào)度分系統(tǒng)軟件平臺的應用與未來發(fā)展

    大模型驅(qū)動的發(fā)射任務智能調(diào)度分系統(tǒng)平臺 ? ?作為航天智能化轉(zhuǎn)型的關(guān)鍵支撐,該平臺融合多源數(shù)據(jù)、動態(tài)資源調(diào)度與大模型智能決策能力,顯著提升發(fā)射任務的效率、安全性與可靠性。以下從技術(shù)架構(gòu)
    的頭像 發(fā)表于 12-19 14:50 ?297次閱讀

    嵌入式基礎知識-系統(tǒng)調(diào)度

    何一個時間點只有一個任務處于運行狀態(tài)。 就緒態(tài):所有任務都要轉(zhuǎn)換為就緒態(tài)后才能轉(zhuǎn)換為運行態(tài),調(diào)度決定哪一個就緒的任務將是下一個執(zhí)行的
    發(fā)表于 12-16 08:15

    什么是嵌入式操作系統(tǒng)?

    、嵌入式操作系統(tǒng)的定義 嵌入式操作系統(tǒng)是專門為資源受限的嵌入式設備(比如 STM32 單片機、物聯(lián)網(wǎng)模塊、工業(yè)控制)設計的微型操作系統(tǒng),核心作用是:管理硬件資源、調(diào)度任務、提供標
    發(fā)表于 12-09 10:33

    FreeRTOS任務和協(xié)程的區(qū)別是什么

    1.堆棧 協(xié)程是沒有堆棧分配的,是所有創(chuàng)建的協(xié)程共同使用一個堆??臻g,這相比于任務來說,減少了RAM的使用空間。 2. 調(diào)度和優(yōu)先級 協(xié)程使用協(xié)同調(diào)度,但是可以包含在使用的搶占優(yōu)先級之中。 3. 宏
    發(fā)表于 12-08 08:18

    ucos與freertos哪個好?

    。 輕量級設計,支持廣泛的微控制和處理架構(gòu)。 uCOS的優(yōu)點包括: 提供了豐富的系統(tǒng)服務和功能,如文件系統(tǒng)、USB、GUI、CAN等外延支持。 擁有更全面的官方文檔和書籍,以及更廣泛的社區(qū)支持
    發(fā)表于 12-05 07:13

    FreeRTOS 空閑任務

    FreeRTOS 中很多人會注意到為什么有一個叫IDLE task的任務占用了CPU百分之九十多的使用權(quán),但是這個任務并沒有自己手動創(chuàng)建。原因就是這個空閑任務是系統(tǒng)自己創(chuàng)建的,每當系統(tǒng)
    發(fā)表于 12-04 07:35

    在多任務系統(tǒng)中,如何平衡任務調(diào)度以防止因高負載導致的再次進入低功耗模式的延遲?

    在多任務系統(tǒng)中,如何平衡任務調(diào)度以防止因高負載導致的再次進入低功耗模式的延遲?
    發(fā)表于 12-04 06:37

    FreeRTOS和uC/OS-II的功能特性

    FreeRTOS: 核心功能: 任務調(diào)度(固定優(yōu)先級搶占式 + 時間片輪詢)、隊列、信號量(二進制、計數(shù))、互斥鎖(帶優(yōu)先級繼承)、軟件定時、事件組(事件標志)、
    發(fā)表于 11-17 08:17

    freertos關(guān)閉任務調(diào)度的方法

    #include \"FreeRTOS.h\" #include \"task.h\" /* 關(guān)閉任務調(diào)度 */ void
    發(fā)表于 11-17 06:47

    FreeRTOS任務調(diào)度及優(yōu)先級問題

    大家好,最近本人在學習FreeRTOS ,之前有過一些裸機開發(fā)的經(jīng)驗,目前知道了FreeRTOS任務是基于時間片輪轉(zhuǎn)來調(diào)度,也就是知道了任務
    發(fā)表于 11-06 02:18

    揭秘LuatOS Task:多任務管理的“智能中樞”

    Task任務作為LuatOS的核心組成部分,通過智能化的任務管理機制,實現(xiàn)任務的創(chuàng)建、調(diào)度與協(xié)同運行,讓復雜應用得以高效并行處理,滿足實時場
    的頭像 發(fā)表于 08-28 13:48 ?635次閱讀
    揭秘LuatOS Task:多<b class='flag-5'>任務</b>管理的“智能中樞”

    FreeRTOS任務中發(fā)送事件隊列是有什么限制嗎?

    到了TMC的芯片,但是在到位上報的信息中少了卡死電機的上報。所以有的電機的到位中斷并沒有成功寫入任務。 一開始是每個電機都開啟了一個定時查詢,后續(xù)改成一個定時查六個電機并將定時
    發(fā)表于 06-11 07:57

    移植LWIP+FREERTOS時遇到的問題怎么解決?

    :將ST官網(wǎng)的LWIP1.4.1 的例子(關(guān)于LWIP的部分)移植到步驟1 的FreeRTOS 系統(tǒng)的工程里面,只是添加LWIP初始化的任務,并沒有調(diào)用任何接口情況下可以Ping 通
    發(fā)表于 03-11 06:48