前言
我的电脑环境:
系统 | 型号 |
---|
Ubnutu | 20.04 LTS | Zephry | 2.6.99 | stm32 | f746g-dico |
在开始之前建议大家电脑是开启VPN可以访问外网的,因为Zephyr脚本下载依赖时都是从外网上下载,如果没有VPN可能导致Time Out超时无法安装好依赖.
在开始之前需要确保当前ubnutu系统环境高于18.04 LTS
1. 更新apt仓库
这一步是将当前系统仓库包进行一次迭代更新,可以跳过.
sudo apt update
sudo apt upgrade
2. 安装依赖
sudo apt install --no-install-recommends -y git cmake ninja-build
sudo apt install --no-install-recommends -y gperf ccache dfu-util
sudo apt install --no-install-recommends -y device-tree-compiler wget python3-dev
sudo apt install --no-install-recommends -y python3-pip python3-setuptools python3-tk
sudo apt install --no-install-recommends -y python3-wheel xz-utils
sudo apt install --no-install-recommends -y file make gcc
sudo apt install --no-install-recommends -y gcc-multilib g++-multilib libsdl2-dev
2.1 依赖作用
包名 | 作用 | git | 从github上拉取zephyr源 | cmake | 负责构建源文件编译规则 | ninja-build | 谷歌的构建工具,负责管理cmake | ccache | 存储编译器缓存,类似vs的编译缓存,用于提升编译速度 | dfu-util | usb dfu(串口总线以及固件升级协议)实现程序,推测 west flash一键下载就是用这个模块实现的 | device-tree-compiler | linux下的设备树编译器,主要负责编译boards下的设备文件,让编译系统了解开发板信息 | wget | 仅在安装时会用到,用于下载sdk包 | python3-dev | 编译系统上的所有命令都是基于python脚本编写而成,如烧写到flash等,由python调用ninja在到cmake在到make | python3-pip | 用于下载python3的依赖 | python3-setuptools | 用于管理依赖包 | python3-tk | python3的gui包 | python3-wheel | 用于打包生成wheel格式的安装包文件 | xz-utils | 压缩sdk包,用于生成xz包 | file | 获取文件属性 | make | make编译脚本,用于构建项目体系 | gcc | c语言编译器 | gcc-multilib | 用于生成不同平台的c代码 | g++-multilib | 用于生成不同平台的c++代码 | libsdl2-dev | 跨平台的gui工具包 |
4. 主要依赖最低版本
其实低1到2个版本到没事,给出的最低版本要求是作者在编译Zephyr时所用的环境,建议大家与作者同步
依赖名 | 最低版本 | CMake | 3.13.1 | Python | 3.6 | device-tree-compiler | 1.4.6 |
5. 下载完所有依赖之后可以看下是否满足最小依赖
wc -l en_US.twitter.txt
? ~ cmake --version
cmake version 3.16.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).
? ~ python3 --version
Python 3.8.10
? ~ dtc --version
Version: DTC 1.5.0
6. 使用pip3安装west
west是Zephyr自己的构建元工具,实际上Zephyr是基于Cmake编写的,west会根据当前环境去调用cmake去编译,这样为我们省去了许多编译步骤.
--user参数是只安装到当前用户环境下,如果切换了用户则这个命令无效了
安装的目录在~/.local/bin目录下
-U参数是若当前已经有这个包了则对其进行升级
pip3 install --user -U west
7. 配置环境
将bin目录写到bashrc中,这样就可以直接调用west以及bin下的所有文件
echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc
8. 生效配置
linux下的配置文件不是实时性的,我们需要手动让linux来重读一次配置
source ~/.bashrc
9. 检查环境是否生效
输入如下命令若输出版本则代表环境配置成功,若失败可以重启一下试试
? ~ west --version
West version: v0.11.0
10. 创建工作目录
这一步可以忽略,我创建这个目录的目的是为了将zephyr安装到这个目录下
mkdir ~/my_work
11. 安装zephyr
west会将zephyr安装到刚刚创建的my_work目录下的zephyrproject子目录中
west init ~/my_work/zephyrproject
12. 进入到安装目录并更新
cd ~/my_work/zephyrproject && west update
13. 导出cmake依赖
这样的话就可以使用cmake构建了
west zephyr-export
14. 下载python3依赖
这里-r是指定依赖文件
requirements.txt里列出了所有依赖,pip3会解析并全部下载
pip3 install --user -r ~/my_work/zephyrproject/zephyr/scripts/requirements.txt
15. 进入工作目录
注意这里不是zephyr工程目录
cd ~/my_work
16. 下载sdk包
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.12.4/zephyr-sdk-0.12.4-x86_64-linux-setup.run
17. 执行权限
这里sdk包是以.run文件实现的,这里给.x权限就可以直接执行
chmod +x zephyr-sdk-0.12.4-x86_64-linux-setup.run
18. 安装sdk
这里若不指定目录则安装到/opt目录下,这里我指定到工作目录下,与zephyr工程同一目录
./zephyr-sdk-0.12.4-x86_64-linux-setup.run -- -d ~/my_work/zephyr-sdk-0.12.4
安装时会提示你确认安装,输入y并回车
Do you want to installing to /home/test/my_work/zephyr-sdk-0.12.4 (y/n)?
y
Do you want to register Zephyr-sdk CMake module with path /home/test/my_work/zephyr-sdk-0.12.4 (y/n)?
y
Do you want to create/update /home/test/.zephyrrc with environment variables setup for you (y/n)?
y
以下是我的安装过程
? my_work ./zephyr-sdk-0.12.4-x86_64-linux-setup.run Verifying archive integrity... 100% All good.
Uncompressing SDK for Zephyr 100%
Enter target directory for SDK (default: /home/test/zephyr-sdk/):
Installing SDK to /home/test/zephyr-sdk Creating directory /home/test/zephyr-sdk
Success
[*] Installing arm tools...
[*] Installing arm64 tools... [*] Installing arc tools...
[*] Installing nios2 tools...
[*] Installing riscv64 tools... [*] Installing sparc tools...
[*] Installing mips tools... [*] Installing x86_64 tools...
[*] Installing xtensa_sample_controller tools...
[*] Installing xtensa_intel_apl_adsp tools... [*] Installing xtensa_intel_s1000 tools...
[*] Installing xtensa_intel_bdw_adsp tools...
[*] Installing xtensa_intel_byt_adsp tools... [*] Installing xtensa_nxp_imx_adsp tools...
[*] Installing xtensa_nxp_imx8m_adsp tools...
[*] Installing CMake files...
[*] Installing additional host tools...
Success installing SDK.
SDK is ready to be used.
? my_work ls
zephyrproject zephyr-sdk-0.12.4-x86_64-linux-setup.run
? my_work ./zephyr-sdk-0.12.4-x86_64-linux-setup.run -- -d ~/my_work/zephyr-sdk-0.12.4 Verifying archive integrity... 100% All good.
Uncompressing SDK for Zephyr 100%
It is recommended to install Zephyr SDK at one of the following locations for automatic discoverability in CMake:
/home/test/zephyr-sdk-0.12.4 /home/test/bin/zephyr-sdk-0.12.4
Note: The version number '-0.12.4' can be omitted.
Do you want to installing to /home/test/my_work/zephyr-sdk-0.12.4 (y/n)?
y
md5sum is /usr/bin/md5sum Do you want to register Zephyr-sdk CMake module with path /home/test/my_work/zephyr-sdk-0.12.4 (y/n)?
y
SDK is ready to be used.
19. 将dev规则copy到udev目录下
这一步是修改udev的命名规则
udev是设备管理器,当我们拔插usb或其它外设时由sysfs来注册class目录,然后再由udev去读取class目录下的配置文件注册到/dev目录下,同时注册到/dev时的一些文件规则,比如组,权限等就是到这个文件中去读取的,同时也会有匹配规则,在/dev目录下注册的文件会硬链接到class目录下
sudo cp ~/my_work/zephyr-sdk-0.12.4/sysroots/x86_64-pokysdk-linux/usr/share/openocd/contrib/60-openocd.rules /etc/udev/rules.d
配置生效
sudo udevadm control --reload
20. 进入build目录
这里是到zephyr的build目录下
cd ~/my_work/zephyrproject/zephyr
23. 编译示例
samples下有许多示例,这里我编译一个blinky,led闪烁的代码
west build -b <your-board-name> samples/basic/blinky
这里分享一下如何查一下自己的板号
当你拿到一个板时可以在zephyr的boards目录下查看是否支持,根据你板子的核以及型号去查
cd /home/test/my_work/zephyrproject/zephyr/boards
比如我的是stm32f746系列的,这里我通过开发板上的板名去查
我的核是arm的,所以进入到arm目录下去查
cd arm
使用find查一下
? arm git:(b1b977dacf) find . -iname "stm32f746*"
./stm32f746g_disco
./stm32f746g_disco/stm32f746g_disco.yaml
./stm32f746g_disco/doc/img/stm32f746g_disco.jpg
./stm32f746g_disco/stm32f746g_disco_defconfig
./stm32f746g_disco/stm32f746g_disco.dts
可以看到有一个stm32f746g_disco的目录,目录下有许多配置文件,这些文件类似Linux嵌入式下的设备树,有Linux嵌入式开发经验的人来一定不陌生,非必要情况我们一般不会去修改里面的文件,里面的文件就是描述GPIO等硬件信息,告诉zephyr这个型号的架构,主要修改dts文件,在这个文件中配置uart,clock等
板名可以在开发板上找到也可以在给的描述纸上找到
?
然后我们在回到build目录
cd ~/my_work/zephyrproject/zephyr
build一下
west build -b stm32f746g_disco samples/basic/blinky
build之后生成的.bin,hex,elf文件在当前目录的build目录下
? zephyr git:(b1b977dacf) ls build/zephyr
arch isrList.bin linker_zephyr_prebuilt.cmd.dep zephyr.dts
boards isr_tables.c misc zephyr.elf
cmake kconfig runners.yaml zephyr.hex
CMakeFiles kernel soc zephyr.lst
cmake_install.cmake lib stm32f746g_disco.dts_compiled zephyr.map
dev_handles.c libzephyr.a stm32f746g_disco.dts.pre.d zephyr_prebuilt.elf
drivers linker.cmd stm32f746g_disco.dts.pre.tmp zephyr_prebuilt.map
edt.pickle linker.cmd.dep subsys zephyr.stat
include linker_zephyr_prebuilt.cmd zephyr.bin
你可以通过其它烧录程序烧录到开发板中
也可以使用west flash命令直接烧录,前提是需要有st-link
当开发板连接到PC后使用lsub查看一下有没有st-link确保下载线已经链接
? zephyr git:(b1b977dacf) lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 03f0:0024 HP, Inc KU-0316 Keyboard
Bus 001 Device 006: ID 0483:374b STMicroelectronics ST-LINK/V2.1
Bus 001 Device 004: ID 413c:301a Dell Computer Corp. Dell MS116 USB Optical Mouse
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
然后下载就可以了
west flash
若要重新编译则把build删除重新执行命令就可以了,同时如果想编译完成之后同时烧录到开发板可以使用-t flash即可
先删除build
rm -rf build
编译并下载到flash
west build -b stm32f746g_disco samples/basic/blink -t flash
执行完成之后就可以看到开发板上的LED灯在闪烁了
为了方便安装,我写了一个脚本,可以快速安装与配置
脚本安装方法
1. 下载脚本
将下面链接中的安装脚本下载到你的ubnutu系统上
https://download.csdn.net/download/bjbz_cxy/20722127
?注意事项:此脚本仅支持ubnutu 18.04 LTS版本以上
2.安装前配置
首先为这个文件加上执行权限
chmod +x ./install.sh
2.1 安装脚本依赖项
sudo apt install zsh
sudo?apt?install?expect
使用zsh是因为更加灵活与强大且安全性更高
expect主要是实现脚本中自动交互的功能,实现完全自动化功能,一键执行脱离双手
因为脚本中使用了一些美化输出的shell代码,所以需要确保当前终端宽高大于140*140
可以使用如下命令查看:
stty size
若宽高不符合可以手动修改终端窗口大小,或者按下F11最大化窗口
3.安装说明
脚本参数如下
install?[install path]
第二个参数是安装路径,若不指定则安装到脚本运行目录下
./install
指定安装:
./install /home/test/my_work
4. log文件
为了方便追踪错误,我编写了一个日志模块,为了美观我在终端界面中不会输出太多信息,所有的安装详细信息都会输出到脚本运行目录下的.log目录中,在脚本执行的同一时间会在该目录下生成对应时间的.log文件,若脚本执行失败可以在这个log中查找相关错误日志并追踪错误
cd .log
5.说明
脚本写法比较苛刻,在执行过程中会确认每一条指令以及配置的正确性,若有任意一条指令无法正确完成工作都会报错并终止安装,因为系统环境的原因我无法保证一个脚本可以在所有环境下顺利安装,若有问题请与我联系,我对它进行迭代适配,thank🍺
|