600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 嵌入式系统开发与应用——嵌入式 Linux 调试环境搭建

嵌入式系统开发与应用——嵌入式 Linux 调试环境搭建

时间:2023-02-04 06:30:48

相关推荐

嵌入式系统开发与应用——嵌入式 Linux 调试环境搭建

附录:UBoot常用命令手册

一、 实验目的

1、掌握VMware中设置共享文件夹的方法,为后续实验做准备;

2、熟悉 Linux TFTP 配置,为后续 Linux 底层开发做准备(后面会用 tftp 从宿主机传输镜像到 FS_4412开发板);

3、通过实验熟悉 Linux NFS 文件系统的配置过程,为后续 Linux 底层开发实验做准备;

4、熟悉嵌入式 Linux 交叉开发环境的搭建与使用。

二、 实验仪器设备

PC机、华清远见开发环境、FS4412 开发板。

三、 实验原理

使用 tftp 的方式下载内核,运行到开发板上;使用 nfs 方式挂载文件系统,在开发板与宿主机的Ubuntu中共享文件操作。

四、 实验内容及注意事项

1、完成VMware中设置共享文件夹;

2、通过Linux TFTP传送文件;

3、完成Linux NFS 文件系统的搭建;

4、完成Linux 交叉开发环境的搭建与使用。

五、 实验组织运行

根据本实验指导书,学生自主训练为主。

六、 实验步骤及实验报告

(一)VMware中设置共享文件夹

在VMware虚拟机中可以设置Windows与Linux系统的文件共享,以实现在本机的两个不同的系统中进行文件的交换,具体操作方式如下。

1、VMware虚拟机中正确安装好VMware Tools。因实验中所使用的华清远见开发环境中已进行了安装,故可不再安装。具体安装过程可参见网络文档。

2、先在主机创建一个文件夹,如在D盘下创建share文件夹,用于虚拟机与主机的文件共享。

3、选择"虚拟机"—>“设置”,在出现的对话框中进行如下操作:

至此完成共享文件夹的设置。

4、在Ubuntu中查看共享文件夹。共享文件夹位于/mnt/hgfs/目录下,可以用命令行状态查看,也可在桌面图形下查看。

(二)Linux 系统 TFTP 实验

TFTP(Trivial File Transfer Protocol, 简单文件传输协议)是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,常被用于开发测试使用。

TFTP 协议基于 UDP 协议,没有文件管理、用户控制功能。 TFTP 分为服务器端程序和客户端程序,在主机上通常同时配置有 TFTP 服务端和客户端。

华清远见开发环境中已经包含 tftp 服务,不必进行安装操作(安装操作可参阅相关网络介绍文章),直接进行此实验的测试部分。

1、启动tftp 服务器

华清远见Ubuntu中默认已开启了tftp 服务器,但为保险,请运行以下命令重启服务:

# service tftpd-hpa restart

注:运行此命令时请切换至root用户。

2、tftp 服务器默认的根目录为 “/tftpboot”,切换至该目录,可见其中有一test文件,显示其内容为“This is a test file”(也可自建其它内容文件)。

注:tftp 服务器的相关设置在“/etc/default/tftpd-hpa”文件中,如下图示。

3、返回至用户目录,查看其中是否有test文件,如有,则删除之。

4、执行tftp客户端程序,从tftp服务器下载文件。

注:为测试方便,下面是从本机上进行测试的。

#tftp 127.0.0.1> get test>quit

可见test文件已经从tftp服务器中下载。显示其内容,并抓图如下:

(三)Linux 系统配置 NFS实验

NFS(Network File System) 方式类似于windows中的文件共享服务,是开发板通过 NFS 挂载放在主机(PC)上的根文件系统。此时在主机在文件系统中进行的操作同步反映在开发板上;反之,在开发板上进行的操作同步反映在主机中的根文件系统上。

主机需要配置两方面内容:设置NFS服务,允许“指定的NFS用户”使用。

具体操作步骤如下:

1、配置/etc/exports

命令:vi /etc/exports

NFS 允许挂载的目录及权限在文件/etc/exports 中进行了定义。例如,我们要将/source/rootfs 目录共享出来,那么我们需要在/etc/exports 文件末尾添加如下一行:

/source/rootfs *(rw,sync,no_root_squash,no_subtree_check)

特别提示:华清远见的开发环境中,该文件12行与上面的内容基本相同,但目录为“/source/nfs/rootfs”,请务必将nfs删除!!!否则会影响后面的操作!!删除后文件如下:

