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

2023-05-16

写在前面

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

1. 实验目的和要求

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

2. 实验方案设计

 本实验为嵌入式虚拟环境的搭建和LED多灯闪烁,主要是为熟悉嵌入式系统的基本编写、烧录、调试等基本操作。为明晰本实验的基本步骤,绘制实验步骤流程图如图2.1所示。
在这里插入图片描述

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

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

3.1. 虚拟环境搭建

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

图3.1 虚拟机界面

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

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

在这里插入图片描述

图3.3 硬件设备兼容性配置

 本课程中,Linux系统无需特殊的硬件设备,使用默认的Vmware硬件兼容性配置即可,点击下一步,如图3.4所示。
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

3.2. 网络环境配置

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

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

4. 嵌入式系统程序设计

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

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

在这里插入图片描述

图4.1 汇编语言点灯程序

在这里插入图片描述

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

在这里插入图片描述

图4.3 寄存器名称更改实验

在这里插入图片描述

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

4.2. 多灯闪烁

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

图4.9 多灯亮灯时刻

在这里插入图片描述

图4.10 多灯灭灯时刻

5. 实验总结与讨论

5.1. 实验完成状况

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

5.2. 心得体会

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM裸机开发——Linux环境搭建和LED灯闪烁实验 的相关文章

  • django框架初体验 --- 返回静态页面

    django框架初体验 返回静态页面 效果图 xff1a 1 在templates中新建html xff1a span class token doctype span class token punctuation lt span spa
  • django框架初体验 --- 返回动态页面

    django框架初体验 返回动态页面 效果图 xff1a 1 在templates中新建music html xff1a span class token doctype span class token punctuation lt sp
  • Linux系统下etc/profile文件配置多个环境变量

    小白也能懂的Linux系统下etc profile文件配置多个环境变量操作 1 su root进入管理员操作 2 vi etc profile 3 找到export path xff1b 按 i 在下面输入环境变量信息 xff08 一定要输
  • 如何查询电脑本机出厂序列号

    WIN 43 R 快捷键输入 cmd 回车 xff0c 输入 wmic bios get serialnumber 回车 xff0c 可以查看产品序列号Serial Number
  • C++变长参数解包与std::tuple的遍历输出

    介绍几种常用的变长参数解包的方法 xff1a 递归解包 span class token keyword template span span class token operator lt span span class token ke
  • docker-compose的安装及使用

    1 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具 通过 Compose xff0c 您可以使用 YML 文件来配置应用程序需要的所有服务 然后 xff0c 使用一个命令 xff0c 就可以从 YML 文件配置中
  • copilot插件使用介绍

    copilot xff08 副驾驶 xff09 是OpenAI和GitHub联合构建的一个基于AI的编程辅助工具 官网地址 xff1a https copilot github com 利用网络中的数十亿行公共代码 xff08 尤其是开源在
  • SQL的分组查询

    一 在SQL中Group By从字面的意思上理解就是根据 By 指定的规则对数据进行分组 xff0c 所谓的分组就是将一个 数据集 划分成若干个 小区域 xff0c 然后针对若干个 小区域 进行数据处理 在此语法中group by子句为列中
  • windows环境下安装配置hadoop

    xff08 需要提前安装好JDK xff0c 否则会出错 xff09 1 进入 https archive apache org dist hadoop 下载所需要的hadoop版本 xff08 演示 xff1a hadoop 2 9 1
  • Idea 2021.1启动提示 找不到com/intellij/idea/main

    Idea 2021 1启动提示 找不到com intellij idea main 背景 xff1a 问题描述 xff1a 原因分析 xff1a 解决方案 xff1a 简单的说就是一句话安装JDK11 并配置环境变量IDEA JDK 64指
  • 线性表的顺序表示及其基本函数操作

    线性表 xff1a 线性表是零个或多个数据元素构成的线性序列 xff0c 可以记为a0 a1 a2 an 1 注 xff1a n表示的是线性表的长度 xff0c 当n 61 0的时候并不是表示线性表不存在 xff0c 而是表示表为空 相关概
  • 无计算机基础一文看懂炉石脚本(炉石兄弟)配置多开使用流程-修订版

    为了更多人能够减少重复劳动的无意义游戏时间 xff0c 把更多时间用在享受生活上 xff0c 我为大家写一个炉石兄弟的使用流程 本文将尽量为没有基础或经验的小白提供一个完整的炉石传说挂机方案 xff0c 能多开 xff0c win amp
  • 树莓派3B 底层io驱动开发(实现火灾警报器)

    树莓派3B 底层io驱动开发 xff08 实现火灾警报器 xff09 编写驱动代码前的必要准备工作BCM2835芯片手册部分的简单解读GPIO寄存器一览 xff08 位于手册的90 91页 xff09 注意 xff1a 芯片手册左边列表所列
  • “有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt --fix-broken install”(也可以指定一个解决办法)“的问题解决

    1 出现错误的命令 xff1a sudo apt get install dpkg 2 出现的错误信息 xff1a 您可能需要运行 apt get f install 来纠正下列错误 xff1a 下列软件包有未满足的依赖关系 xff1a c
  • Pytorch安装(Windows + Python环境)

    目录 下载地址版本选择可能的报错和解决方法检查是否安装成功参考 下载地址 pytorch 的安装可以直接查看官网教程 xff0c 如下图所示 官网地址 xff1a Pytorch官网 版本选择 Package xff1a 这里推荐采用 Co
  • 超简单地输出所有水仙花数(Java实现)

    今天打算将以前简单又基础的练习题拿出来分享以下 xff0c 虽然很简单 xff0c 但也很适合刚入门的小白练练手 xff0c 熟悉熟悉以下 x1f431 x1f3cd 开场还是得简单以下水仙花数是一种什么样的数 水仙花数 xff1a 水仙花
  • YBTOJ通讯问题(强连通分量)

    YBTOJ通讯问题 xff08 强连通分量 xff09 思路 xff1a 以上纯属水博客 有强连通分量这个算法提示 xff0c 思路应该不难想 但是有一个小细节 我们枚举入边的时候要缩点之后反向建图 xff0c 然后枚举出边 我没建反图调了
  • 基于51单片机的倒计时系统

    具体实现功能 系统由STC89C52单片机 43 按键电路 43 复位电路 43 晶振电路 43 LCD1602显示模块构成 具体功能 xff1a xff08 1 xff09 六位LED显示 xff0c 从59分59秒99开始倒计时 xff
  • 并查集算法总结

    1 并查集定义 并查集是一种数据结构 xff0c 常用来描述集合 在一些应用的问题中 xff0c 需将n个不同的元素划分成一组不相交的集合 开始时 xff0c 每个元素自成一格单元素集合 xff0c 然后按一定顺序将属于同一组的元素的集合合
  • python 识别图像中的文字(数字)之python图文识别

    最近在爬一个网站 xff0c 找了数据老半天突然发现原来人家不是用数据传输过来的 xff0c 而是用png背景透明的图片传输过来的 xff0c 这把我气的不轻 不过发现了是图片就好说 xff0c 图像文字识别呗 xff0c 结果发现 xff

随机推荐