RM新时代网站-首页

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

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

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

基于FreeRTOS的STM32F103系統(tǒng)—內(nèi)存管理及任務(wù)調(diào)度

冬至子 ? 來源:月月望歸鳥 ? 作者:K.Fire ? 2023-11-13 11:08 ? 次閱讀

雖然現(xiàn)在的單片機(jī)系統(tǒng),CPU的資源并不是那么緊缺了,也有豐富的內(nèi)存空間,但是我們還是要積極地實現(xiàn)內(nèi)存管理,這可以幫我們減少內(nèi)存資源的占用,優(yōu)化程序,提高效率。

而任務(wù)調(diào)度算法,則是幫助我們合理安排實時系統(tǒng)中各個任務(wù)的邏輯順序,保證各個任務(wù)按照某種規(guī)則協(xié)調(diào)有效地進(jìn)行。

1

內(nèi)存管理

  • 堆(heap):就是一塊空閑的內(nèi)存,需要提供管理函數(shù)
  • 棧(stack):函數(shù)調(diào)用時局部變量保存在棧中,當(dāng)前程序的環(huán)境也是保存在棧中

FreeRTOS 中內(nèi)存管理的接口函數(shù)為:pvPortMalloc 、 vPortFree ,對應(yīng)于 C 庫的 malloc 、 free。

源碼中提供了5種內(nèi)存管理的方法。

1.heap_1

它只實現(xiàn)了pvPortMalloc,沒有實現(xiàn)vPortFree。

它的實現(xiàn)過程就是,先定義一個大數(shù)組(堆)-A,當(dāng)用戶創(chuàng)建任務(wù)時B圖中的藍(lán)色區(qū)域被占用,創(chuàng)建更多任務(wù)時,如圖所示。

圖片

2.heap_2

Heap_2 使用 最佳匹配算法 (best fifit) 來分配內(nèi)存,它支持vPortFree釋放內(nèi)存

Heap_2 不會合并相鄰的空閑內(nèi)存,所以 Heap_2 會導(dǎo)致嚴(yán)重的 " 碎片化 " 問題。

但是,如果申請、分配內(nèi)存時大小總是相同的,這類場景下 Heap_2 沒有碎片化的問題。所以它適用于:頻繁地創(chuàng)建、刪除任務(wù),但是任務(wù)的棧大小都是相同的( 創(chuàng)建任務(wù)時,需要分配 TCB 和棧, TCB 總是一樣的) 。

圖片

3.heap_3

Heap_3 使用標(biāo)準(zhǔn) C 庫里的 malloc 、 free 函數(shù),所以堆大小由鏈接器的配置決定,配置項confifigTOTAL_HEAP_SIZE 不再起作用。

4.heap_4

Heap_4 使用首次適應(yīng)算法 (fifirst fifit) 來分配內(nèi)存。它還會把相鄰的空閑內(nèi)存合并為一個更大的空閑內(nèi)存, 這有助于較少內(nèi)存的碎片問題。

Heap_4 會把相鄰空閑內(nèi)存合并為一個大的空閑內(nèi)存,可以較少內(nèi)存的碎片化問題。適用于這種場景:頻繁地分配、釋放不同大小的內(nèi)存。

圖片

5.heap_5

Heap_5 分配內(nèi)存、釋放內(nèi)存的算法跟 Heap_4 是一樣的。相比于 Heap_4 , Heap_5 并不局限于管理一個大數(shù)組:它可以管理多塊、分隔開的內(nèi)存。

嵌入式系統(tǒng)中,內(nèi)存的地址可能并不連續(xù),這種場景下可以使用 Heap_5 ,但需要進(jìn)行初始化:確定這些內(nèi)存塊在哪、多大。

內(nèi)存分配失敗時的鉤子函數(shù):

在 FreeRTOSConfifig.h 中,把宏 confifigUSE_MALLOC_FAILED_HOOK 定義為1,可以開啟使用一個鉤子函數(shù)vApplicationMallocFailedHook,當(dāng)pvPortMalloc失敗后,可以在這個鉤子函數(shù)中做一些事情。

void * pvPortMalloc( size_t xWantedSize )vPortDefineHeapRegions 
{ 
...... 
#if ( configUSE_MALLOC_FAILED_HOOK == 1 ) 
{ 
    if( pvReturn == NULL ) 
    { 
        extern void vApplicationMallocFailedHook( void ); 
        vApplicationMallocFailedHook(); 
    } 
}
#endif 
return pvReturn; 
}

2

任務(wù)調(diào)度

所謂調(diào)度算法就是怎么確定哪個就緒態(tài)的任務(wù)可以切換為運行狀態(tài)。

通過配置文件 FreeRTOSConfifig.h 的兩個配置宏來配置調(diào)度算法:confifigUSE_PREEMPTION、confifigUSE_TIME_SLICING 。

  • confifigUSE_PREEMPTION:為1時,采用可搶占調(diào)度,高優(yōu)先級的任務(wù)搶先執(zhí)行;為0時,當(dāng)一個任務(wù)正在執(zhí)行時,就算一個更高優(yōu)先級的任務(wù)處于Ready狀態(tài)了也不能打斷該任務(wù)的執(zhí)行,除非這個任務(wù)自己停止。
  • confifigUSE_TIME_SLICING:為1時,開啟時間片調(diào)度,同優(yōu)先級的任務(wù)輪流執(zhí)行;為0時,
    當(dāng)前任務(wù)會一直執(zhí)行,直到主動放棄、或者被高優(yōu)先級任務(wù)搶占。

