因为一般的MCU的性能有限,能够应用的场景也比较局限,所以需要学习功能更强大的ARM芯片,基于linux系统进行功能开发,得到更加强大的嵌入式系统。我用于学习的硬件是正点原子推出的STM32MP157开发板,感兴趣的小伙伴也可以一起交流学习。
学习视频地址:【正点原子】STM32MP157开发板
系统启动流程
linux系统的启动是一个链式的过程,不同于MCU只需要加载一个bin文件就可以运行,linux系统需要保证系统的稳定性,所以要先加载一些必要的系统信息,并且对相关的设备进行初始化,再运行用户的核心代码。
TF-A,U-BOOT,Linux内核都有两种形式移植到开发板
- 下载ST提供的源码 -> 打补丁 -> 修改MakeFile -> 修改设备树等配置文件 -> 编译 -> 烧录
- 下载开发板商家提供的源码 -> 编译 -> 烧录
注: 打补丁的时候可能需要权限,可以使用su root进入root模式再执行指令。
TF-A
作用:隔离硬件,为硬件提供一个安全环境并且提供安全服务,将CPU的工作状态划分为安全世界和非安全世界。
使用:TF-A由自己的官方组织开发,ST将自己的芯片移植进其中,正点原子则是基于ST修改后的源码进行开发使用。
U-BOOT
环境变量操作
修改环境变量
setenv bootdelay 5
saveenv
新建环境变量
setenv author 'console=ttySTM0,115200 root=/dev/mmcblk2p2 rootwait rw '
saveenv
删除环境变量
setenv author
saveenv
查看环境变量
print xxx # xxx为变量名
内存操作
显示内存值
md[.b, .w, .l] address [# of objects]
修改内存值
# 地址不自增
nm [.b, .w, .l] address
# 地址自增
mm [.b, .w, .l] address
填充内存
mw [.b, .w, .l] address value [count]
数据拷贝
cp [.b, .w, .l] source target count
数据比较
cmp [.b, .w, .l] addr1 addr2 count
网络操作
验证网络是否可用
ping address
获取路由器IP
dhcp
网络文件传输
# nfs
nfs [loadAddress] [[hostIPaddr:]bootfilename]
# tftp
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
UMS指令
用于将flash模拟成U盘,采用ext4格式。
ums <USB_controller> [<devtype>] <dev[:part]>
bootargs 环境变量
console=ttySTM0,115200 root=/dev/mmcblk2p3 rootwait rw
console:设置linux交互终端
toot:设置根文件系统的位置
rootfstype:指定根文件系统的类型,对于ext格式则无需指定
图形化界面
.config文件用于存储配置项,Kconfig文件是图形界面的描述文件。
作用:在.config 文件中生成以“CONFIG_”开头的变量。
make stm32mp15_atk_trusted_defconfig # 只需配置一次
make menuconfig
Linux内核
文件架构
根文件系统
根文件系统主要用于构建linux系统的文件架构,可以采用busybox和buildroot软件进行构建,后者也有用到前者的功能。所以主要采用buildroot进行构建文件系统。
- 参数配置(基于图形化界面)
make menuconfig
make xxx_defconfig
- 编译
make -j8
编译所得的output/images/rootfs.tar即为所需的文件,将其复制解压到目标目录即可。
在buildroot下修改busybox配置
make busybox-menuconfig