RTT 是如何管理和構(gòu)建工程的?
掃描二維碼
隨時隨地手機看文章
前言
rtthread 是一個功能強大,組件豐富的物聯(lián)網(wǎng)操作系統(tǒng)。它相比于其他的 RTOS 的一個主要區(qū)別之一,也就是它不僅僅是一個實時內(nèi)核,還具備豐富的中間層組件。那對于 rtt 來講,它又是如何管理和構(gòu)建工程的呢?下面筆者將從一個工程的目錄結(jié)構(gòu)開始來進行闡述。
工程目錄結(jié)構(gòu)
下圖是一個STM32f4 基于 rtt 的一個工程目錄:
這個目錄所包含的文件夾的具體功能也能夠從其文件夾名得知,這里筆者簡單的說一下:
.vscode:這個 文件夾所包含的是當前 vscode 環(huán)境的一些設置,如果沒有這個文件夾,那么在閱讀代碼的時候,就會出現(xiàn)好多頭文件找不到的情況。
applications:這個文件夾是用戶應用程序所在的文件夾,main.c 就在這個文件夾下,如果用戶的應用程序不是很多的情況下,那么都可以將其放到這個文件夾下。
board:針對于 STM32 來講,在使用 rtt 的時候,采用的是 CubeMX 來配置單片機外設的功能,這個文件夾存放的就是經(jīng)過 CubeMX 配置之后的相關文件。
libraries:在配置單片機外設的時候,我們無外乎會使用到單片機的庫,針對于 STM32 來講,存在標準庫,也有 HAL 庫,這里使用的是 HAL 庫,所以這個文件夾下面存放的是 HAL 庫的相關文件。
packages:rtt 存在豐富的軟件包,這個文件夾存放的就是我們使用的軟件包的相關文件。
rt-thread:這個文件夾存放的就是 rtt 內(nèi)核以及組件的相關文件。
rtconfig.h:這個是極為關鍵的一個文件,rtt 進行內(nèi)核裁剪實際上也就是通過這個文件里的宏定義來關閉或者打開 rtt 所具備的功能。
rtconfig.h 文件配置
上述我們介紹了基于 rtt 的一個 STM32 的工程目錄,緊接著我們來看 rtconfig.h 文件,這個文件里存放的全是宏定義,換句話說就是通過在這個文件里增加或者刪減相關宏定義從而實現(xiàn) rtt 的相關功能。最為直觀的修改方法便是手動修改了,直接在 rtconfig.h 文件里敲代碼解決。另一種方法便是 rtt 引入的一種自動修改的機制,也就是引入的 Env 工具,Env 工具如何使用就不在這里闡述了,官方文檔有詳細地介紹。那如何通過 Env 工具來配置 rtconfig.h 文件呢,通過在 Env 里輸入 menuconfig 命令,會出現(xiàn)下圖所示的界面,通過圖形化的操作就可以實現(xiàn)相關的配置。
通過這個界面我們來選擇要使用的組件以及相關的軟件包,而上圖這個界面里的內(nèi)容又是和 kconfig 文件相對應的,也就是說我們可以通過 kconfig 文件來配置我們的 menuconfig 界面,然后通過 menuconfig 界面來配置及我們的 rtconfig.h 文件,舉一個簡單的例子說明這個問題,我們通過 CubeMX 配置了單片機的相關外設,那如果要在 rtt 中使用這個外設的相關功能,那么我們就需要在 rtconfig.h 中開啟相關的宏定義,但是這個時候 menuconfig 中還沒有關于這個外設的相關選項,那么就需要在 kconfig 文件里進行設置,假設我們要使用 GPIO 的功能,那么相關內(nèi)容如下所示:
menuconfig 界面所對應的內(nèi)容如下圖所示:
在 menuconfig 界面選擇了之后,我們再來看 rtconfig.h 里對應的宏定義。
上圖的左邊是 kconfig 文件,右邊是 rtconfig.h 文件,可以看到是一一對應的(RT_USING_PIN也是對應的,由于不在一個位置所以沒有截圖下來)。
上述闡述了一個 kconfig 文件與 rtconfig.h 文件以及 menuconfig 之間的對應關系,但是一個工程存在好多個 kconfig 文件,運行 menuconfig 的時候又是如何找到各個 kconfig 文件的呢?整個過程是這樣的,在當前工程的根目錄存在一個 kconfig 文件,所在位置和內(nèi)容如下圖所示:
上圖中紅色方框里的內(nèi)容就是其他 kconfig 文件的路徑,因此這個文件是所有配置的總?cè)肟?,通過它找到其他 kconfig 文件。
小結(jié)
上述簡單敘述了一個 rtconfig.h 文件的配置過程,總結(jié)一下也就是在工程的根目錄下使用 env 工具執(zhí)行 menuconfig 命令時會出現(xiàn) rtt 系統(tǒng)的配置界面,所有的配置選項都是通過讀取工程根目錄下的 kconfig 文件,然后通過此文件找到其他的 kconfig 文件,從而生成配置界面,然后通過選擇配置界面的相關選項,從而實現(xiàn)在 rtconfig.h 文件里增添或者減少宏定義的目的。
scons
引用 rtt 文檔中心的一句話來介紹 scons:
scons 是一套由 Python 語言編寫的開源構(gòu)建系統(tǒng),類似于 GNU Make,它采用不同于通常 Makefile 文件的方式,而是使用 SConstruct 和 SConscript 文件來替代。這些文件也是 Python 腳本,能夠使用標準的 Python 語法來編寫。所以在 SConstruct、SConscript 文件中可以調(diào)用 Python 標準庫進行各類復雜的處理,而不局限于 Makefile 設定的規(guī)則。
使用 makefile 時,我們可以通過命令行輸入 make 來編譯工程,在使用 scons 時,同樣的道理,我們也可以使用 scons 來編譯工程,如圖所示:
在 scons 的介紹里說,scons 通過 SConscript 和 SConstruct 文件來組織源碼結(jié)構(gòu),而通常來說一個項目中只有一個 SConstruct,但是會存在多個 SConscript,SConstruct 所在的位置如下圖所示:
可以看到 SConstruct 處在工程的根目錄下,上圖還標識了一個文件是 rtconfig.py ,這個文件的作用是為了使得 rtt 更好地支持多種編譯器,以及方便地調(diào)整編譯參數(shù)。
再來看 SConscript ,一般來講,每個存放著源代碼的子目錄下都會放置著一個 SConscript,如果想要將自己的一些源代碼加入到 Scons 編譯環(huán)境中,一般可以創(chuàng)建或修改已有的 SConscript,它可以控制源文件的加入,并且可以指定文件的 Group,如果是在 keil 或者 iar 中開發(fā),那么通過 SConscript 文件就可以自動地添加文件或者增加 Group 到 keil 工程中,下面以 keil 工程為例說明,首先看對應的 SConscript 文件。
在這里不去細致地分析每一個語句,文檔中心有詳細地敘述,以 keil 為例,SConscript 中箭頭所指向的 group 在 keil 中所體現(xiàn)的就是加入到 keil 中的工程,第一個 group 中定義的 group 名稱是 Applications,那么所對應的在 keil 工程中就有一個 Applications 的 group。第二個 group 中定義的 group 名稱是 Drivers,那么所對應的在 keil 中就有一個 Drivers 存在,如下圖所示:
其他 group 的添加原理也是類似的,同樣的,SConscript 還能夠控制將什么文件加到其對應的 group 中,在 SConscript 中, src 變量控制的就是文件的加入,以 Application 下的文件為例,如下圖所示:
可以看到這里的 src 所代表的意思就是將當前文件夾下的所有 .c 文件加入到 Application 中,這里也可以控制指定的文件加入到對應的 group 中。
這里需要注意的一點是我們通過編輯 SConscript 文件,來控制文件和 group 的加入,在 keil 中開發(fā)的話,我們會在 Env 中輸入 scons --target=mdk5
來創(chuàng)建我們的工程,這個時候,我們要添加的文件或者 group 就會自動地添加到工程中了,如果這個時候,手動的往 keil 中添加文件或者 group 時,那么在下次運行 scons --target=mdk5
時就會將之前手動添加到 keil 工程的文件或 group 刪除掉。另外,如果在 keil 中開發(fā)時,有一些 keil 本身的設置需要進行更改,那么為了避免重新生成工程時將修改的記錄覆蓋掉,這個時候就應該在 template 這個工程中進行設置,這樣進行更改后,即便重新生成工程了,但是關于 keil 的配置依舊保留著,工程所在位置如下圖所示:
同時,scons 還能夠生成 vs code 工程,運行 scons --target=vsc
就能夠更新 vs code 工程的相關配置,從而更新 vs code 的相關頭文件設置。
總結(jié)
上述就是關于 RTT 管理和構(gòu)建工程的相關內(nèi)容了,總結(jié)一下也就是涉及到 kconfig 文件的更改,從而能夠通過 menuconfig 圖形化的配置相關選項,最終能夠生成 rtconfig.h 中的相關宏定義。同時,RTT 采用 scons 來進行構(gòu)建工程,通過 SConscript 控制文件和 group 加入到工程中進行編譯。另一方面,上述內(nèi)容所涉及的語法雖然不是采用的 C 語言,但是在 rtt 中所涉及的語法中也比較容易,通過閱讀官方文檔中心的相關內(nèi)容也就能夠運用起來了,好了,這次的分享內(nèi)容就是這些啦~
如果覺得文章對您有幫助,歡迎點擊再看支持一下吶~
免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!