3

總結(jié)

關(guān)于內(nèi)存管理及任務(wù)調(diào)度寫這些,后面會進(jìn)行常用的任務(wù)--通訊方式堆棧、隊列等的介紹。

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

    關(guān)注

    12

    文章

    484

    瀏覽量

    62138
  • 狀態(tài)機(jī)
    +關(guān)注

    關(guān)注

    2

    文章

    492

    瀏覽量

    27528
  • STM32F103
    +關(guān)注

    關(guān)注

    33

    文章

    477

    瀏覽量

    63600
  • 內(nèi)存管理
    +關(guān)注

    關(guān)注

    0

    文章

    168

    瀏覽量

    14134
收藏 人收藏

    評論

    相關(guān)推薦

    轉(zhuǎn):第10章 FreeRTOS任務(wù)管理

    編程上來。搞清楚了這一點,那么FreeRTOS學(xué)習(xí)就算入門了。 本章教程配套的例子含Cortex-M3內(nèi)核的STM32F103和Cortex-M4內(nèi)核的STM32F407以及F429。
    發(fā)表于 08-23 09:54

    基于STM32F103的振動監(jiān)測系統(tǒng)設(shè)計

    基于STM32F103的振動監(jiān)測系統(tǒng)設(shè)計。
    發(fā)表于 11-09 17:49 ?43次下載

    STM32F103封裝方式與功能配置

    本文介紹STM32F103封裝方式和STM32F103管腳功能的配置。
    發(fā)表于 08-03 17:44 ?2.2w次閱讀
    <b class='flag-5'>STM32F103</b>封裝方式與功能配置

    stm32f103寫的菜單管理程序

    stm32f103寫的菜單管理程序,支持無限嵌套程序里有使用說明,12864采用串口驅(qū)動
    發(fā)表于 07-27 16:32 ?69次下載

    STM32F103的振動監(jiān)測系統(tǒng)設(shè)計

    STM32F103的振動監(jiān)測系統(tǒng)設(shè)計
    發(fā)表于 09-28 14:45 ?49次下載
    <b class='flag-5'>STM32F103</b>的振動監(jiān)測<b class='flag-5'>系統(tǒng)</b>設(shè)計

    STM32F103的汽車遠(yuǎn)程防盜系統(tǒng)設(shè)計

    STM32F103的汽車遠(yuǎn)程防盜系統(tǒng)設(shè)計
    發(fā)表于 09-28 15:12 ?17次下載
    <b class='flag-5'>STM32F103</b>的汽車遠(yuǎn)程防盜<b class='flag-5'>系統(tǒng)</b>設(shè)計

    STM32F103使用總結(jié)

    STM32F103使用總結(jié)
    發(fā)表于 10-24 10:22 ?152次下載

    stm32f103移植

    stm32f103移植
    發(fā)表于 10-27 09:03 ?43次下載
    <b class='flag-5'>stm32f103</b>移植

    STM32F103教程之STM32F103單片機(jī)的使用心得資料免費下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是STM32F103教程之STM32F103單片機(jī)的使用心得資料免費下載目前很火的設(shè)計STM32教程。
    發(fā)表于 09-26 08:00 ?254次下載

    STM32F103的系列Ucos程序合集免費下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是STM32F103的系列Ucos程序合集免費下載包含了任務(wù)調(diào)度、信號量和郵箱、消息隊列、信息量集合軟件定時器的程序。
    發(fā)表于 04-26 08:00 ?8次下載
    <b class='flag-5'>STM32F103</b>的系列Ucos程序合集免費下載

    STM32F103 CAN模板程序

    STM32F103 CAN模板程序
    發(fā)表于 11-09 11:08 ?80次下載
    <b class='flag-5'>STM32F103</b> CAN模板程序

    stm32f030和stm32f103功能差異

    stm32f030和stm32f103功能差異主要表現(xiàn)在哪?
    的頭像 發(fā)表于 07-22 09:35 ?2.2w次閱讀

    STM32F103 模擬IIC時序

    STM32F103 模擬IIC時序
    發(fā)表于 11-25 09:51 ?34次下載
    <b class='flag-5'>STM32F103</b>  模擬IIC時序

    GD32F103STM32F103的區(qū)別 2021.6.2

    GD32F103STM32F103區(qū)別介紹關(guān)鍵詞Key words:GD32F103STM32F103摘要Abstract:本文主要是GD32F
    發(fā)表于 12-08 11:06 ?83次下載
    GD32<b class='flag-5'>F103</b>與<b class='flag-5'>STM32F103</b>的區(qū)別 2021.6.2

    RT-Thread系統(tǒng)移植到STM32f103

    RT-Thread系統(tǒng)移植到STM32f103
    發(fā)表于 12-09 12:51 ?26次下載
    RT-Thread<b class='flag-5'>系統(tǒng)</b>移植到<b class='flag-5'>STM32f103</b>
    RM新时代网站-首页