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





