ARM裸机开发——Linux环境搭建和LED灯闪烁实验

写在前面

 本文为学校开展的嵌入式系统设计课程,本文主要是记录课程中的相关作业与学习记录,本课程采用了S3C2440A嵌入式系统开发板,由于主要以学校开展课程为主,本文内容可能有一定的课程资料辅助以及相关的课程要求,无法全面细致地介绍嵌入式系统开发过程,相应的课程资料与开发板介绍,笔者考虑在后续的文章中,对于本课程文章进行整体的总结与归纳,同时介绍开发板的相关资料。
 同时受限于笔者水平,文章中都是初学者对于嵌入式系统的摸索与理解,整体上有诸多不足,希望能得到指点。且由于本文是以Word编辑器起笔,在转换到markdown编辑器后,图片有所失真,导致部分图片有所不清,在后续的文章中将对此问题有所改进。

1. 实验目的和要求

  1. LINUX虚拟环境的搭建,熟悉虚拟环境的建立过程和Linux环境下的常用命令;
  2. 学会Windows和Linux两个环境下文件相互传递,熟悉虚拟机与主机之间的网络通讯;
  3. 编写多灯闪烁的C语言程序,编写交叉编译文件Makefile,了解交叉编译原理和基本实现;
  4. 了解并熟悉嵌入式系统调试程序方法。
  5. 对比C语言与汇编语言之间的区别与优劣。

2. 实验方案设计

 本实验为嵌入式虚拟环境的搭建和LED多灯闪烁,主要是为熟悉嵌入式系统的基本编写、烧录、调试等基本操作。为明晰本实验的基本步骤,绘制实验步骤流程图如图2.1所示。
ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第1张图片

图2.1 实验步骤方案设计图
 如图2.1所示,本实验报告将分为虚拟环境搭建与网络环境配置、嵌入式系统程序设计、实机程序实现与调试三部分阐述。

3. 虚拟环境搭建与网络环境配置

3.1. 虚拟环境搭建

 由于Linux系统的开源性以及安全性,使得Linux系统更加适合嵌入式系统开发,但是用户PC机基本以Windows通用操作系统为主,为方便开发和使用,实现一机两系统的运用,利用虚拟机实现系统的虚拟环境实现,本实验中将以Vmware作为虚拟环境工作载体。
 在课程文件夹JZ2440中,选择Vmware进行安装,安装成功界面如图3.1所示。
ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第2张图片

图3.1 虚拟机界面

 由于安装Ubuntu操作系统过程繁琐,且需要一定操作系统知识,课程文件夹提供了虚拟操作系统的整装文件,在JZ2440/Ubuntu/中,只需在虚拟机菜单栏文件选项中,选择打开文件,打开Ubuntu.vmx即可。该方法操作简便,本报告不再详述。下面,记录Ubuntu常规的搭建过程。
 首先,在Ubuntu官网上下载对应版本的Ubuntu系统光盘文件(.iso文件),其中Ubuntu桌面版本通常为免费开源版本,企业版本可能需要收取一定费用。下载完成后,在Vmware菜单栏文件中选择新建虚拟机,如图3.2所示。
ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第3张图片

图3.2 新建虚拟机向导
 为完整阐述Linux系统的搭建过程,可以选择自定义操作系统环境,以配置操作系统适用的硬件和软件接口。在搭建之前,了解操作系统主要是文件管理系统、软件进程管理系统、硬盘存储管理系统和设备接口管理系统,在安装Linux系统的过程中文件管理和进程管理无需配置,但需要人为配置硬盘存储空间、硬盘空间分配和外部硬件设备。为深入了解操作系统规则,选择自定义,点击下一步,如图3.3所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第4张图片

图3.3 硬件设备兼容性配置

 本课程中,Linux系统无需特殊的硬件设备,使用默认的Vmware硬件兼容性配置即可,点击下一步,如图3.4所示。
ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第5张图片

图3.4选择操作系统文件
 选择“安装程序光盘映像文件”,点击浏览,选择此前下载的Ubuntu系统光盘文件即可。点击下一步,如图3.5所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第6张图片

图3.5 Linux用户设置
 设置用户名和密码,用于Ubuntu系统登陆,点击下一步,如图3.6所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第7张图片

图3.6 设置虚拟机名称
 设置虚拟机名称,以区分日后多个不同的虚拟机,点击下一步,如图3.7所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第8张图片

图3.7 虚拟机处理器配置
 配置虚拟机处理器,需要按照用户个人电脑配置,虚拟机使用需要占用用户个人电脑的处理器,虚拟机分配的处理器越多,虚拟机的性能越佳,但是会更加抢占用户个人电脑的主系统进程,所以在无特殊要求的情况下,默认处理器数量即可,点击下一步,如图3.8所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第9张图片

