FreeRTOS 簡單內核實現1 前言

来源:https://www.cnblogs.com/lc-guo/p/18248756
-Advertisement-
Play Games

為深入理解 RTOS 內核工作機制,筆者製作了名為 “FreeRTOS 內核簡單實現” 的項目專欄 ,目標為自己動手從 0 到 1 編程一個簡單的 RTOS 內核,從而實現任務並行工作的效果 ...


0、寫在前面

為深入理解 RTOS 內核工作機制,筆者製作了名為 “FreeRTOS 內核簡單實現” 的項目專欄 ,目標為自己動手從 0 到 1 編程一個簡單的 RTOS 內核,從而實現任務並行工作的效果,主要實現了以下功能

  1. 靜態創建任務
  2. 臨界段保護
  3. 支持任務多優先順序
  4. 任務阻塞延時
  5. 時間片輪詢

註意:本項目不是模擬,而是基於 STM32F407 開發板從 0 到 1 編程實現的 RTOS 簡單內核,最終會使用 GPIO 輸出作為各種效果的演示,支持 Keil 與 CLion 兩種開發環境,兩者項目流程幾乎一致,只是在彙編程式與工程配置上存在區別,不同之處會在教程中做明確說明

1、參考資料

  1. FreeRTOS內核實現_憶昔z的博客-CSDN博客
  2. GitHub - aeneag/FreeRTOS_kernel: 深入理解FreeRTOS內核,從零開始實現內核
  3. FreeRTOS內核實現與應用開發實戰指南

2、準備工作

2.1、STM32 空工程

參考 STM32CubeMX教程1 工程建立 文章創建一個 STM32F407VGT6 空工程

參考 STM32CubeMX教程2 GPIO輸出 - 點亮LED燈 文章初始化 4 個 LED 燈用於對本項目實現的 RTOS 內核驗證

註意:空工程中 NVIC 選擇 4 位搶占優先順序,並應將 SysTick 和 PendSV 中斷設置為最低優先順序

2.2、創建 RTOS 文件目錄

工程根目錄下創建一個 RTOS 目錄,目錄結構如下

  1. RTOS
    1. Inc
      1. FreeRTOS.h,用來包含 RTOS 所有的頭文件
      2. FreeRTOSConfig.h,用來配置裁剪 RTOS 的功能
      3. list.h,雙向鏈表數據結構頭文件
      4. portMacro.h,用來統一 RTOS 中用到的類型和定義一些功能巨集
      5. task.h,任務管理頭文件
    2. Src
      1. list.c,雙向鏈表數據結構源文件
      2. prot.c,用來定義與底層晶元架構有關的函數和中斷服務函數
      3. task.c,任務管理源文件

如果使用 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、約定

整個專欄文章做如下約定

  1. 代碼段開頭會添加該代碼段中函數 / 定義所處的文件位置,如下所示代碼段表示變數 xTickCount 應該在 task.c 文件中定義
/* task.c */
// 滴答定時器計數值
static volatile TickType_t xTickCount = (TickType_t)0U;
  1. 請自行安排本專欄文章中各個代碼段在工程文件中的位置

4、專欄目錄

如下所示為 "FreeRTOS 簡單內核實現" 專欄所有文章鏈接

  1. FreeRTOS 簡單內核實現1 前言
  2. FreeRTOS 簡單內核實現2 雙向鏈表
  3. FreeRTOS 簡單內核實現3 任務管理
  4. FreeRTOS 簡單內核實現4 臨界段
  5. FreeRTOS 簡單內核實現5 阻塞延時
  6. FreeRTOS 簡單內核實現6 優先順序
  7. FreeRTOS 簡單內核實現7 阻塞鏈表
  8. FreeRTOS 簡單內核實現8 時間片輪詢

5、項目倉庫

項目 github 工程代碼鏈接如下 FreeRTOS 簡單內核實現,標 Star 防丟失!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • iPerf 是一個網路性能測試工具,用於測量最大 TCP 和 UDP 帶寬性能。它支持多種平臺,包括 Windows、Linux、macOS 等。以下是 iPerf 的基本使用方法: 安裝 iPerf 在 Linux 系統中,你可以使用包管理器來安裝 iPerf。在 Ubuntu 或 Debian ...
  • @目錄0、思考與回答0.1、思考一0.2、思考二0.3、思考三1、關中斷1.1、帶返回值1.2、不帶返回值2、開中斷3、臨界段4、應用 0、思考與回答 0.1、思考一 為什麼需要臨界段? 有時候我們需要部分代碼一旦這開始執行,則不允許任何中斷打斷,這段代碼稱為臨界段 0.2、思考二 如何實現臨界段? ...
  • 目錄為什麼要學習使用make工具?什麼是make工具?make工具的學習過程1. 安裝make:sudo apt install make;並學習使用make安裝make流程學習使用make指令make指令的相關特點make只會對修改過的或者可執行目標文件不存在的.c文件進行編譯使用make時,若不 ...
  • 0、思考與回答 0.1、思考一 對於 Cortex-M4 內核的 MCU 在發生異常/中斷時,哪些寄存器會自動入棧,哪些需要手動入棧? 會自動入棧的寄存器如下 R0 - R3:通用寄存器 R12:通用寄存器 LR (Link Register):鏈接寄存器,保存返回地址 PC (Program Co ...
  • 目錄Makefile手冊中"+=",":=","?="操作符的區別1."?="操作符2."+="操作符3.":="操作符 Makefile手冊中"+=",":=","?="操作符的區別 1."?="操作符 在GNUmake中,有一個變數在之前沒有被賦值的情況下才會對這個變數進行賦值的操作,被稱為條件 ...
  • 查找開發板原理圖,可知 可用的LED有4個, 引腳為EINT0/1/2/3, 對應的IO口則是GPH0_0/1/2/3, 寄存器有GPH0CON,GPH0DAT,GPH0PUD,GPH0DRV GPH0CON用來設置IO模式(地址為0xE0200C00), GPH0DAT是電平狀態(地址為0xE02 ...
  • 把開發板的開關撥到USBBOOT,通過USB線連接到開發板的OTG口,打開板上總電源,會提示驅動安裝失敗 我們需要下載驅動(win7-64-DNW-USB) https://github.com/joyjohn131/QT210/tree/main/1 打開dseo13b.exe,依次點擊 Next ...
  • FreeRTOS 的 list.c / list.h 文件中有 3 個數據結構、2 個初始化函數、2 個插入函數、1 個移除函數和一些巨集函數,鏈表是 FreeRTOS 中的重要數據結構 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...