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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...