图3.8 虚拟机内存配置
 与处理器配置相同,内存配置也需结合用户个人电脑配置而言,但需要注意在PC机运行Linux系统通常需要满足最低推荐内存,以避免进程卡死的情况。但是如果在嵌入式硬件中移植Linux系统,可以考虑减少Linux系统的部分功能,以降低Linux所需内存。点击下一步,如图3.9所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第10张图片

图3.9 网络类型配置
 网络环境配置将在本报告后续的网络环境配置详细阐述,在此无需改变,点击下一步即可,后续主要为磁盘类型配置和空间配置,对本课程影响不大,均选择默认,下一步即可,至图3.10所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第11张图片

图3.10 虚拟机创建完成界面
 至此完成了虚拟机Ubuntu系统的创建,点击创建好的虚拟机,运行即可。

3.2. 网络环境配置

 由于习惯在主系统中进行程序编写以及烧录,但是编译需要在虚拟机中完成,为此需要实现虚拟机和主系统的文件通信。
 网络通信,通常为服务器连接多个用户机,为了区分不同的用户机连接,避免冲突的问题,需要给每个用户机配置一个地址,该地址即为ip地址。不同的网络配置,往往是进行ip地址的配置,以及网络连接方式的选择。在图3.9中,我们可以看到虚拟机的网络配置有3种类型。

  1. 使用桥接网络。即直接将虚拟机中的虚拟网卡以用户电脑中的物理网卡作为桥梁,进行上网,相当于虚拟出一个网卡进行上网,与主机互不干扰,相当于两个用户机。该类方法的前提条件为网段ip地址充足且不受限制。
  2. 使用网络地址转换(NAT)。该方法,是将虚拟机与主机共用同一ip地址,即共享网络资源,如果主机无法联网,虚拟机自然无法联网。
  3. 仅主机模式。该种方式,虚拟机无法连接公网,只能与主机进行通信。

 通过上述3种网络类型的描述,我们需要主机和虚拟机的文件通信,就不能使用第二种网络配置,该类配置是将主机和虚拟机视为同一个设备,自然无法实现设备间通信。而第三种通信方式,虚拟机无法联网,对于后续的学习,以及系统的扩展有诸多不便。为此选择第一种网络配置上网,具体设置方式如下。
 在关闭所有虚拟机的前提下,选择菜单栏的编辑中“虚拟网络编辑器”,如图3.11所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第12张图片

图3.11 虚拟网络编辑器
 在图3.11中选择更改设置以赋予管理员特权,如图3.12所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第13张图片

图3.12 管理员权限的网络编辑器
 将VMnet0更改为桥接模式,外部连接可以选择自动,也可以根据主机的网络适配器进行选择。  配置好虚拟机网络配置后,启动Ubuntu系统尝试与外网IP互相ping,如果ping成功即可认为虚拟机的网络配置完成,如图3.13所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第14张图片

图3.13 与主机实现网络通信
 在配置好虚拟机与主机的网络通信后,需要配置文件通信,采用了开源免费FileZilla软件以及FTP协议方式。  需要在ubuntu系统中安装FTP服务,具体安装教程见jz2440开发板开发手册,在此不再赘述。

4. 嵌入式系统程序设计

4.1. 汇编语言与C语言对比

 汇编语言与C语言相比,汇编语言精确、高效,但是汇编语言的可读性与移植性不高,各个厂家之间的单片机汇编指令不同,导致不同的汇编程序无法共用,下面将以点灯程序为例对比二者程序区别,如图4.1和4.2所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第15张图片

图4.1 汇编语言点灯程序

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第16张图片

图4.2 C语言点灯程序
 可以从上图清晰地看出,C语言的可读性以及表达逻辑性高于汇编语言,由JZ2440的数据手册和原理图可知,若要使得LED1点亮,即需要令GPIOF4口置低电平;如何置低电平,由数据手册可知需要配置GPIO配置寄存器,即GPxCON,使得对应管脚位成标准输出模式,然后再通过GPIO数据寄存器,给予对应位赋值。  C语言通过两个赋值语句完成了上述的步骤,与汇编语言中的部分寄存器不同,C语言中的寄存器名称如GPFCON,代表只是对应寄存器的物理地址,其只是软件名称,提高可读性,换句话说如果,将寄存器名称更改,或者无需寄存器名称,也可以实现上述操作,如下图4.3将GPFCON和GPFDAT更改位FCON和FDAT,以验证实验效果,效果图如图4.4.

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第17张图片

图4.3 寄存器名称更改实验

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第18张图片

