日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 嵌入式微處理器
[導(dǎo)讀]學(xué)習(xí)梳理一下FreeRTOS任務(wù)管理單元實(shí)現(xiàn)思路,代碼分析基于V10.4.3。從本文開始計(jì)劃寫個(gè)圖解freeRTOS內(nèi)核系列筆記分享給朋友們,希望大家喜歡。文章中或有錯(cuò)誤,也請(qǐng)留言交流指正,或加本人微信進(jìn)行交流~

[導(dǎo)讀] 學(xué)習(xí)梳理一下FreeRTOS任務(wù)管理單元實(shí)現(xiàn)思路,代碼分析基于V10.4.3。從本文開始計(jì)劃寫個(gè)圖解freeRTOS內(nèi)核系列筆記分享給朋友們,希望大家喜歡。文章中或有錯(cuò)誤,也請(qǐng)留言交流指正,或加本人微信進(jìn)行交流~

本文主要學(xué)習(xí)梳理FreeRTOS任務(wù)管理器的基本原理,大體框架。

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

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

裸奔系統(tǒng)

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

  • 程序的主體是一個(gè)死循環(huán),該應(yīng)用程序由一系列協(xié)同工作的函數(shù)片段組成,相互實(shí)現(xiàn)邏輯配合,實(shí)現(xiàn)用戶業(yè)務(wù)需求。該應(yīng)用程序獨(dú)占單片機(jī),常規(guī)的單片機(jī)系統(tǒng)都僅有有一個(gè)計(jì)算單元核。
  • 普通外設(shè)I/O,這里所說I/O是指廣義的I/O,比如GPIO、PWM、ADC、DAC、LCD顯示(當(dāng)然這里并不嚴(yán)謹(jǐn),比如ADC,DAC、LCD等也可以產(chǎn)生中斷)等。中斷函數(shù)將異步事件接收成或報(bào)文或標(biāo)志或數(shù)值,在與主循環(huán)發(fā)生邏輯關(guān)聯(lián)。
  • 中斷外設(shè),比如UART、USB、I2C、定時(shí)器、DMA等根據(jù)應(yīng)用需求而使用的中斷。這些中斷都需要相應(yīng)的中斷函數(shù)進(jìn)行處理異步中斷事件。對(duì)于輸出可能采樣主動(dòng)輸出,一般由主循環(huán)某一個(gè)動(dòng)作執(zhí)行;對(duì)于輸入設(shè)備或許采用輪詢方式,在與主循環(huán)進(jìn)行耦合。

RTOS應(yīng)用系統(tǒng)

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

  • 常見的RTOS沒有設(shè)備驅(qū)動(dòng)模型,沒有對(duì)外設(shè)設(shè)備進(jìn)行抽象,中斷函數(shù)將會(huì)由用戶或調(diào)用RTOS 機(jī)制,比如event/signal等與任務(wù)進(jìn)行通信
  • 任務(wù)間還有可能需要通信,或傳遞消息,或完成某項(xiàng)需求相互間需要同步等
  • 同樣任務(wù)需要與硬件普通IO外設(shè)進(jìn)行打交道,或入或出。但有可能是這個(gè)任務(wù)實(shí)現(xiàn),也有可能是哪個(gè)任務(wù)執(zhí)行。完全取決于開發(fā)人員如何設(shè)計(jì)。
  • RTOS實(shí)現(xiàn)任務(wù)的切入切出,切入使某任務(wù)運(yùn)行;切出使某任務(wù)掛起,出讓CPU,暫停運(yùn)行。
  • RTOS充當(dāng)?shù)讓又С止δ?,RTOS還提供豐富的時(shí)間管理,隊(duì)列、郵箱等機(jī)制供應(yīng)用開發(fā)使用。
  • ......

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

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