其中:/source/rootfs 是要共享的目录,*代表允许所有的网络段访问,rw 是可读写权限,sync 是资料同步写入内存和硬盘,no_root_squash 是 NFS 客户端分享目录使用者的权限,如果客户端使用的是 root 用户,那么对于该共享目录而言,该客户端就具有 root 权限。

2、重启服务:

# /etc/init.d/nfs-kernel-server restart

(四)交叉开发环境搭建

所谓交叉开发是指先在一台通用 PC 上进行软件的编辑、编译与连接,然后下载到嵌入式设备中运行调试的开发过程。通用 PC 成为宿主机,嵌入式设备成为目标机。

1、配置开发环境网络

虚拟机网络方式为桥接模式,此状态下虚拟机下的操作系统和主机操作系统为平级状态。

为了调试方便,我们可以给虚拟机下的 Ubuntu 一个静态的 IP 地址。

假设我们使用的网络地址为192.168.100.x段的,本实验中给Ubuntu分配一个静态IP为192.168.100.192,配置过程如下所示。

(1)切换至root,配置虚拟机网络环境。执行命令:

#sudo –s #vim /etc/network/interfaces

(2)修改文件如下图所示。保存退出。

(3)应用网络修改:

# /etc/init.d/networking restart

如上图所示表明 IP 修改成功。使用【ifconfig】命令查看我们修改的结果。如果没有修改成功,重复上述步骤,或者重新启动虚拟机 Ubuntu 系统即可。

(4)请将使用【ifconfig】命令查看结果抓图如下:

2、配置交叉工具链

华清远见开发环境包含了 3 个版本的交叉工具链,路径在/usr/local/toolchain/下。系统已完成配置,可直接使用。

工具链的测试:在命令行输入以下命令进行测试:

# arm-linux-gcc -v

运行结果如下:

3、拷贝相关文件

复制“D:\华清远见-嵌入式实验箱\开发平台1\实验代码\2、Linux移植驱动及应用\2、Linux系统移植\实验代码\第一天\镜像”中的所有文件拷贝到共享目录 D:\share 下。通过共享目录将文件拷入Ubuntu系统。

4、将共享目录中需要下载的文件拷贝到 tftp 目录中

拷贝 u-boot-fs4412.bin、uImage、exynos4412-fs4412.dtb 文件到虚拟机 Ubuntu 下的/tftpboot 目录下。

5、解压nfs文件系统

(1)拷贝 rootfs.tar.xz 文件到虚拟机 Ubuntu 下的/source 目录下。

# cp /mnt/hgfs/share/rootfs.tar.xz /source/

(2)解压该文件。

# cd /source # tar xvf rootfs.tar.xz

6、连接开发板

注意:串口连接的是串口2。网线为实验箱自带的交叉线,连接时需将计算机上的网线拨掉。

7、设置串口调试工具

打开【D:\华清远见\开发平台1\工具软件\Windows\串口调试工具\putty.exe】文件。

(1)选择串口(Serial)连接方式:

选中第一步方框内的 Serial,再点击第二步中的 Serial,进入串口设置的对话框:

(注:串口端口的设置,如COM3,必须与系统中显示一致。下面的速度必须设为115200)

(2)点击 open 打开串口。

注:后面对开发板的命令,均在此窗口中输入。

8、启动开发板

开发板拨码开关拨至 0110,即采用EMMC方式启动,如下图所示。

(1)启动开发板,在putty窗口中显示的倒计时结束前,按任意键停止在 Uboot 处,串口终端显示图下图所示。

