RT-Thread的概念和移植

一、操作系統的概念

????????操作系統(英語:Operating System,縮寫:OS)是一組主管并控制計算機操作、運用和運行硬件、軟件資源和提供公共服務來組織用戶交互的相互關聯的系統軟件程序。根據運行的環境,操作系統可以分為桌面操作系統,手機操作系統,服務器操作系統,嵌入式操作系統等。

二、操作系統的分類

????????操作系統(英語:Operating System,縮寫:OS)是一組主管并控制計算機操作、運用和運行硬件、軟件資源和提供公共服務來組織用戶交互的相互關聯的系統軟件程序。根據運行的環境,操作系統可以分為桌面操作系統,手機操作系統,服務器操作系統,嵌入式操作系統等。根據服務場景和技術特性,主要分為以下三類:

  1. 批處理操作系統
    指將用戶提交的多個作業(任務)按批次自動連續處理的系統。其核心是通過 “多道程序技術” 讓內存同時存放多個作業,CPU 在作業間切換以提高資源利用率,用戶無需干預作業執行,僅在完成后獲取結果。分為單道批處理(內存僅一道作業)和多道批處理(內存多道作業并行調度)。

  2. 分時操作系統
    采用 “時間片輪轉” 機制,將 CPU 時間分割為多個短時間片,多個用戶通過終端輪流占用 CPU,實現 “同時” 交互操作。用戶可實時輸入命令并獲取響應,具有多路性(多用戶共享)、交互性(實時反饋)、獨立性(用戶互不干擾)和及時性(短響應時間)的特征。

  3. 實時操作系統
    能在嚴格時間約束內響應外部事件并完成處理的系統,核心目標是 “時效性” 和 “可靠性”。根據時間約束嚴格程度,分為硬實時系統(必須在絕對時限內完成,如導彈制導)和軟實時系統(允許偶爾超時,如視頻播放)。

  1. 批處理操作系統:工廠流水線
    像食品加工廠的流水線 —— 工人把一堆原料(作業)放進生產線,機器自動按順序清洗、加工、包裝,全程無需人工干預,最后批量產出成品。優點是效率高,適合重復、無需修改的任務;缺點是一旦啟動,中途不能停下改配方(用戶無法交互)。

  2. 分時操作系統:咖啡廳服務員
    好比咖啡廳里的服務員,同時照顧多位客人(用戶):給 A 點單、給 B 送咖啡、幫 C 續水,每次只服務一個人一小會兒(時間片),但切換速度極快,客人感覺自己被 “專屬服務”。核心是 “隨叫隨到”(交互性),適合需要隨時調整需求的場景(如辦公、聊天)。

  3. 實時操作系統:急診室醫生
    類似醫院急診室 —— 病人(外部事件)來了必須立刻處理,且有嚴格時間限制:心臟驟停的病人需在 4 分鐘內除顫(硬實時),輕微外傷可稍等片刻(軟實時)。醫生(系統)的首要任務是 “不超時”,可靠性遠高于效率。

對比維度批處理操作系統分時操作系統實時操作系統
核心目標提高資源利用率、增加吞吐量支持多用戶實時交互滿足嚴格時間約束,保證可靠性
用戶交互無(提交后等待結果)強(實時輸入 / 反饋)有限(多為預設事件響應)
CPU 調度方式多道程序交替運行(無固定時間片)時間片輪轉(固定短時間片)優先級調度(緊急任務優先)
典型應用銀行對賬、大數據批量處理個人電腦、服務器終端自動駕駛、工業控制、醫療設備
時間約束無嚴格限制響應時間較短(如秒級)嚴格時限(如毫秒 / 微秒級)
資源利用率高(CPU / 內存持續占用)中等(切換任務有開銷)按需分配(優先保障關鍵任務)

三、為什么需要使用系統

????????當我們進入嵌入式這個領域的時候, 往往首先接觸的都是單片機編程, 單片機編程又首選 51 單片機 來入門。 這里面說的單片機編程通常都是指裸機編程,即不加入任何 RTOSReal Time Operation System 實時操作系統) 的程序。 常用的 RTOS 有國外的 FreeRTOSμC/OS RTX 和國內的 RT-Thread、 Huawei LiteOS AliOS-Things 等, 其中尤以國外開源且免費的 FreeRTOS 的市場占有率 最高。