FreeRTOS任務(wù)管理器需求

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

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

  • 任務(wù)抽象描述,一個(gè)任務(wù)一般本質(zhì)上是一個(gè)死循環(huán)程序片段(當(dāng)然也有任務(wù)運(yùn)行著會(huì)退出被殺掉的可能)。對(duì)于任務(wù)的抽象:
    • 一般會(huì)有任務(wù)的執(zhí)行主體,利用函數(shù)主體函數(shù)指針進(jìn)行抽象
    • RTOS常規(guī)都是的基于優(yōu)先級(jí)搶占調(diào)度算法,因此需要抽象出哪個(gè)任務(wù)具有更高概率能被執(zhí)行,用優(yōu)先級(jí)進(jìn)行描述
    • 任務(wù)需要得以切換,就需要將任務(wù)在切換間的臨時(shí)狀態(tài)進(jìn)行保存,棧機(jī)制就能很好的滿足這樣的需求,因此每個(gè)任務(wù)都有一個(gè)或大或小的任務(wù)棧。其本質(zhì)上是一片連續(xù)的FILO(先入后出)內(nèi)存。
    • .....
  • 任務(wù)創(chuàng)建、刪除等API接口,供應(yīng)用開發(fā)使用。
  • 任務(wù)調(diào)度器控制接口,啟動(dòng)調(diào)度器、停止調(diào)度器、掛起所有任務(wù)、恢復(fù)運(yùn)行等調(diào)度器接口。
  • 任務(wù)雜項(xiàng)信息接口,比如獲取任務(wù)狀態(tài)、tick信息、調(diào)試、獲取任務(wù)名等API接口
  • 任務(wù)調(diào)度算法,基于調(diào)度策略對(duì)運(yùn)行時(shí)的任務(wù)進(jìn)行調(diào)度,或掛起、或運(yùn)行、或就緒等,主要根據(jù)調(diào)度策略管理任務(wù)的切入切出。這里主要涉及到任務(wù)間上下文切換、任務(wù)與中斷函數(shù)間的上下文切換兩種場(chǎng)景。
  • 抽象C運(yùn)行時(shí)環(huán)境,現(xiàn)代RTOS應(yīng)用系統(tǒng)一般基于C語言,抽象C運(yùn)行時(shí)環(huán)境,這里主要指棧,當(dāng)然很多RTOS內(nèi)核也內(nèi)核堆,freeRTOS也不例外。熟悉C編程的朋友都知道,堆內(nèi)存由malloc/free函數(shù)操作集提供用戶接口,既然C堆已有,為何RTOS內(nèi)核重新造輪子?為啥內(nèi)核額外需要實(shí)現(xiàn)自己的堆管理器呢?這大體是基于下面些緣由:
    • 編譯器C堆實(shí)現(xiàn),在小型嵌入式系統(tǒng)上有時(shí)候并不能直接使用。
    • C堆的實(shí)現(xiàn)可能相對(duì)較大,占用了較大代碼空間。比較浪費(fèi)有限的代碼存儲(chǔ)空間。
    • C堆很少是線程安全的。
    • C堆申請(qǐng)執(zhí)行時(shí)間不是確定的, 執(zhí)行功能所需的時(shí)間因調(diào)用而異。
    • C堆會(huì)在單片機(jī)有限的內(nèi)存資源引發(fā)內(nèi)存碎片問題。
    • C堆會(huì)使鏈接器配置復(fù)雜化。
    • C堆如引發(fā)未知錯(cuò)誤,不便于調(diào)試。

FreeRTOS任務(wù)描述抽象

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

  • pxTopOfStack:指向任務(wù)棧棧頂指針
  • xStateListItem:任務(wù)狀態(tài)鏈表描述節(jié)點(diǎn),用于動(dòng)態(tài)將該任務(wù)添加、刪除到就緒或阻塞任務(wù)對(duì)列鏈表中
  • xEventListItem:事件鏈表描述節(jié)點(diǎn),描述本任務(wù)相關(guān)事件,用于將本任務(wù)添加到事件鏈表中。
  • uxPriority:任務(wù)優(yōu)先級(jí),用于描述本任務(wù)的優(yōu)先級(jí)。
  • pxStack:任務(wù)棧指針,指向本任務(wù)的任務(wù)棧。
  • pcTaskName:任務(wù)名字符串存儲(chǔ)區(qū),長(zhǎng)度可配。默認(rèn)為16字節(jié)

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

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

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

