• 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)。
    如有侵权,请联系 support@oschina.cn 删除。
    本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

    09-12 20:39