FreeRTOS 學習總結(一)

2021-07-25 03:30:07 字數 2496 閱讀 4173

freertos作為開源的輕量級實時性作業系統,

實現了基本的實時排程、

訊號量、

佇列和儲存

管理,而且免費!

freertos的實現主要由list.c、 queue.c、 croutine.c和tasks.c 4個檔案組成。

list.c 是乙個鍊錶的實現,

主要供給核心排程器使用;

queue.c 是乙個佇列的實現,

支援中斷環境和訊號量控制;

croutine.c 和task.c是兩種任務的組織實現。

對於croutine,

各任務共享同乙個堆疊,

使ram的需求進一步縮小,

但也正因如此,

他的使用受到相對嚴格的限制。

而task則是傳統的實現,

各任務使用各

自的堆疊,

支援完全的搶占式排程。

freertos的主要功能可以歸結為以下幾點:

1) 優先順序排程、

相同優先順序任務的輪轉排程,

同時可設成可剝奪核心或不可剝奪核心

2) 任務可選擇是否共享堆疊(co-routines & tasks),

並且沒有任務數限制

3) 訊息佇列,

二值訊號量,

計數訊號量,

遞迴互斥體

4) 時間管理

5) 記憶體管理 

各檔案關鍵部分的實現:

1portmacro.h巨集定義部分

1

定義編譯器相關的各種資料型別

#define portchar char

#define portfloat float

#define portdouble double

#define portlong long

#define portshort short

#define portstack_type unsigned portlong

#define portbase_type long

2

架構相關的定義

cortex-m3的堆疊增長方向為高位址向低位址增長

#define portstack_growth ( -1 )

每毫秒的心跳次數

#define porttick_rate_ms ( ( portticktype ) 1000 / configtick_rate_hz )

訪問sram的位元組對齊

#define portbyte_alignment 8

3

定義使用者主動引起核心排程的2個函式

強制上下文切換,

用在任務環境中呼叫

#define portyield() vportyieldfromisr()

強制上下文切換,

用在中斷處理環境中呼叫

#define portend_switching_isr( xswitchrequired ) if( xswitchrequired ) vportyieldfromisr()

4

定義臨界區的管理函式

中斷允許和關閉

#define portdisable_interrupts() vportsetinterruptmask()

#define portenable_interrupts() vportclearinterruptmask()

臨界區進入和退出

#define portenter_critical() vportentercritical()

#define portexit_critical() vportexitcritical()

用於在中斷環境的中斷允許和關閉

#define portset_interrupt_mask_from_isr() 0;vportsetinterruptmask()

#define portclear_interrupt_mask_from_isr(x) vportclearinterruptmask();(void)x

2port.c c檔案

1)堆疊初始化

2)啟動任務排程 3)

主動釋放mcu使用權 

4)心跳時鐘處理函式

implementation of functions defined in portable.h for the arm cm3 port

3heap_4. c檔案

heap_2.c

並不會把相鄰的空閒塊合併成乙個更大的記憶體塊,所以會產生記憶體碎片

——如果分配和釋放的總是相同大小的記憶體塊,則記憶體碎片就不會成為乙個問題 。

heap_4.c就是改進了這一點。理論上不會產生記憶體碎片。

FreeRtos學習總結

最近專案需要,花了幾天時間學習了freertos,因為之前有作業系統和底層的基礎,所以上手非常快。學習方法 建議先閱讀本人整理的文章 再結合freertos文件官方的全英文檔 mastering the freertos real time kernel a hands on tutorial gu...

FreeRTOS自學總結

freertos自學總結 1.任務函式一般不允許跳出迴圈,如果一定要跳出迴圈的話在跳出迴圈以後一定要呼叫函式vtaskdelete null 刪除此任務 也就是每乙個任務都要在乙個死迴圈中,如果退出死迴圈,就要刪掉這個任務 2.二值訊號量建立完之後需要釋放之後才會生效 建立之後,預設flag為0,只...

freertos 通知總結

注意 使用通知相比較 訊號量 佇列 不用建立省下了很多任務夫,省下空間 每乙個任務都有乙個32的訊號值,當建立的時候,這個值被初始化為0 1 configuse task notifications 設定為1 2 在控制塊上有這個成員變數 3 接受任務因為任務通知而進入阻塞狀態,但是傳送任務不會因為...