BaseType_t?xTaskCreate(?TaskFunction_t?pxTaskCode,
??????const?char?*?const?pcName,?????
??????const?configSTACK_DEPTH_TYPE?usStackDepth,
??????void?*?const?pvParameters,
??????UBaseType_t?uxPriority,
??????TaskHandle_t?*?const?pxCreatedTask?)
?PRIVILEGED_FUNCTION
;

TaskHandle_t?xTaskCreateStatic(?TaskFunction_t?pxTaskCode,
????????const?char?*?const?pcName,????
????????const?uint32_t?ulStackDepth,
????????void?*?const?pvParameters,
????????UBaseType_t?uxPriority,
????????StackType_t?*?const?puxStackBuffer,
????????StaticTask_t?*?const?pxTaskBuffer?)
?PRIVILEGED_FUNCTION
;

BaseType_t?xTaskCreateRestricted(?const?TaskParameters_t?*?const?pxTaskDefinition,
??????????TaskHandle_t?*?pxCreatedTask?)
?PRIVILEGED_FUNCTION
;

BaseType_t?xTaskCreateRestrictedStatic(?const?TaskParameters_t?*?const?pxTaskDefinition,
??????????TaskHandle_t?*?pxCreatedTask?)
?PRIVILEGED_FUNCTION
;
  • xTaskCreate/xTaskCreateStatic 都是用于創(chuàng)建任務(wù)而用,其區(qū)別在于:
    • xTaskCreate 申請(qǐng)任務(wù)控制塊以及棧從內(nèi)核堆申請(qǐng)
    • xTaskCreateStatic 創(chuàng)建的任務(wù),其任務(wù)控制塊內(nèi)存以及任務(wù)棧內(nèi)存由用戶傳入?;蛟S有朋友會(huì)問StaticTask_t這不是任務(wù)控制塊嘛,仔細(xì)看看其結(jié)構(gòu)定義其內(nèi)存對(duì)齊及大小剛好是前面說的任務(wù)控制塊的定義。
  • xTaskCreateRestricted() /xTaskCreateRestrictedStatic(),主要用于在有或使能MPU單元的芯片中創(chuàng)建任務(wù)。這里的MPU是指Memory Protection Unit (MPU),不是微處理器的意思。這兩者的區(qū)別與上面兩個(gè)API類似,主要在于其內(nèi)存分配方式不同,xTaskCreateRestricted是從內(nèi)核堆動(dòng)態(tài)申請(qǐng),xTaskCreateRestrictedStatic用戶傳入。
  • PRIVILEGED_FUNCTION 這個(gè)宏是用于存儲(chǔ)保護(hù)單元芯片的。

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

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

void?vTaskAllocateMPURegions(?TaskHandle_t?xTask,
????????const?MemoryRegion_t?*?const?pxRegions?)
?PRIVILEGED_FUNCTION
;
void?vTaskDelete(?TaskHandle_t?xTaskToDelete?)?PRIVILEGED_FUNCTION;
  • vTaskAllocateMPURegions: 定義一組內(nèi)存保護(hù)單元(MPU)區(qū)域,供MPU受限任務(wù)使用.
  • vTaskDelete: 刪除用使用xTaskCreate()或xTaskCreateStatic()創(chuàng)建的任務(wù)。

任務(wù)控制管理接口

void?vTaskDelay(?const?TickType_t?xTicksToDelay?)?PRIVILEGED_FUNCTION;
BaseType_t?xTaskDelayUntil(?TickType_t?*?const?pxPreviousWakeTime,
????????????????????????????const?TickType_t?xTimeIncrement?)
?PRIVILEGED_FUNCTION
;
BaseType_t?xTaskAbortDelay(?TaskHandle_t?xTask?)?PRIVILEGED_FUNCTION;
UBaseType_t?uxTaskPriorityGet(?const?TaskHandle_t?xTask?)?PRIVILEGED_FUNCTION;
UBaseType_t?uxTaskPriorityGetFromISR(?const?TaskHandle_t?xTask?)?PRIVILEGED_FUNCTION;
eTaskState?eTaskGetState(?TaskHandle_t?xTask?)?PRIVILEGED_FUNCTION;
void?vTaskGetInfo(?TaskHandle_t?xTask,
???????????????????TaskStatus_t?*?pxTaskStatus,
???????????????????BaseType_t?xGetFreeStackSpace,
???????????????????eTaskState?eState?)
?PRIVILEGED_FUNCTION
;
void?vTaskPrioritySet(?TaskHandle_t?xTask,
???????????????????????UBaseType_t?uxNewPriority?)
?PRIVILEGED_FUNCTION
;
void?vTaskSuspend(?TaskHandle_t?xTaskToSuspend?)?PRIVILEGED_FUNCTION;
void?vTaskResume(?TaskHandle_t?xTaskToResume?)?PRIVILEGED_FUNCTION;
BaseType_t?xTaskResumeFromISR(?TaskHandle_t?xTaskToResume?)?PRIVILEGED_FUNCTION;

