3.第一个基础工程构建
嵌入式代码编译开发一般是两种,一种是通过IDE进行编译、下载、调试。这种开发的方式比较简单,对环境配置的要求很低,只需要安装IDE需要的环境即可。这种开发方式在开发单片机、中低端性能的芯片比较常见。另外一种就是在命令行中输入相关的命令,需要自己手动的去写编译脚本。这种常见的就是在Linux的开发过程中。
树莓派程序的开发过程一般都没有IDE,都是直接用GCC,所以我在进行工程构建的时候,也会采用GCC在控制台输入的方式进行。工程构建就需要自己解决了。目前常用的自动化编译工具就是Makefile。由于当前的第一个项目的工程比较容易,所以当前可用采用Makefile进行项目工程的构建。
3.1 环境准备
在不同的平台上进行工程构建的时候,首先需要准备下面的环境:
1.arm交叉编译工具链
2.可用执行makefile的工具
交叉编译工具链arm-none-eabi-gcc-5.4.1
可以在官网上进行下载,也可以到网盘中下载:
链接:https://pan.baidu.com/s/1ad3d-pl4YbpgYrxKg6mX9g
提取码:f3cm
上述网盘中的gcc只适用于windows,如果是其他的系统,请自行下载arm的交叉编译工具链。
如果要在windows上使用make命令,可以下载msys2,上面集成了make的环境。
然后将交叉编译工具链加入到系统的环境变量中,同时打开msys64文件夹,修改msys2_shell.cmd
双击msys2_shell.cmd,打开窗口,确保输入arm然后按下tab键可以看到如下的画面
这样系统环境就准备完成了。
3.2 源代码下载
源代码工程已经在GitHub存在了,相关源码可以在如下地址中找到:
https://github.com/bigmagic123/raspi4-bare-metal.git
在arm/1.compilation_environment中可以看到相关的文件列表。
该代码的功能是启动跳转到c代码去执行,然后串口输出hello world
程序。
3.3 代码编译与程序下载
上面两个步骤完成之后,在MSYS可以进入到工程目录,输入make直接编译即可。
可以看到生成了kernel7.img固件。该固件可以放到板子上运行。
3.4 树莓派硬件链接
树莓派4需要准备一张空的SD卡、一个串口线输出信息、一条TYPEC线供电。
首先需要将工程目录的sd_boot下面的文件放到空的SD卡目录中。然后将编译好的kernel7.img放到SD卡中即可。
接着将串口线连接到树莓派上。
接着打开串口,给开发板上电,可以看到串口的输出信息:
Hello world!
此时一个简单的裸机程序就执行起来了。
4.优化调试手段
上述过程已经搭建完成环境,并且可以看到串口输出信息了。但是由于每次编译固件后,需要将固件放到sd卡中去执行,这样操作比较的繁琐,不适合学习嵌入式开发。所以可以通过树莓派的uboot自动去tftp服务器中获取代码。具体的步骤如下:
4.1 修改sd卡文件中的config.txt文件
将config.txt中的文件改为如下:
enable_uart=1
arm_64bit=0
kernel_addr=0x8000
kernel=u-boot32.bin
core_freq=250
其实就是将kernel=kernel7.img
改为kernel=u-boot32.bin
。直接启动uboot。
4.2 修改网络环境
如果要开发板从tftp服务器上获取代码,可以将开发板设置的与pc机服务器在同一网段内。将网线插上路由器,开发板可以通过dhcp获取ip地址。
U-Boot 2020.07-rc1-g627e7ce (May 11 2020 - 19:26:54 +0800)
DRAM: 1.1 GiB
RPI 4 Model B (0xb03112)
MMC: emmc2@7e340000: 0, mmcnr@7e300000: 1
Loading Environment from FAT... OK
In: serial
Out: serial
Err: serial
Net:
Warning: genet@7d580000 MAC addresses don't match:
Address in DT is dc:a6:32:95:c1:79
Address in environment is dc:a6:32:28:22:50
eth0: genet@7d580000
Hit any key to stop autoboot: 0
U-Boot>
按照如下步骤进行:
1.插上网线到路由器
2.设置环境变量
setenv bootcmd "dhcp 0x00200000 192.168.12.137:kernel7.img;dcache flush;go 0x00200000"
saveenv
需要注意的是192.168.12.137
为自己的电脑的ip地址。
3.电脑开启TFTP服务器
注意:
如果是开发板直连电脑的网线,这样设置是无效的,因为pc机上一般不支持dhcp服务器。必须设置静态ip地址。
然后开发板也需要给定一个ip地址。可以设置一个环境如下:
setenv ipaddr 10.1.1.100
saveenv
reset
其中10.1.1.100是开发板的ip地址,与服务器是在同一网段。
setenv bootcmd "tftp 0x00200000 10.1.1.88:kernel7.img;dcache flush;go 0x00200000"
saveenv
4.3 修改代码的链接地址
由于uboot的启动地址与裸机代码的地址不应该在一个地方,uboot的启动地址为0x8000,而裸机代码的地址现改为0x200000。
将该地址进行设置即可。
重新编译代码,开发板上电即可。可以看到串口打印出如下的信息。
这样每次开发板上电后,都会从tftp服务器上去获取代码执行。如果此时给树莓派的供电线加上一个电源开关,这样这样就能够非常方便高效的调试代码了。
5.小结
本文主要介绍树莓派裸机开发的步骤。嵌入式开发过程中,环境搭建往往十分的重要,一个好的开发环境,一个高效的验证思路可以大大的节省开发时间。所以说,工欲善其事、必先利其器。想要学好嵌入式开发,学会利用各种工作,让自己的工作效率加倍十分的重要。通过上述的文章描述,嵌入式的前期的基本环境可以搭建好,同时也可以理解系统的启动过程。我觉得,万事开头难,只有迈出了第一步,其实写起代码也就没什么太大的难度了。
- END -本文分享自微信公众号 - 嵌入式IoT(Embeded_IoT)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。