????????在裸機系統中,所有的程序基本都是自己寫的, 所有的操作都是在一個無限的大循環里面實現。現實 生活中的很多中小型的電子產品用的都是裸機系統, 而且也能夠滿足需求。但是為什么還要學習 RTOS 編程,偏偏還要整個操作系統進來。一是項目需要,隨著產品要實現的功能越來越多,單純的 裸機系統已經不能夠完美地解決問題,反而會使編程變得更加復雜,如果想降低編程的難度, 我們可以考慮引入 RTOS 實現多線程管理, 這是使用RTOS 的最大優勢。二是學習的需要,必須學習更高級 的東西,實現更好的職業規劃,為將來走向人生巔峰迎娶白富美做準備!

四、移植RT_thread操作系統

1.源碼的獲取步驟

訪問 RT-Thread 官方網站

打開瀏覽器,在地址欄輸入 RT-Thread 官方網站的網址:https://www.rt-thread.org/?,然后按下回車鍵進入官網首頁。

進入下載頁面

?在官網頁面,點擊資源,在最下面找到下載。進入下載界面后點擊源代碼。

選擇合適的版本

在下載頁面,會展示不同版本的 RT-Thread 源碼。可能會有穩定版、開發版等,根據自己的需求進行選擇。比如,如果是用于生產項目,建議選擇穩定版;如果是進行新功能測試或開發,可以選擇開發版 。