(2)键入命令,修改开发板环境变量(注:以下命令中,命令框内开头为【#】一般是需要在串口终端putty中对开发进行的操作,【$】一般是在虚拟机下对 Ubuntu 进行的操作,下面省略此说明。命令可以逐条复制到putty窗口中执行)。

# setenv serverip 192.168.100.192 //主机的 IP 地址,与上面设置的 Ubuntu IP 地址一致 # setenv ipaddr 192.168.100.191 //板子的 IP,不要和 Windows 或 Ubuntu 冲突 # saveenv//保存环境变量

使用【print】命令查看修改后的环境变量。

(3)使用 ping 命令尝试 ping 一下 Ubuntu 主机,如下图所示,表示网络已经联通。

# ping 192.168.100.192

注:如果显示“not alive”,请按以下步骤重新设置:

(1)禁止虚拟机中ubantu的网络连接,操作如下:

(2)重启网络

# /etc/init.d/networking restart

(3)使用【ifconfig】命令查看结果本机地址是否正确(应为192.168.100.192)。

(4)再次使用 ping 命令尝试 ping 一下 Ubuntu 主机。

# ping 192.168.100.192

9、制作 SD 卡启动盘

(1)复制文件

将“D:\华清远见-嵌入式\开发平台1\烧写镜像\SD卡启动制作工具”目录下的“sdfuse_q”拷贝到虚拟机 Ubuntu 的共享目录下。

(2)转至用户目录,将该文件夹复制到用户目录中。

命令为:cp /mnt/hgfs/share/sdfuse_q/ ~ -a

(3)进入 sdfuse_q 目录

$ cd sdfuse_q //进入 sdfuse_q 目录 $ make //执行编译命令 $ chmod 777 *.sh

(4)用读卡器将 SD 卡插入电脑,虚拟机识别到 SD 读卡器。

右键点击图标,选择【连接】:

注:也可用fdisk –l 命令查看。

(6)将 uboot 烧写到 sd 卡中

$ sudo ./mkuboot.sh /dev/sdb1 //将 uboot 烧写到 sd 卡中

(7)重新插入 SD 卡,在 SD 卡目录下创建目录 sdupdate,并将共享目录下 u-boot-fs4412.bin 拷贝到 sdupdate 目录下,这个操作在 windows 下或 Linux 下做都可以。

(8)将 SD 卡插入开发板 SD 卡槽内,拨码拨至 1000,连接开发板后,按照前节设置串口调试助手,设置完毕启动开发板。

(9)在倒计时时按任意键即可看到下图所示,即为 SD 卡启动成功。

(10)在 uboot 命令行下,执行命令:

# sdfuse flashall

(11)将拨码开关拨至 0110,重启开发板,如下图所示。

10、烧写 uboot

(1)在 uboot 命令行下,执行命令:(请将以下命令逐步复制到putty窗口执行)

# setenv serverip 192.168.100.192 //主机的 IP 地址,与前设置的 Ubuntu IP 地址一致 # setenv ipaddr 192.168.100.191 //板子的 IP,不要和 Windows 或 Ubuntu 冲突 # saveenv //保存环境变量# ping 192.168.100.192//请确保与主机联机正常# tftp 40008000 u-boot-fs4412.bin # movi write u-boot 40008000

(2)重启开发板,如下图所示。

11、设置nfs挂载方式启动

(1)修改开发板环境变量(请将以下命令逐步复制到putty窗口执行)

# setenv gatewayip 192.168.100.1 # setenv bootcmd tftp 41000000 uImage\; tftp 42000000 exynos4412-fs4412.dtb\; bootm 41000000 - 42000000 //此处和上文是一行内容,避免复制遗漏,结果参见下图# setenv bootargs root=/dev/nfs nfsroot=192.168.100.192:/source/rootfs rw ip=192.168.100.191 init=/linuxrc console=ttySAC2,115200 //此处和上文是一行内容,避免复制遗漏 #setenv fileaddr 41000000#setenv filesize 80B00# saveenv

(2)重启开发板,如下图启动,表明内核从主机的/tftpboot 处下载,文件系统为 nfs 网络文件系统,位置为主机的/source/rootfs/处。

(3)在Ubuntu中,进入/source/rootfs目录,比较其与开发板根目录中的文件,查看是否完全一致。

(4)在Ubuntu的/source/rootfs目录中,创建一个hello.c文件,用arm-linux-gcc进行编译,生成可执行文件。在开发板中运行,查看程序运行结果。

(5)在开发板中,使用“tftp 192.168.100.192 -gl test ”命令,从Ubuntu中下载文件

附录:UBoot常用命令手册

U-Boot还提供了更加详细的命令帮助,可以通过”?”显示支持的命令列表,通过help [CommandName]命令还可以查看每个命令的参数说明。

1、bootm

bootm [addr [arg …]]

- boot application image stored in memory

passing arguments ‘arg …’; when booting a Linux kernel,

‘arg’ can be the address of an initrd image

bootm命令可以引导启动存储在内存中的程序映像。这些内存包括RAM和可以永久保存的Flash。

第1个参数addr是程序映像的地址,这个程序映像必须转换成U-Boot的格式。

第2个参数对于引导Linux内核有用,通常作为U-Boot格式的RAMDISK映像存储地址;也可以是传递给Linux内核的参数(缺省情况下传递bootargs环境变量给内核)。

附加说明: 要求二进制代码为制定格式的。通常为mkimage处理过的二进制文件。起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000

2、bootp

bootp [loadAddress] [bootfilename]

bootp命令通过bootp请求,要求DHCP服务器分配IP地址,然后通过TFTP协议下载指定的文件到内存。

第1个参数是下载文件存放的内存地址。

第2个参数是要下载的文件名称,这个文件应该在开发主机上准备好。

附加说明: 通过网络启动,需要提前设置好硬件地址bdinfo打印ARM相关信息

3、cmp

cmp [.b, .w, .l] addr1 addr2 count

- compare memory

cmp命令可以比较2块内存中的内容。.b以字节为单位;.w以字为单位;.l以长字为单位。注意:cmp.b中间不能保留空格,需要连续敲入命令。

第1个参数addr1是第一块内存的起始地址。

第2个参数addr2是第二块内存的起始地址。

第3个参数count是要比较的数目,单位按照字节、字或者长字。

4、cp

cp [.b, .w, .l] source target count

- copy memory

cp命令可以在内存中复制数据块,包括对Flash的读写操作。

第1个参数source是要复制的数据块起始地址。

第2个参数target是数据块要复制到的地址。这个地址如果在Flash中,那么会直接调用写Flash的函数操作。所以U-Boot写Flash就使用这个命令,当然需要先把对应Flash区域擦净。

第3个参数count是要复制的数目,根据cp.b cp.w cp.l分别以字节、字、长字为单位。

5、crc32

crc32 address count [addr]

- compute CRC32 checksum [save at addr]

crc32命令可以计算存储数据的校验和。

第1个参数address是需要校验的数据起始地址。

第2个参数count是要校验的数据字节数。

第3个参数addr用来指定保存结果的地址。

6、echo

echo [args…]

- echo args to console; c suppresses newline

echo命令回显参数。

用法:echo $( bootcmd)

7、erase

erase start end

- erase FLASH from addr ‘start’ to addr ‘end’

erase N:SF[-SL]

- erase sectors SF-SL in FLASH bank # N

erase bank N

- erase FLASH bank # N

erase all

- erase all FLASH banks

erase命令可以擦Flash。

参数必须指定Flash擦除的范围。

按照起始地址和结束地址,start必须是擦除块的起始地址;end必须是擦除末尾块的结束地址。这种方式最常用。举例说明:擦除0x20000 – 0x3ffff区域命令为erase 20000 3ffff。

按照组和扇区,N表示Flash的组号,SF表示擦除起始扇区号,SL表示擦除结束扇区号。另外,还可以擦除整个组,擦除组号为N的整个Flash组。擦除全部Flash只要给出一个all的参数即可。

用法:

写入数据之前必须先执行该命令

用法: erase 0xc******* +0xYYYYYYYY

说明: 擦除从0xc******* 开始的0xYYYYYYYY字节(字节必须块对齐)

例:

Z228 # erase 0xc4040000 +0x180000

… done

Erased 24 sectors

附加: erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)

