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) 記憶體管理
各檔案關鍵部分的實現:
1、portmacro.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
2、port.c c檔案
1)堆疊初始化
2)啟動任務排程 3)
主動釋放mcu使用權
4)心跳時鐘處理函式
implementation of functions defined in portable.h for the arm cm3 port
3、heap_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 接受任務因為任務通知而進入阻塞狀態,但是傳送任務不會因為...