在使用RT-Thread時(shí),必不可少需要接觸到RTT的軟件包。什么是軟件包,引用RTT軟件包開發(fā)文檔中的定義:運(yùn)行于 RT-Thread 物聯(lián)網(wǎng)操作系統(tǒng)平臺(tái)上,面向不同應(yīng)用領(lǐng)域的軟件組件形成一個(gè)個(gè)軟件包,由軟件包描述信息,軟件包源代碼或庫(kù)文件組成。
豐富多樣的軟件包 簡(jiǎn)單來(lái)說(shuō),一個(gè)軟件包就是基于RTT操作系統(tǒng)的,具有不同功能的軟件組件,使用軟件包的用戶可以在env工具中選中所需的軟件包,使用env命令下載并編譯,該組件的文件就可以自動(dòng)加入到用戶的開發(fā)工程中來(lái)。 當(dāng)然,僅僅是使用軟件包是遠(yuǎn)遠(yuǎn)無(wú)法體會(huì)到玩轉(zhuǎn)軟件包的全部樂(lè)趣的,有幸受到RT-Thread團(tuán)隊(duì)的邀請(qǐng),今天我就來(lái)分享一下如何制作一個(gè)軟件包以及我做軟件包的一些經(jīng)驗(yàn),也順便帶大家了解一下為什么利用軟件包可以降低開發(fā)難度。 在制作軟件包前,我們首先要來(lái)了解一下RT-Thread軟件包的結(jié)構(gòu)。一個(gè)完整的軟件包有以下兩個(gè)重要組成部分:其中,軟件包內(nèi)容指的是該軟件包的主體,里面包括軟件源代碼、軟件包說(shuō)明文檔、許可證以及用于scons編譯的SConscript文件。軟件包索引主要是提供給env工具,將你的軟件包信息加入到env的軟件包目錄中,使其能夠自動(dòng)下載你的軟件包并且進(jìn)行一些基本的配置。里面包含Kconfig文件以及packages.json文件。軟件包索引及軟件包內(nèi)容中的Sconscript文件在RT-Rhread官網(wǎng)的文檔中心有詳細(xì)的介紹,對(duì)其不熟悉的朋友可以點(diǎn)擊下方鏈接進(jìn)入查看:https://www./document/site/development-guide/package/package/ (請(qǐng)將以上鏈接復(fù)制至外部瀏覽器打開) 了解了軟件包的結(jié)構(gòu)后,我們就可以來(lái)設(shè)計(jì)自己的軟件包了。首先,我們需要制作好一個(gè)能夠?qū)崿F(xiàn)某項(xiàng)具體的功能、與產(chǎn)品業(yè)務(wù)邏輯分離、具有通用性的軟件源代碼(在下文中,我會(huì)分享一些我設(shè)計(jì)軟件包時(shí)的一些經(jīng)驗(yàn)與想法),并且將不同的文件分類放入不同的文件夾中,我在設(shè)計(jì)中一般分為:example、inc、src、port、doc這五個(gè)文件夾,分別為使用案例、頭文件、源文件、移植文件以及文檔,其中移植文件和文檔若沒(méi)有則可以不需要。在軟件包根目錄中還需加入軟件包使用說(shuō)明(一般命名為“readme.md”)、軟件包開源許可證( 對(duì)于開源許可證不熟悉的朋友可以查閱相關(guān)資料,根據(jù)自己的實(shí)際情況選用合適的許可證)與Sconscript文件。Sconscript文件主要用于在使用scons編譯工程時(shí)根據(jù)用戶在menuconfig中選擇的不同選項(xiàng)將對(duì)應(yīng)的源文件編譯到工程之中。Sconscript的編寫可以參照RT-Thread官方的Scons構(gòu)建工具說(shuō)明文檔:https://www./document/site/programming-manual/scons/scons/制作好軟件包主體之后,我們需要將軟件包主體上傳到代碼倉(cāng)庫(kù)中如Github。上傳完軟件包主體后,我們使用env工具肯定是沒(méi)辦法看到我們剛剛上傳的軟件包的,因?yàn)槲覀冞€沒(méi)有告訴它去哪里找我們的軟件包。因此,接下來(lái),我們需要制作軟件包索引,使env工具能夠找到并且下載我們的軟件包。軟件包索引只需要兩個(gè)文件Kconfig與package.json,前者包含了軟件包的配置項(xiàng),如軟件包版本、功能選項(xiàng)等信息。也就是我們使用env工具能看到的軟件包信息及配置。后者存放軟件包的名稱、簡(jiǎn)介、各個(gè)版本對(duì)應(yīng)的下載鏈接等信息。相當(dāng)于告訴env工具需要去哪里下載我們的軟件包,對(duì)于有多個(gè)版本的軟件包還可以給每個(gè)版本設(shè)置獨(dú)立的下載地址。這兩個(gè)文件并不需要我們自己從頭開始寫,我們可以試用env工具的索引生成向?qū)Р⒏鶕?jù)向?qū)崾疽徊揭徊缴晌覀兊能浖饕?。同樣,RT-Thread官方對(duì)于如何生成索引文件有詳細(xì)的介紹,大家可以點(diǎn)擊下方鏈接,找到“創(chuàng)建軟件包索引”一節(jié)查看:https://www./document/site/development-guide/package/package/最后,我們需要將制作好的軟件包索引通過(guò)PR流程推送到RT-Thread軟件包索引倉(cāng)庫(kù)中:https://github.com/RT-Thread/packages。至此,我們的軟件包制作流程就正式結(jié)束了,我們只需等待RT-Thread團(tuán)隊(duì)將我們的索引合并,即可使用env工具來(lái)配置及使用我們的軟件包啦!
在整個(gè)軟件包的制作過(guò)程中,最重要的部分就是軟件包主體的設(shè)計(jì)。設(shè)計(jì)出一個(gè)真正受歡迎的軟件包是非常不容易的,軟件包的設(shè)計(jì)是一條長(zhǎng)遠(yuǎn)的路,我自己也剛踏上這條路。不敢說(shuō)有什么非常深刻的見解,但確實(shí)有一些小小的經(jīng)驗(yàn)可以與大家分享。軟件包的實(shí)質(zhì)是將能夠?qū)崿F(xiàn)某一種具體功能的代碼與工程邏輯剝離開來(lái),封裝代碼內(nèi)核,去掉一些針對(duì)于某個(gè)項(xiàng)目的特定操作,保留通用功能,并且抽象出API接口,供軟件包使用者使用。通俗來(lái)講,以按鍵軟件包為例,我需要去掉按下按鍵后做什么,長(zhǎng)按按鍵后做什么這些與我具體項(xiàng)目相關(guān)的代碼,將如何檢測(cè)按鍵按下、如何檢測(cè)按鍵長(zhǎng)按、按鍵消抖這些涉及到按鍵內(nèi)核操作的代碼整合在一起,并且對(duì)外提供按鍵的初始化、按鍵功能的開啟關(guān)閉、按鍵事件的設(shè)置等等通用的API接口。下面我們來(lái)說(shuō)一說(shuō)軟件包制作過(guò)程中的一些注意事項(xiàng):1、接口易懂:軟件包是供大家使用的,而使用者又是通過(guò)軟件包提供的API與軟件包接觸,因此,軟件包的API一定要簡(jiǎn)潔易懂,命名風(fēng)格要統(tǒng)一,盡量使用有意義的英文名詞,參數(shù)盡量少。并且在軟件包說(shuō)明文檔中,也一定要加入詳細(xì)的API使用介紹。2、內(nèi)核屏蔽:一個(gè)好的軟件包的內(nèi)核應(yīng)該是對(duì)用戶不可見的,也就是說(shuō)軟件包的使用者不應(yīng)該去直接對(duì)軟件包的內(nèi)核進(jìn)行操作。在設(shè)計(jì)軟件包時(shí)要時(shí)刻注意避免出現(xiàn)一些對(duì)外暴露的內(nèi)核變量、參數(shù)以及函數(shù)等,必要時(shí)刻要加上static關(guān)鍵字對(duì)內(nèi)核屬性進(jìn)行保護(hù)。3、操作簡(jiǎn)單:軟件包的出現(xiàn)是為了簡(jiǎn)化開發(fā)者的開發(fā)周期與難度,因此,軟件包本身應(yīng)該要具備使用步驟清晰,操作簡(jiǎn)單的特性。所有復(fù)雜的操作流程都應(yīng)該在軟件包的內(nèi)部實(shí)現(xiàn),否則這個(gè)軟件包就失去了自身的意義。4、易于移植:一個(gè)軟件包需要運(yùn)行于多種硬件平臺(tái)和開發(fā)環(huán)境,而一份代碼在不借助其他手段的情況下必然是無(wú)法在各種平臺(tái)與環(huán)境下運(yùn)行的。因此,移植性也是在軟件包的設(shè)計(jì)過(guò)程中需要著重考慮的部分。一般我都會(huì)將軟件包的內(nèi)核分為無(wú)需依賴外部環(huán)境的核心層與需要依賴外部環(huán)境(如硬件接口)的移植層。其中核心層無(wú)需修改,而移植層則需要使用者依據(jù)自己的環(huán)境進(jìn)行修改與適配。值得欣慰的是,RT-Thread已經(jīng)統(tǒng)一了絕大部分的硬件操作,使大部分軟件包的開發(fā)都無(wú)需太關(guān)注移植層的設(shè)置,很多軟件包甚至都不需要移植即可在RT-Thread所支持的所有BSP上運(yùn)行!
剛開始使用RT-Thread時(shí)還沒(méi)有軟件包的概念,很多應(yīng)用都需要自己從底層一步步調(diào)用系統(tǒng)的接口實(shí)現(xiàn)。做一個(gè)按鍵,需要自己檢測(cè)GPIO輸入狀態(tài),需要自己進(jìn)行按鍵消抖,做一個(gè)流水燈,需要加上一個(gè)又一個(gè)的延時(shí),一條又一條的開啟和關(guān)閉。而這些僅僅只是最簡(jiǎn)單的應(yīng)用,復(fù)雜的應(yīng)用如文件系統(tǒng)、網(wǎng)頁(yè)服務(wù)器、MQTT等等若要自己從頭實(shí)現(xiàn),其難度可想而知。自從使用了軟件包,很多原本需要花幾個(gè)星期甚至幾個(gè)月的工作量現(xiàn)在只需花一分鐘選中、下載、編譯就可以直接使用,甚至自己無(wú)需了解內(nèi)部的實(shí)現(xiàn)原理。大幅縮短了項(xiàng)目的開發(fā)周期,而一些知名的軟件包還具備很高的穩(wěn)定性,避免了自己在項(xiàng)目開發(fā)過(guò)程中會(huì)遇到的很多坑。而對(duì)于軟件包開發(fā)者來(lái)說(shuō),自己的軟件包能夠被別人使用也是對(duì)自己能力的一種認(rèn)可,最重要的是原來(lái)需要獨(dú)自維護(hù)的程序現(xiàn)在將由廣大的開發(fā)者群體一起維護(hù),從軟件包使用者反饋的建議以及其他開發(fā)者的PR中,我們能夠更快認(rèn)識(shí)到軟件包內(nèi)隱藏的問(wèn)題或者設(shè)計(jì)的不足,并且加以修正,大大降低了項(xiàng)目出現(xiàn)莫名其妙錯(cuò)誤的幾率。 最后,希望能有越來(lái)越多的開發(fā)者加入到RT-Thread軟件包的生態(tài)建設(shè)中來(lái),一起維護(hù),開發(fā),創(chuàng)造一個(gè)更大,更完備的軟件包社區(qū)!
|