h. cp.b

拷贝数据,从指定源地址到目标地址,地址可以是ram,也可以是nor flash

用法: cp.b 0x******** 0x######## 0xYYYYYYYY

说明: 拷贝源0x********到目标0x########,共拷贝0xYYYYYYY字节

例:

Z228 # cp.b 0x200000 0xc4040000 0x180000

Copy to Flash… done

8、flinfo

flinfo

- print information for all FLASH memory banks

flinfo N

- print information for FLASH memory bank # N

flinfo命令打印全部Flash组的信息,也可以只打印其中某个组。一般嵌入式系统的Flash只有一个组。

9、go

go addr [arg …]

- start application at address ‘addr’

passing ‘arg’ as arguments

go命令可以执行应用程序。

第1个参数是要执行程序的入口地址。

第2个可选参数是传递给程序的参数,可以不用。

10、iminfo

iminfo addr [addr …]

- print header information for application image starting at

address ‘addr’ in memory; this includes verification of the

image contents (magic number, header and payload checksums)

iminfo可以打印程序映像的开头信息,包含了映像内容的校验(序列号、头和校验和)。

第1个参数指定映像的起始地址。

可选的参数是指定更多的映像地址。

11、loadb

loadb [ off ] [ baud ]

- load binary file over serial line with offset ‘off’ and baudrate ‘baud’

dKNLinux联盟loadb命令可以通过串口Kermit协议下载二进制数据。

12、loads

loads [ off ]

- load S-Record file over serial line with offset ‘off’

loads命令可以通过串口线下载S-Record格式文件。