這一系列的API接口操作集主要用于對(duì)任務(wù)進(jìn)行掛起延時(shí)、獲取優(yōu)先級(jí)、自中斷函數(shù)獲取優(yōu)先級(jí)、掛起、恢復(fù)運(yùn)行等操作?;緩钠浜瘮?shù)名就可以看出其作用。比如:

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

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

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

void?vTaskStartScheduler(?void?)?PRIVILEGED_FUNCTION;
void?vTaskEndScheduler(?void?)?PRIVILEGED_FUNCTION;
void?vTaskSuspendAll(?void?)?PRIVILEGED_FUNCTION;
BaseType_t?xTaskResumeAll(?void?)?PRIVILEGED_FUNCTION;

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

  • vTaskStartScheduler,主要用于待用戶任務(wù)創(chuàng)建好后,硬件初始化后,啟動(dòng)內(nèi)核調(diào)度器
  • vTaskEndScheduler,可用于停止內(nèi)核調(diào)度器,一般很少用到,在一些安全相關(guān)的應(yīng)用可能會(huì)在出故障時(shí)主動(dòng)停止調(diào)度器。
  • vTaskSuspendAll,掛起所有任務(wù),可以用用戶邏輯主動(dòng)掛起所有的任務(wù)
  • xTaskResumeAll,恢復(fù)所有任務(wù)為就緒態(tài)。

任務(wù)雜項(xiàng)API集

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

TickType_t?xTaskGetTickCountFromISR(?void?)?PRIVILEGED_FUNCTION;
UBaseType_t?uxTaskGetNumberOfTasks(?void?)?PRIVILEGED_FUNCTION;
char?*?pcTaskGetName(?TaskHandle_t?xTaskToQuery?)?PRIVILEGED_FUNCTION;?????
TaskHandle_t?xTaskGetHandle(?const?char?*?pcNameToQuery?)?PRIVILEGED_FUNCTION;???
UBaseType_t?uxTaskGetStackHighWaterMark(?TaskHandle_t?xTask?)?PRIVILEGED_FUNCTION;
configSTACK_DEPTH_TYPE?uxTaskGetStackHighWaterMark2(?TaskHandle_t?xTask?)?PRIVILEGED_FUNCTION;
void?vTaskSetApplicationTaskTag(?TaskHandle_t?xTask,
?????????TaskHookFunction_t?pxHookFunction?)?PRIVILEGED_FUNCTION;
TaskHookFunction_t?xTaskGetApplicationTaskTag(?TaskHandle_t?xTask?)?PRIVILEGED_FUNCTION;
TaskHookFunction_t?xTaskGetApplicationTaskTagFromISR(?TaskHandle_t?xTask?)?PRIVILEGED_FUNCTION;