下載源碼

  • 通過 Git 獲取(適合熟悉 Git 工具的開發者)
    在下載頁面找到 Git 倉庫地址(例如,RT-Thread 的 Gitee 倉庫地址為https://gitee.com/rtthread/rt-thread?,GitHub 倉庫地址為https://github.com/RT-Thread/rt-thread?)。
    打開命令行工具(在 Windows 系統中可以使用 Git Bash,在 Linux 或 macOS 系統中使用自帶的終端),使用git clone命令克隆倉庫。例如,要克隆 Gitee 上的倉庫,可以在命令行輸入git clone https://gitee.com/rtthread/rt-thread.git,然后回車,等待源碼下載到本地指定目錄。
  • 通過壓縮包下載
    在下載頁面中,一般會提供源碼壓縮包下載選項(常見格式有.zip?或.tar.gz)。點擊對應的下載鏈接,瀏覽器會開始下載壓縮包文件。下載完成后,在下載目錄找到壓縮包,使用解壓工具(如 Windows 系統的 WinRAR、7-Zip,Linux 系統的tar命令等)解壓到指定目錄。

2. 文件介紹

? ? ? ? 獲取到的源碼解壓后如下:

文件夾

  • bsp(Board Support Package,板級支持包)
    • 作用:包含針對不同硬件開發板的配置文件和驅動程序。它負責初始化硬件設備,如時鐘、GPIO、串口、SPI 等,使得 RT - Thread 操作系統能夠在特定的硬件平臺上運行。
    • 舉例:在 STM32 開發板上,bsp 文件夾下會有 STM32 芯片初始化代碼、時鐘配置代碼,以及各個外設的驅動代碼。開發者可以根據自己使用的具體開發板型號,在該文件夾中找到對應的配置,也可以對其進行修改和擴展以適配自己的硬件設計。
  • components(組件)
    • 作用:存放 RT - Thread 豐富的軟件組件,這些組件為系統增加了各種功能,如文件系統(FinSH 命令行、FatFS 等)、網絡協議棧(LwIP 等)、圖形界面(LittlevGL 等) 。
    • 舉例:當需要在 RT - Thread 系統中實現文件管理功能時,就可以使用 components 文件夾中的 FatFS 文件系統組件;如果要開發具有網絡通信功能的設備,就可以使用 LwIP 網絡協議棧組件。
  • include(頭文件)
    • 作用:包含 RT - Thread 操作系統及各個組件的頭文件。這些頭文件定義了各種數據結構、函數原型、宏定義等,方便開發者在自己的應用程序中引用,以調用 RT - Thread 提供的功能。
    • 舉例:在編寫 RT - Thread 應用程序時,要使用線程相關的函數,就需要包含?rtthread.h?頭文件,該頭文件位于 include 文件夾下,它定義了線程控制塊、線程創建函數等相關的內容。
  • libcpu(CPU 相關庫)
    • 作用:主要存放與 CPU 架構相關的代碼,如中斷處理、任務切換、CPU 寄存器操作等底層代碼。它實現了 RT - Thread 操作系統在不同 CPU 架構上的移植接口。
    • 舉例:對于 ARM Cortex - M 系列 CPU,libcpu 文件夾下會有針對該系列 CPU 的中斷向量表定義、任務切換匯編代碼等,使得 RT - Thread 能夠在 ARM Cortex - M 芯片上高效運行。
  • src(操作系統核心源碼)
    • 作用:存放 RT - Thread 操作系統的核心源代碼,包括線程管理、內存管理、信號量、消息隊列、事件集等內核對象的實現代碼。
    • 舉例:線程管理的實現代碼負責線程的創建、刪除、掛起、恢復等操作;內存管理代碼實現了 RT - Thread 系統的內存分配和釋放機制,如靜態內存池和動態內存堆的管理。

文件

  • AUTHORS
    • 作用:記錄參與 RT - Thread 開發的作者信息,包括姓名、郵箱等。
    • 舉例:當開發者想要了解 RT - Thread 的開發團隊,或者在使用過程中遇到問題需要聯系特定作者時,可以查看該文件獲取相關信息。
  • COPYING
    • 作用:主要包含 RT - Thread 的版權聲明和許可協議,明確了該開源軟件的使用、分發、修改等相關法律條款。
    • 舉例:開發者在基于 RT - Thread 進行商業開發或者開源項目分發時,需要遵循 COPYING 文件中規定的許可協議,以確保合法合規。
  • License
    • 作用:和 COPYING 文件類似,進一步明確 RT - Thread 的開源許可證信息,如開源協議類型(通常是 Apache 2.0 等)。
    • 舉例:通過查看 License 文件,開發者可以清楚地知道自己在使用 RT - Thread 時的權利和義務,避免因版權問題產生糾紛。
  • README
    • 作用:是對 RT - Thread 源碼的簡要說明文檔,通常會介紹 RT - Thread 的基本特性、目錄結構、編譯方法、使用說明等重要信息。
    • 舉例:對于初次接觸 RT - Thread 的開發者,通過閱讀 README 文件,可以快速了解 RT - Thread 的基本情況,以及如何開始搭建開發環境和進行代碼編譯。
  • rt - thread.rttthread.pdsc
    • 作用:這是 RT - Thread 的軟件包描述文件,用于描述 RT - Thread 軟件包的屬性,如名稱、版本、依賴關系等信息,在使用 RT - Thread Studio 等開發工具進行軟件包管理時會用到。
    • 舉例:當使用 RT - Thread Studio 創建項目并添加 RT - Thread 軟件包時,工具會讀取該文件來獲取軟件包的相關信息,以便正確地配置和管理項目中的軟件包。

3. 移植

? ? ? ? 將下載的源碼文件夾復制到項目中。

? ? ? ? 將源碼文件夾的bsp文件夾中的下面兩個文件復制到工程文件夾的user下:

? ? ? ? 點擊keil,打開工程:

? ? ? ? 按照下面的步驟添加文件:

? ? ? ? 全選src的所有文件并添加:(當第4步Add點擊之后,左邊5會出現)

? ? ? ? ?然后再向rtt_port添加,右邊的路徑在源碼下的libcpu下的arm下的cortex-m3,文件類型選擇全部,并添加以下兩個文件:

? ? ? ? 點擊ok之后,工程之中新出現兩個分組:

? ? ? ? ?將rt_thread的只讀屬性去掉(把下圖中的只讀選項去掉)

? ? ? ?添加board:

? ? ? ? ? ? ? ?右鍵USER添加并選擇上面步驟復制的board.c并去掉只讀屬性。

????????添加頭文件:

? ? ? ? ?選擇finish:

? ? ? ? ?選擇include:

? ? ? ? ?選擇libc庫:

? ? ? ? 點擊ok:

? ? ? ? ?點擊編譯,左側文件出現加號說明添加成功,下一步就是修改出現的報錯:

? ? ? ? 以下是錯誤的修改步驟:

錯誤一:

..\USER\rtconfig.h(6): error:  #5: cannot open source input file "RTE_Components.h": No such file or directory#include "RTE_Components.h"
..\rt_thread\src\clock.c: 0 warnings, 1 error

????????解決方案:注釋掉此頭文件


錯誤二:重定義

.\Objects\STM32F103ZET6.axf: Error: L6200E: Symbol HardFault_Handler multiply defined (by context_rvds.o and stm32f10x_it.o).
.\Objects\STM32F103ZET6.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by context_rvds.o and stm32f10x_it.o).
.\Objects\STM32F103ZET6.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by board.o and stm32f10x_it.o).

? ? ? ? 由于RTOS操作系統內部自帶定時器,所以可以把裸機中使用的定時器函數注釋掉:

? ? ? ? 至此為止,編譯通過。

? ? ? ? 將rtconfig.h中的RT_THREAD_PRIORITY_MAX值從8改為32:

? ? ? ? ? 將RT_TICK_PER_SECOND從100改為1000:

? ? ? ? 將RT_MAIN_THREAD_STACK_SIZE從256改為512:

? ? ? ? 取消注釋RT_USING_HEAP:

