首页 理论教育 嵌入式平台基础实验-物联网实验教程

嵌入式平台基础实验-物联网实验教程

时间:2023-10-21 理论教育 版权反馈
【摘要】:图2-4 嵌入式ARM开发板实物照片Clinux对每个任务都会建立3个内部定时器。

嵌入式平台基础实验-物联网实验教程

1.实验目的

本实验主要搭建了一个基于ARM7下µClinux开发平台,并在ARM实验母板(IOT- ARMMB)上使用蜂鸣器串口实现了一个简单的演示程序。该程序通过µClinux控制蜂鸣器可以实现每隔2s鸣叫一次,并同时通过串口在控制台输出提示信息。通过该演示实验,可以使读者对开发板和µClinux有初步的了解,并掌握在ARM7上µClinux开发平台的构建和使用GNU工具链进行µClinux开发的步骤。

2.实验设备

(1)硬件

● ARM实验母板(IOT-ARMMB)1套。

传感器及外围模块(IOT-MODULES)1套。

● EasyJTAG-H编程器1个。

● PC(含串口)1台。

(2)软件

● Linux和Windows操作系统。

● H-JTAG。

● µClinux 2.4x发行包和arm-elf-gcc交叉编译环境

3.实验原理

本实验的演示程序使用了ARM实验母板(IOT-ARMMB)的基本部件,其主要外围接口丰富,可以满足物联网相关实验的全部功能,开发板的实物照片如图2-4所示。

978-7-111-34147-5-Chapter02-9.jpg

图2-4 嵌入式ARM开发板实物照片

µClinux对每个任务都会建立3个内部定时器

ITIMER_REAL:实时定时器,不管进程在何种模式下运行(甚至在进程被挂起时),它总在计数。定时到达,向进程发送SIGALRM信号

ITIMER_VIRTUAL:这个不是实时定时器,当进程在用户模式(即程序执行时)计算进程执行的时间。定时到达后向该进程发送SIGVTALRM信号。

ITIMER_PROF:进程在用户模式(即程序执行时)和核心模式(即进程调度用时)均计数。定时到达产生SIGPROF信号。ITIMER_PROF记录的时间比ITIMER_VIRTUAL多了进程调度所花的时间。

定时器在初始化时,被赋予一个初始值,随时间递减,递减至0后发出信号,同时恢复初始值。在任务中,可以使用一种或者全部3种定时器,但同一时刻同一类型的定时器只能使用一个。

在本程序中,使用了TIMER_PROF定时器,每秒产生一次定时信号,将蜂鸣器控制口取反,也就是每隔2s蜂鸣器将会鸣叫一次,并输出提示信息。在程序的主函数main()中,首先通过调用init_sigaction()对struct sigaction类型的变量act进行设置,设定信号的处理函数,完成信号的初始化;然后通过调用init_time()对struct itimerval类型的变量val进行设置,设定定时值,完成定时器的初始化;紧接着启动定时器。相关代码如下:

978-7-111-34147-5-Chapter02-10.jpg

每当定时到达就产生SIGPROF信号,触发信号处理函数led_info(intsigno),执行GPIO操作,打开P0引脚,并将蜂鸣器对应的P0.7引脚取反,相关的代码如下:

978-7-111-34147-5-Chapter02-11.jpg

978-7-111-34147-5-Chapter02-12.jpg

4.实验内容

构建ARM下的µClinux开发平台,初步掌握移植µClinux到基于ARM的嵌入式开发平台的一般步骤。

初步掌握ARM下µClinux程序设计方法和使用GNU工具链在交叉开发环境下进行µClinux开发的一般步骤,能够设计简单的程序操作开发板上的各个模块。

5.实验步骤

(1)建立交叉开发环境

由于嵌入式Linux的开发母板资源有限,不可能在开发母板上运行开发和调试工具。通常需要以交叉编译调试的方式进行,即“宿主机+目标机(开发母板)”的形式。目标机和宿主机一般采用串口连接,亦可同时通过网口连接,如图2-5所示。