13、mw

mw [.b, .w, .l] address value [count]

- write memory

dKNLinux联盟mw命令可以按照字节、字、长字写内存,.b .w .l的用法与cp命令相同。

第1个参数address是要写的内存地址。

第2个参数value是要写的值。

第3个可选参数count是要写单位值的数目。

用法: mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF)

14、nm

nm [.b, .w, .l] address

- memory modify, read and keep address

nm命令可以修改内存,可以按照字节、字、长字操作。

参数address是要读出并且修改的内存地址。

15、Md

显示内存区的内容。

16、Mm

读或修改内存,地址自动递增。

mm 内存地址 回车

此时进入内存查看 直接按回车 保持原内容不变,若要改变,在问号后面输入数值然后回车 按 . 此符号退出

17、nfs

nfs [loadAddress] [host ip addr:bootfilename]

nfs命令可以使用NFS网络协议通过网络启动映像。

用法:

nfs 32000000 192.168.0.2:aa.txt

把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0x32000000处。

18、printenv

printenv

- print values of all environment variables

printenv name …

- print value of environment variable ‘name’

printenv命令打印环境变量。

可以打印全部环境变量,也可以只打印参数中列出的环境变量。

19、protect

protect on start end

- protect Flash from addr ‘start’ to addr ‘end’

protect on N:SF[-SL]

- protect sectors SF-SL in Flash bank # N

protect on bank N

- protect Flash bank # N

protect on all

- protect all Flash banks

protect off start end

- make Flash from addr ‘start’ to addr ‘end’ writable

protect off N:SF[-SL]

- make sectors SF-SL writable in Flash bank # N

protect off bank N

- make Flash bank # N writable

protect off all

- make all Flash banks writable

protect命令是对Flash写保护的操作,可以使能和解除写保护。

第1个参数on代表使能写保护;off代表解除写保护。

第2、3参数是指定Flash写保护操作范围,跟擦除的方式相同。

用法:

protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护)

protect off 1:0-3取消写保护

protect off bank 1 解除/使能 第 N 块FLASH的写保护

20、rarpboot

rarpboot [loadAddress] [bootfilename]

rarboot命令可以使用TFTP协议通过网络启动映像。也就是把指定的文件下载到指定地址,然后执行。

第1个参数是映像文件下载到的内存地址。

第2个参数是要下载执行的映像文件。

21、run

run var […]

- run the commands in the environment variable(s) ‘var’

run命令可以执行环境变量中的命令,后面参数可以跟几个环境变量名。

用法:

Uboot> setenv flashit tftp 20000000 mycode.bin; erase 10020000 1002FFFF;

cp.b 20000000 10020000 8000

Uboot> saveenv

Uboot> run flashit

22、setenv

setenv name value …

- set environment variable ‘name’ to ‘value …’

setenv name

- delete environment variable ‘name’

setenv命令可以设置环境变量。

第1个参数是环境变量的名称。

第2个参数是要设置的值,如果没有第2个参数,表示删除这个环境变量。

用法:

Uboot> setenv myboard AT91RM9200DK

Uboot> printenv

baudrate=115200

ipaddr=192.168.1.1

ethaddr=12:34:56:78:9A:BC

serverip=192.168.1.5

myboard=AT91RM9200DK

Environment size: 102/8188 bytes

23、Saveenv

保存环境变量

命令将当前定义的所有的变量及其值存入flash中。用来存储变量及其值的空间只有8k字节,应不要超过。

24、sleep

sleep N

- delay execution for N seconds (N isdecimal!!!)

sleep命令可以延迟N秒钟执行,N为十进制数。

25、tftpboot

tftpboot [loadAddress] [bootfilename]

tftpboot命令可以使用TFTP协议通过网络下载文件。按照二进制文件格式下载。另外使用这个命令,必须配置好相关的环境变量。例如serverip和ipaddr。

第1个参数loadAddress是下载到的内存地址。

第2个参数是要下载的文件名称,必须放在TFTP服务器相应的目录下。

26、ping

注:只能开发板PING别的机器

27、usb

usb start: 起动usb 功能

usb info: 列出设备

usb scan: 扫描usb storage(u 盘)设备

28、kgo

起动没有压缩的linux内核

kgo 32000000

29、fatls

列出DOS FAT文件系统

fatls usb 0列出第一块U盘中的文件

30、fatload

读入FAT中的一个文件

fatload usb 0:0 32000000 aa.txt 把USB中的aa.txt 读到物理内存0x32000000处!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。