? ? ? ? ?將board.c中的下面這部分的代碼注釋掉:

? ? ? ? ?同時也注釋掉下面這部分:

? ? ? ? ?自定義的驅動程序初始化都在這里:

????????并在當前board.c文件添加這些包含這些驅動函數的頭文件board.h,具體間自己的目錄結構,以下為我的:

? ? ? ? ?再次編譯,沒有錯誤了。

4. 驗證工程的可用性

使用rt_thread_create和rt_thread_startup創建線程,線程的執行函數自定義,下面只是示例代碼:

main.c:

#include "stm32f10x.h"#include "board.h"
#include "rtthread.h"
#include "string.h"uint8_t key_key0_state = KEY_DOWN;
uint8_t key_key1_state = KEY_DOWN;
uint8_t key_wkup_state = KEY_DOWN;void led1_thread(void *parg);
rt_thread_t led1_ret;int main(void) {led1_ret=rt_thread_create("led1",led1_thread,RT_NULL,512,7,20);if(led1_ret!=RT_NULL){rt_thread_startup(led1_ret);}while(1){}//return 0;
}void led1_thread(void *parg)
{while(1){LED1ON();rt_thread_delay(1000);rt_kprintf("LED1ON\r\n");LED1OFF();     rt_thread_delay(1000);   /* 延時500個tick */		 		rt_kprintf("LED1OFF\r\n");}
}

? ? ? ? 然后將編譯好的代碼燒寫進單片機中,然后就會發現led燈交替亮滅。至此為止,我們就辛辛苦苦用RTOS點亮了一盞燈!!!

? ? ? ? 雖然感覺有點虧吧,但是這僅僅是剛剛開始,隨著我們的項目越來越豐富,RTOS的作用也就越來越大。

0voice · GitHub

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89664.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89664.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89664.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于單片機傾角測量儀/角度測量/水平儀

