基于Linux的嵌入式虚拟实验平台的应用
——以GPIO流水灯驱动开发为例
2020-10-10刘淑影王光阳魏梨君张永华
刘淑影,王光阳,魏梨君,杨 颖,张永华
(阜阳师范大学,安徽 阜阳236037)
0 引言
目前大部分高校的计算机及其相关专业都陆续开设了嵌入式相关课程,而Linux以其开源、免费、多用户等优势已成为高校合理利用资源的最佳选择[1-3]。在VMware虚拟机上搭建嵌入式Linux开发环境有以下优势:一是方便用户的使用。目前大部分用户习惯在Window操作系统上进行日常办公,所以在Window基础之上安装VMware进而进行嵌入式开发,省去了重新装机的麻烦。二是减少了对硬件的依赖。在虚拟机上安装Linux能够减少软硬件之间的不兼容问题。三是维护方便。虚拟机环境下Linux操作系统能够更快捷地完成数据备份功能,从而达到统一管理、维护和降低维护成本的目的[4]。
本文给出一种基于Linux的嵌入式虚拟实验平台的搭建方法,通过在VMware虚拟机上安装Linux操作系统、搭建虚拟开发平台,为高校的实验教学活动增加了灵活性,对创新现代化实验教学起到推动作用。
1 嵌入式虚拟开发平台的搭建
嵌入式虚拟开发平台可以减少嵌入式开发成本,并且为嵌入式开发人员降低了入门难度。下面从三个方面介绍嵌入式虚拟开发平台的搭建。
1.1 Linux的安装
实验平台采用VMware Workstation虚拟机,其使用范围较广,很多网站都可以下载,本文使用的是10.0版本。搭建嵌入式虚拟开发环境的第一步是安装虚拟机,然后在虚拟机上安装Linux操作系统(具体镜像文件可以从网上下载或通过Linux光盘)。
使用VMware Workstation虚拟机软件VMware Tools增强工具包,可以增强虚拟机中的虚拟显卡和硬盘性能、同步虚拟机与主机文件的驱动程序,因此要在搭建的开发环境中安装VMware Tools工具包。
1.2 配置NFS
在嵌入式开发环境中安装NFS,可以实现网络中计算机通过Interent共享资源,同时也可以实现挂载系统的目的,这种方式对于系统的调试非常方便。NFS安装简单,具体步骤如下。
Step1:在Linux系统中打开命令终端,输入命令nfs-sudo apt-get install nfs-kernel-server。
Step2:新建立一个NFS专用文件夹(sudo mkdir/mnt/nfs),其中/mnt/nfs是将要共享的文件目录。打开exports文件(vi/etc/exports),在其末尾添加指令-/mnt/nfs*(rw,sync,no_root_squash,no_sub⁃tree_check),然后保存并退出。
Step3:首先通过命令restart重新启动portmap服务,再重新启动NFS服务。
Step4:将Ubuntu系统的"/mnt/nfs"目录挂在到实验箱(嵌入式Linux系统)的"/mnt"目录下面,从而实现文件的共享。
1.3 交叉开发环境搭建
建立交叉开发环境是嵌入式应用软件开发的第一步。在交叉开发环境中,在一台PC机(宿主机)上对源程序进行编辑、编译、链接之后,生成应用程序,然后将其下载到能够运行、调试该程序的目标设备中。其中宿主机是装有VM虚拟机的计算机,而目标机则一般指嵌入式设备。下面给出安装交叉编译器的步骤。
Step1:通过Linux系统终端,将交叉编译器复制到本地Ubuntu的"/usr/local/arm"目录下,如果本地没有此文件夹,则新建一个。
Step2:修改交叉编译工具中环境变量的路径。首先打开环境变量文件".bashrc"("cd/root"-"gedit.bashrc"),然后添加代码-"export PATH=$PATH:/usr/local/arm/arm-2009q3/bin"到该文件、保存、退出,最后更新环境变量("source.bashrc")。
Step3:交叉编译环境的测试。在Ubuntu终端输入"arm",通过键盘上的TAB切换到root权限,如果命令行中出现arm编译器信息,就表明交叉编译环境安装好了,测试成功,如图1所示。
图1 ARM编译器
2 GPIO流水灯驱动的开发
本文所采用的实验环境及开发流程如图2所示,在主机的Ubuntu操作系统下安装交叉编译器,对Linux内核配置make menuconfi,编译生成Linux的镜像文件boot.img。最后通过文件夹共享和USB的方式将生成的镜像文件下载到目标板,通过Uboot引导执行[5-6],图2给出了嵌入式Linux环境下的开发流程。
图2 嵌入式Linux环境下的开发流程
2.1 GPIO流水灯的工作原理
本实验选取ARM A8系统自带8位LED流水灯,使用复用的IO接口和8位数据线,通过74AHC138 3-8线译码器产生不同模块所需要的片选信号,作为74LVCH273锁存器CLK时钟信号,达到复用IO接口的目的。其电路如图3所示。
图3 流水灯工作原理
在图3所示的电路图中,将8个发光二极管LED的一端与锁存器74LVCH273的8个输出口进行连接,另一端经过一个限流电阻接地,当锁存器输出高电平使LED两端出现压降产生电流会点亮LED灯。将锁存器的控制引脚连接到ARM端的GPIOA23引脚,如果GPIOA23为低电平时,锁存器74LVCH273的8个输出口处于无效状态,GPIOA23输出高电平时锁存器的8个输出口会根据8个输入口持续输出对应高低电平,8个输入口连接ARM端的GPIOA0~A7端口。锁存器的某个输出端为高电平时,此时LED有电流通过并发光。如果当锁存器的某个输出端输出低电平时,LED就会熄灭。
2.2 GPIO流水灯驱动开发
由于驱动程序没有主函数,因此进行流水灯驱动程序设计的第一步就是进行流水灯的初始化,初始化过程中使用misc_register()函数注册设备名和驱动的接口。该接口通过cled_ioctl()函数传递cled_gpio_ctl()函数的返回值。其中cled_gpio_ctl()函数的具体操作步骤如下。
Step1:首选通过gpio_request()函数来显示配置该通用输出输出GPIO端口的pinmux,再申请GPIO端口。
Step2:标记该通用输出输出GPIO的使用方向(是输入还是输出)。
Step3:通过函数gpio_get_value()获取GPIO引脚并使用函数gpio_set_value()设置GPIO引脚的值。
Step4:使用通用输出端口的导出函数gpio_ex⁃port()将GPIO端口导出到用户空间。
2.3 程序测试
在嵌入式虚拟开发平台上将编好的GPIO流水灯驱动程序进行交叉编译。首先编辑Kconfig、makefile文件,将cled.c加入到内核编译,设置环境变量“export ARCH=arm”,然后执行make menucon⁃fig,选中继电器驱动,流水灯的选择如图4所示。
图4 流水灯的选择
编译内核,重新将内核烧写到实验箱上。设备启动后,在“/dev”目录下可查看到设备节点,如图5所示。
图5 查看设备节点
将编写好的继电器驱动程序在嵌入式虚拟开发平台上进行交叉编译,生成文件名为cled的目标文件,将此目标文件复制到/mnt/nfs目录下。
打开Putty终端,连接实验箱串口,将实验箱/mnt目录挂载到Linux系统/mnt/nfs目录下,运行程序如图6所示。
图6 试验箱挂载到Linux上
运行程序,观察试验箱下面的跑马灯开始依次点亮,如图7所示。
图7 实验运行结果
3 结语
综上所述,基于Linux的嵌入式虚拟实验平台的搭建是切实可行的。本文主要介绍了虚拟实验平台的搭建过程,然后通过嵌入式GPIO流水灯驱动的开发来证明该平台的有效性。嵌入式系统应用开发更偏重实践和应用,学生需要多动手、多写程序、多去实践操作,亲自搭建虚拟实验平台,调试程序代码,以此来增加学生提动手实践和进行嵌入式开发的机会。通过2年多的实践,证明采用基于Linux的嵌入式虚拟实验平台进行教学后学生的学习兴趣和嵌入式开发能力都有所提高[4]。