内容简介

树莓派单板机(Raspberry Pi Single Computer)是一种极了不起的产品,用户可以以非常低的成本获得一个Linux环境并带GPIO硬件扩展的迷你计算机系统。新一代树莓派4B还提供了良好的工业物联网和AIoT支持。树莓派单板机拥有完整的生态链,软硬件资源丰富,是嵌入式系统开发和智能硬件产品创新的很好选择。
作为嵌入式系统与智能硬件开发基础中的基础,汇编语言是许多从事信息科学和工程领域的技术人员应该掌握的一项基本技能。目前,市场上针对树莓派单板机系统介绍C、Scratch、Python等编程语言与实践方面的资源很多,但鲜有系统针对树莓派单板机ARM汇编语言编程方面的介绍。这里以袁志勇主编的《嵌入式系统原理与应用技术》(北京航空航天大学出版社2019年1月第3版)一书中ARM汇编语言编程知识为基础,采用树莓派单板机及Linux操作系统验证平台,较系统地介绍树莓派ARM汇编语言编程技术与示例。由于准备仓促,不妥之处,还请各位不吝赐教。

第1讲:树莓派ARM汇编语言实验平台及基本的ARM汇编程序示例

一、树莓派ARM汇编语言实验平台简介

树莓派ARM汇编语言实验平台可以有以下两种方案。

方案一是采用自带Raspbian Linux系统的树莓派单板机+USB键盘/无线键盘+HDMI接口显示器。目前市场上,主流的树莓派单板机有Raspberry Pi 3B/3B+/4B等。采用此方案,树莓派就是一台与PC机类似的迷你型Linux电脑。

方案二是可以采用PC+自带Raspbian Linux系统的树莓派单板机+WiFi无线网络环境。此时树莓派单板机不需要连接键盘及显示器。我们可以利用SSH (Secure SHell)、VCN (Virtual Network Connection)、RDP(Remote Desktop Protocol)等远程控制软件通过WiFi无线网络远程控制树莓派。

下面介绍方案二中采用Window 7/Windows10附件中的RDP远程控制树莓派的实验平台搭建方法。

1.树莓派安装RDP软件

在树莓派Linux终端安装XRDP软件,具体命令如下:

~$ sudo apt-get update

~$ sudo apt-get install xrdp

一旦软件安装完毕,树莓派就会自动启动xrdp服务。就是说,每当树莓派重启时,该服务就会自动启动。

2.PC机RDP客户端及远程连接树莓派

Windows 7及以后版本已包含用于连接树莓派的RDP客户端,它位于启动菜单的All Programs/Accessories/Remote Desktop Connection (即Windows附件中的远程桌面连接)菜单中。

启动RDP远程桌面链接客户端时,它会询问要连接到哪台计算机,此时输入所使用的树莓派的IP地址。之后,它会要求你提供平常登录树莓派所用的用户名及密码(见图1)。除非修改过所用的树莓派用户名及密码,否则默认的用户名是pi,密码是raspberry。

arm架构 树莓派3 树莓派与arm_汇编语言


图1 利用Windows远程桌面连接登录树莓派

二、基于树莓派的基本ARM汇编程序示例

1.GNU ARM汇编格式及ARM汇编工具链介绍

树莓派Linux环境下,GNU ARM汇编格式如下:

{label:} instruction {@comment}

{label:} directive {@comment}

{label:} pseudo-instruction {@comment}

其中,label指标号,instruction是指令,directive是伪操作,pseudo-instruction意思是伪指令,comment指注释。

GNU (Gnu’s Not Unix的缩写)是一个类UNIX的操作系统,由GNU计划推动,目标在于建立一个完全相容于UNIX的自由软件环境。在树莓派Linux终端进行ARM汇编语言编程,常用的GNU ARM工具链有:(1) GNU nano、vi等编辑器,它们用于对扩展名为.s的ARM汇编源程序进行编辑。(2) GNU as汇编器,它用于对汇编源程序进行汇编并生成扩展名为.o的目标代码。(3) GNU ld链接器,它用于对目标代码进行链接并生成可执行的应用程序。若需要对ARM汇编程序进行调试的话,还有可选的GNU DBG调试工具。

2.基于树莓派的基本ARM汇编程序示例

下面以两个数相加并在树莓派Linux终端显示求和结果的基本ARM汇编程序为例,说明ARM汇编程序的编辑、汇编、链接、运行及结果显示的过程。

(1)编辑ARM汇编源程序

这里使用GNU nano编辑器编辑名为add_exp.s的ARM汇编源程序。

首先在Linux终端启动GNU nano编辑器编辑名为add_exp.s的源文件(见图2)。

arm架构 树莓派3 树莓派与arm_树莓派_02


图2 启动nano编辑器编辑ARM汇编源程序文件

在nano编辑器窗口录入ARM汇编源程序,程序清单见图3所示。

arm架构 树莓派3 树莓派与arm_汇编语言_03


图3 nano编辑源程序

在图3所示的ARM汇编源程序中,.global _start伪操作用于声明全局标号_start;mov R7,#1指令的作用是将终止程序命令码1送到R7寄存器中;svc 0指令的作用是执行Linux服务调用命令终止程序,返回到Linux终端命令提示符。这里的ARM汇编程序的功能是将R0寄存器的内容与R1寄存器的内容相加,相加结果存放R0寄存器中,最终R0寄存器中的结果是16。录入完源程序后,按[Ctrl]+[O]组合键存盘,按[Ctrl]+[X]组合键退出编辑并返回Linux终端命令提示符。

(2)汇编源程序

采用GNU as汇编器对扩展名为.s的ARM汇编源程序进行汇编并生成扩展名为.o的目标代码,具体命令如下:

~$ as -o add_exp.o add_exp.s

(3)链接目标代码

采用GNU ld链接器对所生成扩展名为.o的ARM目标代码进行链接并生成可执行的ARM应用程序,具体命令如下:

~$ ld -o add_exp add_exp.o

(4)执行程序与结果显示

在Linux终端,“./”表示当前目录。执行当前目录程序文件名为add_exp的ARM应用程序命令为:

~$ ./add_exp

用nano编辑器编辑ARM汇编源程序文件、as汇编器汇编ARM汇编源程序、ld链接器链接目标文件以及执行当前目录的ARM应用程序等命令序列见图4所示。

arm架构 树莓派3 树莓派与arm_嵌入式_04


图4 基于树莓派的基本ARM汇编语言编程命令序列

为了显示程序运行的结果,一种方法是使用echo命令。在树莓派单板机Linux终端执行完ARM汇编程序并退出后,可采用echo $?命令显示最后一次更新R0寄存器的低八位十进制数值。故,执行echo $?命令后,直接在图4中显示出R0寄存器中的最终结果16。

现将源程序中的mov R0,#8语句改为mov R0,#0xFF;mov R1,#8语句改为mov R1,#2。修改后的ARM源程序及命令序列见图5所示。从图5可以看出,程序运行后时,R0寄存器的实际结果应为0x101,但由于echo $?命令不能完整显示此结果,只能显示R0寄存器的低8位,故显示结果为1。

arm架构 树莓派3 树莓派与arm_源程序_05


图5 修改的ARM源程序及命令序列

这里的树莓派基本ARM汇编程序示例,在Raspberry Pi 3B的Linux终端上运行通过。

End of This Lecture.