宿主机是运行Linux的PC,可以是安装了Linux操作系统的本地机,也可以是Linux服务器(模型假定其IP为192.168.0.10)。宿主机和目标机的处理器通常情况下都不会相同。宿主机需要建立适合于目标机的交叉编译环境。程序在宿主机上编译-连接-定位,得到的可执行文件则在目标机运行。在开发调试过程中,通常的操作界面如图2-6所示。

978-7-111-34147-5-Chapter02-13.jpg

图2-5 嵌入式Linux应用程序调试模型

978-7-111-34147-5-Chapter02-14.jpg

图2-6 嵌入式Linux开发调试界面

在宿主机上一般需要运行两个窗口:宿主机本机操作窗口和串口终端窗口。宿主机操作窗口可以是本机的操作终端(安装Linux的本地机),也可以是Windows下通过远程登录软件(如Telnet)登录到Linux服务器的操作界面。宿主机只能编译连接程序,不能运行产生的Flat文件(GCC模式的交叉编译调试方式)。串口终端可以是Linux的Minicom,也可以是Windows的超级终端。目标机可以被看成一台计算机,串口终端就相当于这台计算机的显示器,作为人机交互界面。将在宿主机编译连接后得到的可执行文件下载到目标机上运行。

由于目标板平台处理器是ARM,因而需要在宿主机上安装GCC针对ARM的编译器。适用于µClinux的编译器为arm-elf-gcc。arm-elf-gcc安装步骤:

将光盘附带的文件arm-elf-tools-20100702.sh复制到目录(如/usr/src)下,为arm-elf- tools-20100702.sh增加可执行权限(如果已经具有可执行权限,这步可省略)。注意:增加权限必须具有root权限,若没有root权限,请先使用su命令为用户增加root权限。增加权限的命令如下:

978-7-111-34147-5-Chapter02-15.jpg

安装arm-elf-gcc。执行arm-elf-tools-20100702.sh。

978-7-111-34147-5-Chapter02-16.jpg

安装完毕,查看/usr/local/bin目录下是否存在arm-elf-gcc等文件,如果存在,基本可以确定交叉编译器安装成功。

添加交叉编译器的路径。一般情况下安装过程会自动执行,并在下次启动时仍有效。

978-7-111-34147-5-Chapter02-17.jpg

(2)安装µClinux

将光盘附带的µClinux源代码包µClinux-dist-20040408.tar.gz复制到目录(如/usr/src)下,并解压

978-7-111-34147-5-Chapter02-18.jpg

解压后,在当前目录下会多出文件夹µClinux-dist,即µClinux源代码目录。

为IOT-ARMMB开发母板和LPC2200芯片打补丁。将光盘附带的补丁文件µClinux-dist-20040408-lpc-chy-cmj.patch复制到当前目录下,并执行:

978-7-111-34147-5-Chapter02-19.jpg

为LPC2200打补丁后,在µClinux平台内核配置时将会有LPC2200的选项。

(3)配置µClinux和文件系统

新建终端(或者在控制台〈Ctrl〉+〈Alt〉+〈F1〉~〈F6〉其中之一进入6个控制台中的1个),进入μClinux源代码所在的目录(如/usr/src/µClinux-dist)。

978-7-111-34147-5-Chapter02-20.jpg

如果不是进行第一次编译,需要先清除以前编译产生的辅助文件和目标文件,以保证编译的正确性。如果是第一次编译则可省略。

978-7-111-34147-5-Chapter02-21.jpg

通过文本菜单方式配置μClinux。

978-7-111-34147-5-Chapter02-22.jpg

执行“make menuconfig”进行厂商/产品、内核版本和函数库的设置。各选项的含义以及设置如表2-1和表2-2所示。

表2-1 μClinuxVendor/Product选择设置

978-7-111-34147-5-Chapter02-23.jpg

表2-2 μClinuxKernel/Library/Defaults等的选择设置

978-7-111-34147-5-Chapter02-24.jpg

