這次小編為大家帶來的是ZephyrOS系列文章的第五篇,將為大家介紹Kconfig。
這次小編緊接著上篇給大家帶來ZephyrOS中對于Kconfig的介紹。
簡單的來說,Kconfig就是Zephyr的配置系統,Zephyr內核可以在構建階段,根據不同的配置,包含特定的應用和平臺。而這個配置過程正是通過Kconfig實現的,其也與Linux內核配置所使用的Kconfig完全一致。設計目標就是讓我們無需修改源代碼就可以完成Zephyr的配置工作,包括內核,硬件,子系統等。通常配置項(也被稱作symbol)是在Kconfig文件中定義的。當然不同的配置項之間也是可以存在依賴關系的,比如定義一個符號A,它依賴于B,那么只有當B被使能之后,A才是有效的。同時,所有的符號可以被合并到一個叫做menu/sub-menu的組里面,便于圖形化管理。在正式開篇之前,小編先給大家推薦一個小工具,叫做menuconfig,他是一個可選的圖形化工具,可以用來查看和修改Kconfig設置:
當然默認是不會打開的,即默認使用west構建工程是不支持menuconfig的,需要傳入-t menuconfig參數:
west build –t menuconfig –b mimxrt1060_evksampleshello_world
最終,所有配置項會被生成到一個叫做autoconf.h的文件中,沒有用到的代碼就不會再被編譯系統所編譯,以節省代碼空間。
下面,介紹Kconfig中的一個比較重要的概念,visible和invisible符號。
首先說visible符號,也就是那些可以在menuconfig窗口中見到的,這些符號,通常都有一個prompt屬性,即一個字符串來進行描述,例如:
config FPU bool “Support floating point operations” depends on HAS_FPU
然后,我們就可以在menuconfig界面中找到他:
[ ] Support floating pointoperations
Invisible符號則與之相對,一般沒有prompt屬性,即字符串來說明,例如:
config CPU_HAS_FPU
bool
help
This symbol is y if the CPU has a hardwarefloating point unit.
他的特殊性在于,這些符號對于用戶是不可見的,即不能通過menuconfig提供的圖形化工具來配置,只能通過其他手段來修改其的值。
例如,通過Kconfig.defconfig文件設置下面這個符號的值為32:
config FOO_WIDTH
int
我們就可以在Kconfig.defconfig文件中定義:
config FOO_WIDTH
default 32
endif
這樣一來,我們就修改了FOO_WIDTH的默認值為32。
要注意的是,Kconfig.defconfig中所定義的默認值會覆蓋掉起始值,且優先級比較高。
我們再舉一個choice的例子,比起上面我們定義的config形式的變量,choice類似于一種單選框,當有多個配置存在時,只能一個配置項有效,這樣一來,達到一個互斥的效果。要如何操作呢?假定有一個choice叫做FOO,他有兩個配置項A和B,初始默認值是B:
choice FOO
bool “Foo choice”
default B
config A
bool “A”
config B
bool “B”
endchoice
下面我們把他的默認值修改為A,完成這個操作,除了在Kconfig.defconfig中修改外,我們還可以在prj.conf中添加:
choice FOO
default A
endchoice
當然,這里要注意,如果我們定義了一個invisible的choice變量FOO的話,就只能通過Kconfig.defconfig來修改了。
那么在Zephyr工程中,都有哪些修改默認配置的地方呢?如果只考慮板級(即Zephyr所支持的開發板)+ 應用這一層,大致分為三類:
板子相關的配置文件,一般名為:boards/《ARCH》/《BOARD》/《BOARD》_defconfig
任意的CMake cache文件,以CONFIG_開頭
應用配置:
a) 默認prj.conf
b) 通過-DCONF_FILE=《conf_file》指定,進行重載
c) 通過-DOVERLAY_CONFIG=《conf_file》指定,進行擴展
d) 通過prj_《BOARD》.conf進行重載
e) 通過boards/《BOARD》.conf進行擴展
那么小編就不再擴展Kconfig的其他語法了,大家可以參考這里來了解更多。
至此,Zephyr所使用的兩大配置系統就大致講完了,那么有朋友可能會問了,我們什么時候要用DeviceTree什么時候要用Kconfig呢?小編在這里簡單總結一下:
使用設備樹來描述硬件和啟動配置,例如板載外設和設置啟動時系統時鐘頻率等
使用Kconfig來配置哪些源代碼將要被放到最終的鏡像中,例如是否添加網絡的支持,哪個驅動是需要的。
通俗點講,DeviceTree負責管理那些硬件資源,Kconfig負責管理軟件資源。
舉個例子,有個設備同時擁有2.4GHz,multi-protocol radio; 藍牙和802.15.4,那么設備樹就用來描述:
是否有radio硬件存在
兼容性驅動
啟動階段配置,比如TX power in dBm
Kconfig文件決定哪個軟件包需要被構建,是選擇BLE還是選擇802.15.4協議棧。
聊到這里,結合上一篇關于DeviceTree的文章,小編就將DeviceTree和Kconfig的一
些知識點分享給大家了,不過,限于篇幅,都只是一些比較簡單的介紹,大家可以自行深入探索。
責任編輯:haq
-
mcu
+關注
關注
146文章
17877瀏覽量
361284 -
Zephyr
+關注
關注
0文章
35瀏覽量
6244
原文標題:清風徐來——Zephyr實戰篇(4)之Kconfig
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論