傳送門 👉👉👉👉其他作品題目速選一覽表 👉👉👉👉其他作品題目功能速覽 概述 本設計實現了一種基于單片機的高精度數字傾角測量儀。系統核心由傾角傳感器(ADXL345傾…

深度學習 -- 初步認識Torch

深度學習 – 初步認識Torch 文章目錄深度學習 -- 初步認識Torch一,認識人工智能1.1 人工智能的本質1.2 人工智能的實現過程二,認識Torch2.1簡介2.2 概述2.3 Tensor的創建2.3.1 torch.tensor2.3.2 torch.Tensor三,創建線性和隨機張量3.1創建線…

BGP的“聰明選路”遇上了TCP的“路徑潔癖”,需人工調和

在路由器R1上有兩條外網,WAN1和WAN2。R1上做了域名分流功能,全局網址分到WAN1,指定域名分到WAN2(優先級更高)。癥狀是用戶反饋部分網頁無法打開。于是各種檢查嘗試...... 2天過去了......最終結論是:即使S…

ACWing算法筆記 | 二分

🔍 C 二分查找雙模板詳解:左閉右開 vs 左閉右閉(二分筆記)二分查找(Binary Search)是一類高效的搜索算法,在 O(log n) 的時間復雜度下查找答案,適用于單調性問題。C STL 的 lower_bo…

centos 新加磁盤分區動態擴容

你不能直接將一個分區分配給/dev/mapper/centos-root,因為這是一個邏輯卷(屬于 LVM 系統)。不過,你可以通過以下步驟將/dev/sda3添加到現有卷組或創建新的邏輯卷: 確認磁盤和分區信息 首先檢查分區是否已格式化以及是否…

python學智能算法(二十六)|SVM-拉格朗日函數構造

【1】引言 前序學習進程中,已經了解了拉格朗日乘數法求極值的基本原理,也了解了尋找最佳超平面就是尋找最佳分隔距離。 這篇文章的學習目標是:使用拉格朗日乘數法獲取最佳的分隔距離。 【2】構造拉格朗日函數 目標函數 首先是目標函數f&a…

智能制造——48頁畢馬威:汽車營銷與研發數字化研究【附全文閱讀】

涵蓋了汽車行業數字化轉型、汽車營銷業務能力建設(以會員管理為例)以及汽車研發與創新能力建設等議題。畢馬威認為,軟件定義汽車已成為汽車行業中的核心議題,并圍繞此議題提供了相關方案。在市場觀點方面,畢馬威與多家…

嵌入式學習-PyTorch(8)-day24

torch.optim 優化器torch.optim 是 PyTorch 中用于優化神經網絡參數的模塊,里面實現了一系列常用的優化算法,比如 SGD、Adam、RMSprop 等,主要負責根據梯度更新模型的參數。🏗? 核心組成1. 常用優化器優化器作用典型參數torch.op…

PostgreSQL實戰:高效SQL技巧

PostgreSQL PG 在不同領域可能有不同的含義,以下是幾種常見的解釋: PostgreSQL PostgreSQL(簡稱 PG)是一種開源的關系型數據庫管理系統(RDBMS),支持 SQL 標準并提供了豐富的擴展功能。它廣泛應用于企業級應用、Web 服務和數據分析等領域。 PostgreSQL 的詳細介紹 Po…

3-大語言模型—理論基礎:生成式預訓練語言模型GPT(代碼“活起來”)

目錄 1、GPT的模型結構如圖所示 2、介紹GPT自監督預訓練、有監督下游任務微調及預訓練語言模型 2.1、GPT 自監督預訓練 2.1.1、 輸入編碼:詞向量與位置向量的融合 2.1.1.1、 輸入序列與詞表映射 2.1.1.2、 詞向量矩陣與查表操作 3. 位置向量矩陣 4. 詞向量與…

【Redis 】看門狗:分布式鎖的自動續期

在分布式系統的開發中,保證數據的一致性和避免并發沖突是至關重要的任務。Redis 作為一種廣泛使用的內存數據庫,提供了實現分布式鎖的有效手段。然而,傳統的 Redis 分布式鎖在設置了過期時間后,如果任務執行時間超過了鎖的有效期&…

MYSQL--快照讀和當前讀及并發 UPDATE 的鎖阻塞

快照讀和當前讀在 MySQL 中,數據讀取方式主要分為 快照讀 和 當前讀,二者的核心區別在于是否依賴 MVCC(多版本并發控制)的歷史版本、是否加鎖,以及讀取的數據版本是否為最新。以下是詳細說明:一、快照讀&am…

css樣式中的選擇器和盒子模型

目錄 一、行內樣式二、內部樣式三、外部樣式四、結合選擇器五、屬性選擇器六、包含選擇器七、子選擇器八、兄弟選擇器九、選擇器組合十、偽元素選擇器十一、偽類選擇器十二、盒子模型 相關文章 學習標簽、屬性、選擇器和外部加樣式積累CSS樣式屬性:padding、marg…

關于基于lvgl庫做的注冊登錄功能的代碼步驟:

以下是完整的文件拆分和代碼存放說明,按功能模塊化劃分,方便工程管理:一、需要創建的文件清單 文件名 作用 類型 main.c 程序入口,初始化硬件和LVGL 源文件 ui.h 聲明界面相關函數 頭文件 ui.c 實現登錄、注冊、主頁面的UI 源文…

RAII機制以及在ROS的NodeHandler中的實現

好的,這是一個非常核心且優秀的設計問題。我們來分兩步詳細解析:先徹底搞懂什么是 RAII,然后再看 ros::NodeHandle 是如何巧妙地運用這一機制的。1. 什么是 RAII 機制? RAII 是 “Resource Acquisition Is Initialization” 的縮寫…

Linux LVS集群技術

LVS集群概述1、集群概念1.1、介紹集群是指多臺服務器集中在一起,實現同一業務,可以視為一臺計算機。多臺服務器組成的一組計算機,作為一個整體存在,向用戶提供一組網絡資源,這些單個的服務器就是集群的節點。特點&…

spring-ai-alibaba如何上傳文件并解析

問題引出 在我們日常使用大模型時,有一類典型的應用場景,就是將文件發送給大模型,然后由大模型進行解析,提煉總結等,這一類功能在官方app中較為常見,但是在很多模型的api中都不支持,那如何使用…

「雙容器嵌套布局法」:打造清晰層級的網頁架構設計

一、命名與核心概念 “雙容器嵌套布局法”,核心是通過兩層容器嵌套構建網頁結構:外層容器負責控制布局的“宏觀約束”(如頁面最大寬度、背景色等),內層容器聚焦“微觀排版”(內容居中、內邊距調整、紅色內容…

基于深度學習的自然語言處理:構建情感分析模型

前言 自然語言處理(NLP)是人工智能領域中一個非常活躍的研究方向,它致力于使計算機能夠理解和生成人類語言。情感分析(Sentiment Analysis)是NLP中的一個重要應用,其目標是從文本中識別和提取情感傾向&…

JWT原理及利用手法

JWT 原理 JSON Web Token (JWT) 是一種開放的行業標準,用于在系統之間以 JSON 對象的形式安全地傳輸信息。這些信息經過數字簽名,因此可以被驗證和信任。其常用于身份驗證、會話管理和訪問控制機制中傳遞用戶信息。 與傳統的會話令牌相比,JWT…