按照上述表格内容进行设置完毕之后,选择Default all Settings将此设置作为默认设置,之后选择Exit,然后在提示是否保存时选择保存。以后如果用户在配置过程中进行了不恰当的配置,导致编译出错,选择Default all Settings,即可恢复保存的设置。选择该项,为LPC2200所打的补丁信息依然保留。

建立源代码文件依赖关系(第一次必须执行):

978-7-111-34147-5-Chapter02-25.jpg

编译内核:

978-7-111-34147-5-Chapter02-26.jpg

这两步的时间都比较长。编译结束,会在μClinux安装目录下建立romfs和images两个目录。其中,romfs为romfs文件系统的临时存放目录,里面有很多实用程序;images为生成的目标代码目录,其中ronfs.img为romfs文件系统的映像文件,image.bin为文件系统和内核代码的目标文件。在linux-2.4.x目录下会有一个Linux文件,是编译好的内核文件,为.elf格式。这些文件可用于进行μClinux内核实验。至此,宿主机的交叉编译环境已经建立完成。(www.xing528.com)

制作.bin格式的内核文件linux.bin:

978-7-111-34147-5-Chapter02-27.jpg

(4)烧写BootLoader和下载µClinux内核

烧写BootLoader需要在Windows环境下通过H-JTAG软件进行。

首先,将EasyJTAG-H编程器和开发母板相连。设置跳线BANK0-Flash,BANK1- RAM。选择LPC2200_flash.hfc配置文件,然后打开H-Flasher的Programming选项,如图2-7所示。

978-7-111-34147-5-Chapter02-28.jpg

图2-7 H-Flasher烧录程序到目标地址

在Type下拉列表中选择Intel Hex Format,如果是二进制的程序,则选择对应的二进制文件选项。

接着选择程序文件,单击Src File右边的按钮“…”,找到烧录的程序文件。

接下来,单击“Erase”按钮,擦除Flash内容(Nor Flash必须在擦除后才能写入)。擦除完毕,单击“Program”按钮,等待几秒钟就可以将程序烧录到对应的地址中。

下载µClinux内核既可以在Windows环境下进行,也可以在Linux环境下进行,这里介绍在Linux环境下的下载方法。

在Linux下,打开终端(也可在控制台进行),启动minicom:

978-7-111-34147-5-Chapter02-29.jpg

选择菜单中的“SerialPortSetup”,按〈Enter〉键,进入minicom操作菜单。进入“SerialProtSetup”菜单,首先按具体硬件连接设置“SerialDevice”(如果使用串口1,则输入/dev/ttyS0,如果使用串口2,则输入/dev/ttyS1,如果使用的是USB转串口,则输入/dev/ttyUSB0);然后设置“bit/s/par/Bits”(波特率),将波特率设置为115200bit/s;最后设置“HardwareFlowControl”为“NO”。

设置完毕,按〈Enter〉键返回到串口设置主菜单,选择“Save Setup as Dfl”,按〈Enter〉键保存刚才的设置。再选择“Exit”退出设置模式。刚才的设置被保存到“/etc/minirc.dfl”。

进行正确的串口设置后,将开发母板串口0和PC串口相连,按开发母板复位键RST,将进入ICT_BOOT界面,如图2-8所示。

选择1,则使用用户IP进行FTP连接;选择2,使用默认IP(192.168.15.115)进行FTP连接;输入F,则对NAND Flash进行格式化。现在选择2,使用默认IP进行FTP连接。

978-7-111-34147-5-Chapter02-30.jpg

图2-8 ICT_BOOT启动界面

对宿主机进行网络设置,将IP设置为192.168.41.42,将子网掩码设置为255.255.0.0,将默认网关设置为192.168.0.1(具体设置可不同,只要保证与IOT-ARMMB开发板的IP在同一网段内即可)。由于接下来要使用NFS服务,所以需要将宿主机的防火墙关闭。

在Linux下,可以通过命令行图形界面进行FTP下载。使用图形界面相对直观和简单,因而在这里介绍使用gFTP软件进行下载的方法。在Linux下新建终端,输入gftp,启动gFTP软件。