图4.4 寄存器名称更改实验效果
 通过上图可以看到,符合实验预期,说明C语言寄存器名称的作用是为了增加语言的可读性与移植性,真正起作用的是寄存器本身的地址。这是C语言相较于汇编语言的优势之一,声明变量名称,地址宏定义可以有效提高程序可读性,但是也可以从这个实验看出,汇编语言更加贴近单片机的运行逻辑,更加贴切于嵌入式的本质。  回过头看,对于嵌入式而言,任何操作都是对于寄存器和存储数据的操作,在汇编语言中充分体现,数据存储指令、数据转移指令、数据间接寻址,可以看出汇编语言中只有对于数据在寄存器之间的操作,符合单片机运行逻辑,也就导致汇编语言可以更高效和精确地完成指定任务。

4.2. 多灯闪烁

 基于单片机课程的基本知识与本课程JZ2440开发板的基本了解,实现多灯闪烁,只需要添加简单的延时函数和配置好寄存器即可,具体程序如图4.5所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第19张图片

图4.5 多灯闪烁程序
 实现灯闪烁只需要使关灯时间和开灯时间大于人眼视觉分辨率即可,即避免视觉暂留现象。通过原理图图4.6可以得知LED灯管脚与单片机管脚的对应关系。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第20张图片

图4.6 LED与管脚对应关系
 所以我们若需要实现LED1、2、4的闪烁,需要配置对应位管脚的GPFCON寄存器,在给对应位数据寄存器赋值。由数据手册图4.7可以得知,对应位管脚输出模式需要利用01进行配置。对应了程序中的4-6行配置管脚输出模式。赋值方式与单灯点亮程序相同在此不再赘述。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第21张图片

图4.7 管脚寄存器配置方式
 下面将详细介绍程序的编译过程与烧录过程,根据单片机课程的基础知识,我们知道对于单片机芯片而言,实际可运行程序代码为二进制的执行文件。所以在程序的下载和烧录都需要将C语言文件转换为二进制文件后,再烧录进开发板中执行文件。  所以我们需要使用编译器将文件编译成目标格式,采用了gcc编译器,但是gcc编译器本身是采用计算机的C99标准编译,主要兼容计算机的X86架构,为了兼容ARM架构芯片,我们采用了gcc-ARM交叉编译器,这也是利用Linux系统开发的原因之一。  采用交叉编译过程,需要为编译器指定相应文件,并连接相关文件进行编译,为此需要编写Makefile文件,如图4.8所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第22张图片

图4.8 交叉编译命令
 由图可知,交叉编译大致分为三个步骤,转换为可执行文件、利用link合并文件、转换为二进制文件,程序中4-5行,将所有文件转换为统一格式,即.o文件,记录程序中入口标记、执行顺序,方便后续地合并或者执行。此时.o文件在windows系统和linux系统下的一定条件内已经可以执行。  但是转换到单片机上,需要进一步地转换为二进制文件,为此需要将多个文件合并,在文件数量不多,文件关系清晰的情况,可以按照图中第7行的方式顺序排列,进行合并。但是当文件数量较多时,我们需要采用link连接文件,将不同文件利用逻辑关系进行连接合并,如图中第8行程序。  第三步,合并为同一的文件后,即可转换为bin文件,如图中程序第10行,此时完成了全部的编译过程。  烧录过程,依照资料包中的oflash文件依照步骤烧录即可,或者可以采用串口下载的方式进行烧录,步骤较为繁琐,本课程不采用。最后的实验效果如图4.9和4.10所示。

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第23张图片

图4.9 多灯亮灯时刻

ARM裸机开发——Linux环境搭建和LED灯闪烁实验_第24张图片

图4.10 多灯灭灯时刻

5. 实验总结与讨论

5.1. 实验完成状况

 本次实验主要是注重于熟悉开发板的基本操作流程,以及开发板的基本操作。实验完成了实验要求中的所有任务,本次实验基本符合实验预期,并且在完成实验基本要求的情况下,尝试了一些不一样的任务,如流水灯实验、呼吸灯实验等。

5.2. 心得体会

 本次实验的整体难度不大,主要配置嵌入式开发环境,以及熟悉嵌入式开发流程,本次实验略微繁琐,同时受到了疫情的影响,开发甚至需要远程完成,没有办法及时地看到实验结果并进行调试,算是本次实验的主要困难。所以本次实验主要侧重了研究嵌入式开发环境的配置工作与数据手册的学习。与普通单片机相比,嵌入式系统的高性能,给开发带来了一些更加有趣的体验。

你可能感兴趣的:(嵌入式系统,linux,单片机,嵌入式硬件,c语言)