Zephyr系统开发还用手动添加文件?自动编译不会还有人不知道吧?
Zephyr系统开发主要有三个关键组成:cmake、Kconfig、devicetree。我们下面依次进行一下讲解。
CMake
工程项目文件的组织通常通过makefile的文件来组织,而makefile是需要程序员手动编写。每次添加新的文件,新的头文件,新的第三方库文件后都需要手动编写参数,比如文件的路径,文件名等。容易出错,效率还很低下,关键,还是纯手动。由于CMake这个辅助生成makefile文件的软件也就诞生了。Zephyr也继承了CMake的优势,使用CMake软件工具来管理工程文件,程序员仅需要编写简单的CMakeLists.txt文件即可以生成后期make编译工具使用的makefile文件了。不过,zephyr系统主推的并不是make,而是一个叫ninja的编译工具。
Kconfig
平台的区分以及代码的裁剪,应用开发中主要体现在驱动的开关,如下图显示,在驱动的实现里面定义了wifi的kconfig宏,用户在使用的时候可以在prj.config文件去打开这个宏,这个驱动就会被打开。
可以文本也可以图形化裁剪Zephyr系统的各个组件,各个功能的开与关。
其实吧,我就觉得只是把Linux内核构建过程给搬过来了。没有什么新颖的地方。
多说一句,其分为板级的kconfig,应用级别的kconfig。后者的优先级最高,当两者不同的时候,以应用级的kconfig配置定义为准。倒是也不难理解,板级的可能别的项目也在使用,你自己的项目更改你自己的配置即可。
config LD_LINKER_SCRIPT_SUPPORTED bool default y choice LINKER_SCRIPT prompt "Linker script" default LD_LINKER_TEMPLATE if LD_LINKER_SCRIPT_SUPPORTED config LD_LINKER_TEMPLATE bool "LD template" depends on LD_LINKER_SCRIPT_SUPPORTED help Select this option to use the LD linker script templates. The templates are pre-processed by the C pre-processor to create the final LD linker script.DeviceTree
配置硬件参数信息,比如像前面WIFI的模块,可以配置SPI引脚以及速率,还可以配置跟他相关的同步引脚。
/* * Copyright (c) 2019, NXP * * SPDX-License-Identifier: Apache-2.0 */ /dts-v1/; #include <nxp/nxp_lpc55S6x.dtsi> #include "lpcxpresso55s69.dtsi" #include <zephyr/dt-bindings/pwm/pwm.h> / { model = "NXP LPCXpresso55S69 board"; compatible = "nxp,lpc55xxx", "nxp,lpc"; cpus { /delete-node/ cpu@1; }; aliases{ sw0 = &user_button_1; sw1 = &user_button_2; sw2 = &user_button_3; watchdog0 = &wwdt0; /* For pwm test suites */ pwm-0 = &sc_timer; pwm-led0 = &red_pwm_led; red-pwm-led = &red_pwm_led; sdhc0 = &sdhc0; accel0 = &mma8652fc; sdhc0 = &sdif; }; chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,code-partition = &slot0_partition; zephyr,code-cpu1-partition = &slot1_partition; zephyr,sram-cpu1-partition = &sram3; zephyr,console = &flexcomm0; zephyr,shell-uart = &flexcomm0; zephyr,entropy = &rng; }; gpio_keys { compatible = "gpio-keys"; user_button_1: button_0 { label = "User SW1"; gpios = <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; user_button_2: button_1 { label = "User SW2"; gpios = <&gpio1 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; }; user_button_3: button_2 { label = "User SW3"; gpios = <&gpio1 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; }; }; pwmleds { compatible = "pwm-leds"; red_pwm_led: red_pwm_led { pwms = <&sc_timer 0 PWM_MSEC(20) PWM_POLARITY_NORMAL>; label = "Red PWM LED"; status = "okay"; }; }; };