為深入理解 RTOS 內核工作機制,筆者製作了名為 “FreeRTOS 內核簡單實現” 的項目專欄 ,目標為自己動手從 0 到 1 編程一個簡單的 RTOS 內核,從而實現任務並行工作的效果 ...
0、寫在前面
為深入理解 RTOS 內核工作機制,筆者製作了名為 “FreeRTOS 內核簡單實現” 的項目專欄 ,目標為自己動手從 0 到 1 編程一個簡單的 RTOS 內核,從而實現任務並行工作的效果,主要實現了以下功能
- 靜態創建任務
- 臨界段保護
- 支持任務多優先順序
- 任務阻塞延時
- 時間片輪詢
註意:本項目不是模擬,而是基於 STM32F407 開發板從 0 到 1 編程實現的 RTOS 簡單內核,最終會使用 GPIO 輸出作為各種效果的演示,支持 Keil 與 CLion 兩種開發環境,兩者項目流程幾乎一致,只是在彙編程式與工程配置上存在區別,不同之處會在教程中做明確說明
1、參考資料
- FreeRTOS內核實現_憶昔z的博客-CSDN博客
- GitHub - aeneag/FreeRTOS_kernel: 深入理解FreeRTOS內核,從零開始實現內核
- FreeRTOS內核實現與應用開發實戰指南
2、準備工作
2.1、STM32 空工程
參考 STM32CubeMX教程1 工程建立 文章創建一個 STM32F407VGT6 空工程
參考 STM32CubeMX教程2 GPIO輸出 - 點亮LED燈 文章初始化 4 個 LED 燈用於對本項目實現的 RTOS 內核驗證
註意:空工程中 NVIC 選擇 4 位搶占優先順序,並應將 SysTick 和 PendSV 中斷設置為最低優先順序
2.2、創建 RTOS 文件目錄
工程根目錄下創建一個 RTOS 目錄,目錄結構如下
- RTOS
- Inc
- FreeRTOS.h,用來包含 RTOS 所有的頭文件
- FreeRTOSConfig.h,用來配置裁剪 RTOS 的功能
- list.h,雙向鏈表數據結構頭文件
- portMacro.h,用來統一 RTOS 中用到的類型和定義一些功能巨集
- task.h,任務管理頭文件
- Src
- list.c,雙向鏈表數據結構源文件
- prot.c,用來定義與底層晶元架構有關的函數和中斷服務函數
- task.c,任務管理源文件
- Inc
如果使用 Keil 則需要將上面創建的文件添加到 Keil 工程中,併在設置中增加頭文件路徑,具體步驟如下圖所示
如果使用的 CLion 需要在 CMakeLists_template.txt 模板文件中添加 RTOS 目錄下的源文件目錄和頭文件目錄,具體如下所示
// 增加頭文件目錄
include_directories(${includes} RTOS/Inc)
// 增加源文件目錄
file(GLOB_RECURSE SOURCES ${sources} "RTOS/*.*")
FreeRTOS.h
#ifndef INC_FREERTOS_H
#define INC_FREERTOS_H
#include "FreeRTOSConfig.h"
#include "portMacro.h"
#include "list.h"
#include "task.h"
// 如果後續編程提示找不到 __DSB() 等彙編,可添加該 MCU 頭文件
#include "stm32f4xx_hal.h"
#endif //INC_FREERTOS_H
FreeRTOSConfig.h、list.h、portMacro.h 和 task.h
// XXX 替換為對應頭文件名稱
#ifndef XXX_H
#define XXX_H
#include "FreeRTOS.h"
#endif //XXX_H
list.c、prot.c 和 task.c
/*list.c*/
#include "list.h"
/*prot.c*/
#include "FreeRTOS.h"
/*task.c*/
#include "task.h"
按照上述列出的文件添加內容,添加完成後編譯整個工程應該不會有錯誤發生,之後將在各個文件中添加程式逐步實現 RTOS 簡單內核
3、約定
整個專欄文章做如下約定
- 代碼段開頭會添加該代碼段中函數 / 定義所處的文件位置,如下所示代碼段表示變數
xTickCount
應該在task.c
文件中定義
/* task.c */
// 滴答定時器計數值
static volatile TickType_t xTickCount = (TickType_t)0U;
- 請自行安排本專欄文章中各個代碼段在工程文件中的位置
4、專欄目錄
如下所示為 "FreeRTOS 簡單內核實現" 專欄所有文章鏈接
- FreeRTOS 簡單內核實現1 前言
- FreeRTOS 簡單內核實現2 雙向鏈表
- FreeRTOS 簡單內核實現3 任務管理
- FreeRTOS 簡單內核實現4 臨界段
- FreeRTOS 簡單內核實現5 阻塞延時
- FreeRTOS 簡單內核實現6 優先順序
- FreeRTOS 簡單內核實現7 阻塞鏈表
- FreeRTOS 簡單內核實現8 時間片輪詢
5、項目倉庫
項目 github 工程代碼鏈接如下 FreeRTOS 簡單內核實現,標 Star 防丟失!