978-7-111-34147-5-Chapter02-31.jpg

通过网线将开发母板接入局域网,或者通过网络交叉线直接将IOT-ARMMB开发母板和PC相连。在gFTP中进行FTP设置:在Host文本框中填入正确的IP地址,如在ICT_BOOT启动界面选择2(使用默认IP),则填入192.168.15.115,并输入端口号21。

进入光盘中存放内核和文件系统的目录,选择要下载的文件,然后单击传输按钮进行FTP上传,大约1min后,传输完毕。传送成功后的界面如图2-9所示。

下面在Linux环境下使用minicom连接开发板启动µClinux。首先将开发母板的串口0和PC相连。仍然采用上文提到的方法对minicom进行设置。设置完毕,按复位键,启动开发母板,将得到如图2-9所示的界面。

978-7-111-34147-5-Chapter02-32.jpg

图2-9 使用gFTP传输文件完成

选择3,启动µClinux,启动之后,会出现如图2-10所示的界面。

978-7-111-34147-5-Chapter02-33.jpg

图2-10 µClinux启动界面

命令提示符“/>”下输入µClinux支持的命令,即可对其进行操作。

(5)配置NFS服务

在宿主机建立共享目录“/home/armwork”,修改/etc/exports文件对NFS服务进行设置:

978-7-111-34147-5-Chapter02-34.jpg

设置共享目录为“/home/armwork”,设置允许访问IP为“192.168.*.*”,表示处于网段192.168.x.x的主机均可对共享目录“/home/armwork”进行访问,后面括号内为共享目录的权限设置,如“读/写”等,可以根据需要进行设置。最后输入如下命令重启NFS服务:

978-7-111-34147-5-Chapter02-35.jpg

接着用开发板去ping服务器:

978-7-111-34147-5-Chapter02-36.jpg

确定ping通服务器后,在开发板上输入如下命令,即可将服务器上的/home/armwork目录下的文件映射到开发板的/mnt目录下:

978-7-111-34147-5-Chapter02-37.jpg

下面来检测在开发板上是否映射成功,先在服务器上输入:

978-7-111-34147-5-Chapter02-38.jpg

然后在开发板上输入如下命令即可验证映射是否成功。

978-7-111-34147-5-Chapter02-39.jpg

978-7-111-34147-5-Chapter02-40.jpg

若最后控制台出现“this is a test file.”的字样,证明映射已经成功。

注意:在/mnt目录及其子目录下不能使用ls命令。

(6)使用GNU工具链进行开发

在实验步骤(1)~(5)中完成了交叉开发环境的建立,在开发板上完成一次之后,即可跳过,直接从本步骤开始在交叉开发环境下进行µClinux开发。

打开终端或者进入虚拟控制台,进入arm实验目录/home/armwork/,为本实验新建工作目录systimer。

978-7-111-34147-5-Chapter02-41.jpg

将源代码文件systimer.c和Makefile以及config.h文件复制到工作目录,将光盘提供的gpio文件夹复制到nfs共享目录下的header目录下。编译程序,生成可执行代码systimer。

978-7-111-34147-5-Chapter02-42.jpg

编译结果如图2-11所示。

978-7-111-34147-5-Chapter02-43.jpg

图2-11 生成可执行代码systimer

启动µClinux,进行NFS连接,进入gpio驱动目录,加载GPIO驱动。

978-7-111-34147-5-Chapter02-44.jpg

进入systimer目录,运行实验程序。

978-7-111-34147-5-Chapter02-45.jpg

每2s蜂鸣器响一次,每1s终端会打印“timeout!”信息。

6.思考题

1)µClinux文件结构下的文件都可起到什么作用?

2)在本开发套件中BootLoader都完成了什么功能,应当如何实现?

3)如何自己完成一个GPIO的驱动程序?

4)如何自己写一个Makefile文件?

7.补充阅读

[1]田泽.ARM7µClinux开发实验与实践[M].北京:北京航空航天大学出版社,2006.

[2]Getting started µClinuxwithPC22xx.http://www.cn.nxp.com/.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