MDK(Keil)實(shí)現Kconfig圖形化配置
背景
在嵌入式開(kāi)發(fā)中通常使用.h頭文件宏定義配置各種參數,來(lái)適配各種應用場(chǎng)景,以及統一修改工程中使用到的參數,避免漏改引起的程序bug。在一個(gè)相對比較復雜的項目中,往往需要配置各種各樣的參數, 不同功能的模塊對應不同.h,而有效配置項目是具有關(guān)聯(lián)性,比如A模塊依賴(lài)B模塊,如果模塊B關(guān)閉(如#define MODULE_B 0)時(shí),那么就不應該啟用模塊A,當依賴(lài)層級比較多時(shí),容易出現修改這忘了改那,尤其隨著(zhù)時(shí)間拉長(cháng),對項目沒(méi)有之前那么熟悉的情況,依靠記憶配置存在隱患。
本文引用地址:http://dyxdggzs.com/article/202503/468636.htm參考linux開(kāi)發(fā),使用make menuconfig命令調用Kconfig進(jìn)行配置,不僅可以管理如此龐大的工程,同時(shí)圖形化配置又顯得非常直觀(guān),高大上~, 剛好手上項目是基于GD32 MDK開(kāi)發(fā)的,因為是多人參與的項目,需要考慮團隊適應,因此不方便移植到linux平臺上(menuconfig本身的linux kernel量身打造的,在linux中搭建環(huán)境更加方便),于是萌生了搭建WIndows中MDK使用Kconfig環(huán)境想法,開(kāi)干~
Windows中menuconfig
安裝依賴(lài)
menuconfig(KConfig)圖形化依賴(lài)ncurses和kconfiglib庫,python已經(jīng)幫我們實(shí)現了,因此我們這里使用python來(lái)安裝。這里我以python3為例子(python安裝這里就不介紹了,并且需要將python添加到系統環(huán)境變量中)
檢測python是否安裝成功
這里我們使用pyhton 的pip來(lái)安裝。
安裝windows-curses
python -m pip install windows-curses
安裝windows-curses庫
出現”Successfully installed windows-curses-xxx“ 表示安裝成功。
另外如果安裝失敗,有可能是你的pip版本太低, 根據提示更新:
python -m pip install --upgrade pip
安裝kconfiglib
python -m pip install kconfiglib
安裝kconfiglib庫
出現”Successfully installed kconfiglib-xxx“ 表示安裝成功。
至此依賴(lài)庫已安裝好,根據自己電腦上安裝的python路徑查看是否真的生成我們所要的文件:
python3Libsite-packagesgenconfig.py //作用將menuconfig生成的.config文件轉成.h頭文件
python3Scriptsmenuconfig.exe
嘗試menuconfig
首先我們需要一個(gè)Kconfig,關(guān)于Kconfig語(yǔ)法,這篇文章不過(guò)多介紹。這里摘用網(wǎng)上一個(gè)簡(jiǎn)單的例子:
mainmenu "Kconfig Demo"
menu "Test Params setting"
config TEST_ENABLE
bool "Enable test work"
default n help
Will print debug information if enable.
config TEST_SHOW_STRING string "The show string info"
default "Test 123"config TEST_SHOW_INT int "The show int info"
range 0 255
default 123config TEST_TOP_ENABLE bool "Test Top Func"
default n help
Function Test Top
config TEST_SUB_0_ENABLE bool "Test Sub 0 Func"
default n help
Function Test Sub 0config TEST_SUB_1_ENABLE bool "Test Sub 1 Func"
default n
depends on TEST_TOP_ENABLE help
Function Test Sub 1config TEST_SHOW_SUB_INT int
default 456 if TEST_SUB_0_ENABLE && TEST_SUB_1_ENABLE default 123endmenu
使用cmd命令行
使用win+R打開(kāi)cmd, 并切到測試Kconfig所在路徑,并輸入:menuconfig
如出現以下圖片,表示成功了:
cmd執行menuconfig成功
使用powershll命令行
執行也是正常,結果跟cmd一致,這里就不重復貼圖了。
使用git bash命令行
git bash執行失敗
發(fā)現執行出錯,提示:Redirection is not supported 重定向不支持。個(gè)人猜測是git bash命令行是類(lèi)linux shell的,而我們使用的menuconfig是基于windows的,2者系統重定向符合不一致,導致無(wú)法執行(如果讀者有更準確的答案,歡迎留言分享)。
在MDK中使用
好了,我們的重點(diǎn)來(lái)了,如何在mdk如何使用menconfig呢?
將Kconfig添加到Keil工程中
這里我們隨便拿一個(gè)原子簡(jiǎn)單的例程,只要能編譯即可(即使編譯錯誤也行不影響)。我們將Kconfig拷貝到工程目錄下:
工程示例
配置工程
點(diǎn)擊”魔術(shù)棒" 工程配置,選擇User欄:
配置keil工程
在Before Build/Rebuild(編譯/重新編譯前執行)欄填入:menuconfig,并勾選
配置Befort Build/Rebuild
然后OK保存,嘗試編譯,在Keil的Build Output編譯輸出欄中又出現錯誤:Redirection is not supported
執行menuconfig報錯
懷疑是MDK的終端也是重定向符合不匹配的問(wèn)題,這里我嘗試了好幾次方法,嘗試通過(guò)指定cmd和powershell執行menuconfig,發(fā)現還是不行。
解決重定向
因為我們在第三步已經(jīng)驗證通過(guò)cmd和powershell是能夠正常運行menuconfig,解決思路就是通過(guò)它們間距來(lái)執行。
于是通過(guò)編寫(xiě)python腳本config.py來(lái)實(shí)現(這里參考了網(wǎng)友,表示感謝~),具體如下:
import osimport sysfrom kconfiglib import Kconfigfrom menuconfig import menuconfigdef project_menuconfig(config='.config', file='Kconfig'):
os.environ['MENUCONFIG_STYLE'] = 'default path=fg:black,bg:white separator=fg:white,bg:blue,bold selection=fg:white,bg:red,bold help=path'
os.environ['KCONFIG_CONFIG_HEADER'] = '#n# Automatically generated file: Do not edit !!!n#n'
os.environ['KCONFIG_CONFIG'] = config
# 判斷是否在Windows下執行, 若是則啟動(dòng)一個(gè)獨立的命令行提示符窗口來(lái)執行menuconfig
if sys.platform.startswith('win'):
os.system('start /wait cmd.exe /c menuconfig.exe %s' % file) else:
menuconfig(Kconfig(filename=file))if __name__ == '__main__':
project_menuconfig()
簡(jiǎn)單介紹下腳本作用:定義個(gè)project_menuconfig函數用于區分當前環(huán)境是否為windows,如果是,則執行命令:
'start /wait cmd.exe /c menuconfig.exe %s' % file
其中:
start:: 啟動(dòng)一個(gè)新的命令行
/wait: 與start命令一起使用,表示在啟動(dòng)新程序或命令后,當前命令行等待執行完 成在繼續執行后續命令
cmd.exe:指定使用cmd命令行
menuconfig:就是我們要執行的命令
%s file:其中file函數未傳參,使用默認值Kconfig
并放到工程目錄下:
將config.py添加到工程中
接著(zhù),修改MDK工程User配置:
再次嘗試編譯,正常出現圖形化界面,即成功解決~
4.生成配置頭文件
使用menuconfig解析Kconfig文件,在其路徑生成.config(默認名,文件名稱(chēng)可修改)
menuconfig生成.config文件
我們打開(kāi).config看下其內容:
.
接下來(lái)我們還需要依據.config生成我們最終所需的.h頭文件,這里我們就需要用到genconfig.py腳本文件(在第二步驟安裝依賴(lài)庫時(shí)),并在MDK中添加以下命令,使其自動(dòng)生成。
python D:Mysoftworkpython3Libsite-packagesgenconfig.py --header-path myconfig.h
其中:
D:Mysoftworkpython3Libsite-packagesgenconfig.py 根據自己實(shí)際python安裝路徑
--header-path 指定輸出頭文件名,如果不指定,則默認生成config.h,其他選項可--help查看
myconfig.h 我們指定生成的頭文件名
接著(zhù)再次編譯,發(fā)現工程路徑下成功生成了myconfig.h配置頭文件
myconfig.h內容
至此,我們成功實(shí)現了在Window中MDK使用menuconfig-Kconfig實(shí)現圖形化配置。
Kconfig語(yǔ)法
環(huán)境搭建成功,后面就是運用于實(shí)際項目中,關(guān)于kconfig語(yǔ)法本篇沒(méi)有過(guò)多介紹,相關(guān)介紹,可以參看:
Kconfig官網(wǎng):
https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.html
RTT-Thread介紹:
https://www.rt-thread.org/document/site/#/development-tools/build-config-system/Kconfig
結語(yǔ)
綜上所述,關(guān)于Windows如何使用menuconfig-Kconfig介紹,相信大家有了一定了解,可以運用于自己的實(shí)際項目哦。如果有任何疑問(wèn),歡迎點(diǎn)贊轉發(fā),以及留言討論, 另外喜歡嵌入式技術(shù)的小伙伴,可以關(guān)注走一波哈。好了,今天的分享到此咯,下次再見(jiàn)~
評論