由于目标系统是Linux操作系统,因此本书所有开发过程均在Linux操作系统上完成,PC开发环境是Ubuntu/x86-64。大多数针对Linux的开发工具在Linux平台上都可以很方便地获得,而且在开发过程中,使用相同的操作系统,PC和目标平台可以比较方便地对照操作。
图1.4 树莓派4B接口
原则上说,使用Linux的任何发行版,甚至是在其他操作系统中的Linux虚拟机,本书所涉及的方法依然有效,只是不同Linux发行版的开发工具安装会有一些差别。
由于树莓派4B的处理器采用的是Cortex-A架构,使用Arm指令集,与PC的x86处理器使用的指令集完全不同。因此PC的编译工具不能直接用于开发树莓派的软件,需要另外安装一套针对Arm的编译工具。在PC上安装的这组工具被称为“交叉编译工具链”,或简称“交叉编译器”。Arm交叉编译器可以在PC上用源码编译生成,也可以通过软件仓库直接安装二进制程序。源码编译安装过程比较烦琐,如无特殊要求,可以通过包管理器安装二进制程序。Debian或Ubuntu系统可以通过下面的命令安装交叉编译工具:
# apt-get install g++-arm-linux-gnueabihf
在命令行操作中,提示符“#”表示超级用户权限,“$”表示普通用户权限。在本书中,PC端的命令用这两个不同的提示符来严格区分这两类用户。获取超级用户的权限可以通过sudo命令,也可以用su命令直接切换到超级用户。在PC上,各人有自己的使用习惯,本书对此也不再区分,仅以提示符“#”表示。而在树莓派个人应用系统上,为了提高效率,在没有特别要求的情况下,一般都以超级用户的身份操作。
依照依赖关系,包管理器会安装所有Arm架构的g++的基础包,包括Arm版本的binutils和glibc。为了简化以后的命令操作,安装后,建议到安装路径下(一般是/usr/bin)将所有带有arm-linux-gnueabihf-前缀的命令进行arm-linux-前缀的链接,命令操作如下:
# for f in $(ls arm-linux-gnueabihf-*); \ do ln -s $f $(echo $f|sed "s/gnueabihf-//"); \ done
之后在交叉编译时不需要用arm-linux-gnueabihf-gcc这么长的命令,只需输入arm-linuxgcc即可。
如果按64位Arm指令集Armv8-A编译,则需要安装aarch64-linux-gnu编译工具链:
# apt-get install g++-aarch64-linux-gnu
按类似的方法,进行一组aarch64-linux-前缀的链接。
本书以树莓派4B为研究对象。由于树莓派4B的处理器同时支持32位和64位指令集,为了更大限度地发挥系统性能,采用64位指令集,交叉编译器也使用aarch64-linux-前缀。
理论上说,也可以将编译器直接安装在树莓派系统上。构建针对目标系统的编译环境将在第5章介绍。但由于树莓派资源有限,性能也不及PC,不适宜大批量的软件编译,而且最初阶段的移植也必须在PC上编译。对于有明确应用背景的嵌入式系统来说,在目标系统上安装开发环境的意义也不大。
树莓派提供串口调试功能。在基本系统安装阶段,开发人员可以用串口调试器连接到树莓派上,用于系统监控。目前多数PC已没有专用的RS–232串口,图1.5(b)是一种USB–232的适配器(转接器),可作为调试器。在PC上,可以使用minicom或screen命令进行串口调试,这里推荐使用minicom。监控设备文件是/dev/ttyUSBx。设备文件名中的数字序号可能会有变化,可用命令dmesg检查插入的USB–232适配器生成的设备文件名,例如:
$ dmesg | tail ... [ 1930.183656 ] usbcore: registered new interface driver pl2303 [ 1930.183664 ] usbserial: USB Serial support registered for pl2303 [ 1930.183673 ] pl2303 1-5:1.0: pl2303 converter detected [ 1930.184225 ] usb 1-5: pl2303 converter now attached to ttyUSB0
不同型号的串口适配器可能会有不同的显示。当操作系统正常启动,完成网络安装配置之后,还可以使用网络方式连接树莓派。
图1.5 实验系统连接示意图
串口数据发送端标记为TxD,接收端标记为RxD。图1.5中,将调试器的TxD、RxD与树莓派的RxD(pin 10)、TxD(pin 8)对接,即一方的发送端连到对方的接收端,地线连到树莓派的GND(pin 6)。树莓派通过专门的线路供电,串口适配器的+5V不用连接。
在PC上,设备文件/dev/ttyUSBx属于dialout组。为避免minicom频繁越权操作,建议将开发者个人用户加入dialout组。可以使用如下的adduser命令(这里假设开发者用户名为user):
# adduser user dialout
也可以直接用文本编辑器编辑/etc/group文件,在dialout行上添加user用户。添加的组员权限在下一次登录后生效。
minicom的选项中包含了指定设备和参数的内容,为简化操作,首次使用minicom时,用带有-s的选项启动,以便于直接打开串口配置界面:
$ minicom -s
在串口设置功能中(serial port setup),按图1.6设置串口设备(/dev/ttyUSB0)、格式(115200 8N1,波特率115200b/s,数据位8位,无校验,1个停止位)。波特率和格式是由Bootloader和内核决定的,使用串口与其他设备连接时,这些参数应根据调试对象的要求设置。
设置好波特率、数据位、停止位、校验方式后,选择Save setup as dfl保存设置参数,再回到minicom主界面。以后再启动minicom时,如果不改变通信参数,不再需要-s选项。
图1.6 设置串口参数