void?vTaskSetThreadLocalStoragePointer(?TaskHandle_t?xTaskToSet,
??????????BaseType_t?xIndex,
??????????void?*?pvValue?)?PRIVILEGED_FUNCTION;
void?*?pvTaskGetThreadLocalStoragePointer(?TaskHandle_t?xTaskToQuery,

void?vApplicationStackOverflowHook(?TaskHandle_t?xTask,
???????????char?*?pcTaskName?);
void?vApplicationTickHook(?void?);?
......
BaseType_t?xTaskGenericNotifyStateClear(?TaskHandle_t?xTask,
?????????????????????????????????????????UBaseType_t?uxIndexToClear?)?PRIVILEGED_FUNCTION;

uint32_t?ulTaskGenericNotifyValueClear(?TaskHandle_t?xTask,
????????????????????????????????????????UBaseType_t?uxIndexToClear,
????????????????????????????????????????uint32_t?ulBitsToClear?)?PRIVILEGED_FUNCTION;
void?vTaskSetTimeOutState(?TimeOut_t?*?const?pxTimeOut?)?PRIVILEGED_FUNCTION;

BaseType_t?xTaskCheckForTimeOut(?TimeOut_t?*?const?pxTimeOut,
?????????????????????????????????TickType_t?*?const?pxTicksToWait?)?PRIVILEGED_FUNCTION;

BaseType_t?xTaskCatchUpTicks(?TickType_t?xTicksToCatchUp?)?PRIVILEGED_FUNCTION;

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

跨平臺(tái)移植接口

BaseType_t?xTaskIncrementTick(?void?)?PRIVILEGED_FUNCTION;
void?vTaskPlaceOnEventList(?List_t?*?const?pxEventList,
????????????????????????????const?TickType_t?xTicksToWait?)?PRIVILEGED_FUNCTION;
void?vTaskPlaceOnUnorderedEventList(?List_t?*?pxEventList,
?????????????????????????????????????const?TickType_t?xItemValue,
?????????????????????????????????????const?TickType_t?xTicksToWait?)?PRIVILEGED_FUNCTION;
void?vTaskPlaceOnEventListRestricted(?List_t?*?const?pxEventList,
??????????????????????????????????????TickType_t?xTicksToWait,
??????????????????????????????????????const?BaseType_t?xWaitIndefinitely?)?PRIVILEGED_FUNCTION;
BaseType_t?xTaskRemoveFromEventList(?const?List_t?*?const?pxEventList?)?PRIVILEGED_FUNCTION;
void?vTaskRemoveFromUnorderedEventList(?ListItem_t?*?pxEventListItem,
????????????????????????????????????????const?TickType_t?xItemValue?)?PRIVILEGED_FUNCTION;

portDONT_DISCARD?void?vTaskSwitchContext(?void?)?PRIVILEGED_FUNCTION;
TickType_t?uxTaskResetEventItemValue(?void?)?PRIVILEGED_FUNCTION;
TaskHandle_t?xTaskGetCurrentTaskHandle(?void?)?PRIVILEGED_FUNCTION;
void?vTaskMissedYield(?void?)?PRIVILEGED_FUNCTION;
BaseType_t?xTaskGetSchedulerState(?void?)?PRIVILEGED_FUNCTION;
BaseType_t?xTaskPriorityInherit(?TaskHandle_t?const?pxMutexHolder?)?PRIVILEGED_FUNCTION;
BaseType_t?xTaskPriorityDisinherit(?TaskHandle_t?const?pxMutexHolder?)?PRIVILEGED_FUNCTION;
void?vTaskPriorityDisinheritAfterTimeout(?TaskHandle_t?const?pxMutexHolder,
UBaseType_t?uxTaskGetTaskNumber(?TaskHandle_t?xTask?)?PRIVILEGED_FUNCTION;
void?vTaskSetTaskNumber(?TaskHandle_t?xTask,
?????????????????????????const?UBaseType_t?uxHandle?)?PRIVILEGED_FUNCTION;
void?vTaskStepTick(?const?TickType_t?xTicksToJump?)?PRIVILEGED_FUNCTION;


eSleepModeStatus?eTaskConfirmSleepModeStatus(?void?)?PRIVILEGED_FUNCTION;

TaskHandle_t?pvTaskIncrementMutexHeldCount(?void?)?PRIVILEGED_FUNCTION;

void?vTaskInternalSetTimeOutState(?TimeOut_t?*?const?pxTimeOut?)?PRIVILEGED_FUNCTION;

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

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

總結(jié)一下

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


END

來源:嵌入式客棧,作者:逸珺

版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。

推薦閱讀

成功為華為“續(xù)命:中國(guó)芯片之父張汝京

一個(gè)工程師的“噩夢(mèng)”:剛分清CPU和GPU,卻發(fā)現(xiàn)還有……

這位“華為天才少年”,竟然要我用“充電寶”打《只狼》


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