2019-2020-1 20175307 20175308 20175319 实验一 开发环境的熟悉
小组成员
20175307高士淳
20175308杨元
20175319江野
实验步骤
一.交叉编译环境(使用自己笔记本电脑)
- 实验要求
- 可以使用自己的笔记本,也可以使用实验室台式机。(使用实验室机器的不用做本题)
- 安装老师提供的software目录中的
VMware-workstation-full-10.0.1-1379776.exe
- 解压老师提供的software目录中的
Ubuntu1204.rar
- 用VMWare打开Ubuntu,用户名:linux,口令:1
- 建立实验目录
mkdir linux_组员1学号_组员2学号_组员3学号
- 在实验目录中编写
hello word
程序,另外补充几行打印所有组员的学号姓名 - 参考bocsd目录中的脚本
armc.sh
, 分别用gcc和交叉编译器arm-none-linux-gnuenbi-gcc编译hello.c,
用gcc编译的可执行文件命名linuxhello:gcc hello.c -o linuxhello
;
用arm-none-linux-gnuenbi-gcc编译的命名为armhello:/usr/local/toolchain/toolchain-4.3.2/bin/arm-none-linux-gnuenbi-gcc hello.c -o armhello
- 分别运行linuxhello,armhello,有什么结果?提交截图并用file命令分析原因。
- 步骤
- 下载安装老师提供的
VMware-workstation-full-10.0.1-1379776.exe
后,发现由于版本过老无法启动,便从官网下载Vmware15 Pro进行实验。 - 解压老师提供的
Ubuntu1204.rar
并用Vmware打开 - 建立一个实验目录
linux_20175307_20175308_20175319
并在目录中编写一个包括所有组员学号姓名的程序hello.c
:
#include <stdio.h> int main(){ printf("hello world! "); printf("20175307gsc "); printf("20175308yy "); printf("20175319jy "); }
- 用gcc和交叉编译器分别编译
hello.c
,得到可执行文件linuxhello和armhello。再分别运行这两个文件查看结果。
- 通过
file
命令分析可知:linuxhello为64位文件,armhello为32位文件,而通过命令getconf LONG_BIT
可知linux系统是64位,所以可以执行linuxhello,无法执行armhello。
- 下载安装老师提供的
二.目标机宿主机联通
- 实验要求
- 使用实验室机器不用安装软件,桌面上有相应图标
- 使用自己笔记本电脑的,解压超级终端软件
windows7st(Windows).rar
,并在桌面上建立快捷方式(这个不用在实验室做) - 使用自己笔记本电脑的,到实验室把“USB转串口线”的USB口插入自己的电脑,把串口连到实验箱的COM0
- 参考视频配置超级终端,用超级终端作为实验箱的显示终端
- 用
ifconfig
在超级终端中查看实验箱IP(目标机),在Ubuntu中(宿主机)中用ifconfig在命令行查看IP - 用网线连接实验室台式机(或自己笔记本电脑)和ARM实验箱的网口NET1(最大屏旁边的)
- 用
ping
命令保证目标机和宿主机能互相ping通,提交ping通的截图
- 步骤
- 解压超级终端软件
windows7st(Windows).rar
,并用Vmware打开。 - 接通实验箱电源,用USB线和网线连接自己的电脑和实验箱,其中串口连到实验箱的COM0,网线连到实验箱的网口NET1。
- 点击超级终端,新建连接,命名为“exp1”,“连接时使用”选择COM3,属性中波特率为115200,其他为默认值。
- 重新启动实验箱,进行log in(登录),登录名输入root
- 在超级终端输入
ifconfig
中查看实验箱IP(目标机),为192.168.0.232
- 在Ubuntu中(宿主机)中打开终端输入
ifconfig
查看IP,为192.168.0.230
- 用ping命令保证目标机和宿主机能互相ping通,需要注意以下几点:
- 关闭防火墙
- win7虚拟机启用本地连接
- 点击虚拟网络编辑器,将VMnet0改为桥接模式,桥接到本地连接Realtek PCIe FE Family Controller,不选择自动, 因为可能会桥接到无线网上。
- 将主机、虚拟机、开发板的IP地址设为同一网段
- 关闭防火墙
- 虚拟机之间ping通
- 宿主机ping目标机
- 目标机ping宿主机
- 解压超级终端软件
三.目标机运行程序
- 实验要求
- 学习资源中第五周的“ARM实验箱实验指导书”的第二章,理解tftp和nfs的作用
- 在超级终端中用
mkdir /arm_组员1学号_组员2学号_组员3学号
建立实验箱中程序运行目录arm_组员1学号_组员2学号_组员3学号
- 在超级终端中运行
mount -t nfs -o nolock 宿主机IP:/home/linux/linux_组员1学号_组员2学号_组员3学号 /arm_组员1学号_组员2学号_组员3学号
通过NFS把宿主机中的linux_组员1学号_组员2学号_组员3学号
映射到目标机中的/arm_组员1学号_组员2学号_组员3学号
- 超级终端中运行
cd /arm_组员1学号_组员2学号_组员3学号
- 超级终端中运行
./armhello
, 提交运行截图,并深入理解交叉编译
- 步骤
- TFTP
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,常被用于开发测试使用。
TFTP协议是简单文件传输协议,基于UDP协议,没有文件管理、用户控制功能。TFTP分为服务器端程序和客户端程序,在主机上通常同时配置有TFTP服务端和客户端。 - NFS
NFS方式是开发板通过NFS挂载放在主机(PC)上的根文件系统。此时在主机在文件系统中进行的操作同步反映在开发板上;反之,在开发板上进行的操作同步反映在主机中的根文件系统上。实际工作中,我们经常使用NFS方式挂载系统,这种方式对于系统的调试非常方便。 - 挂载共享目录
- 在Ubuntu中,终端中输入命令
sudo vim /etc/exports
配置/etc/exports
- NFS允许挂载的目录及权限,在文件/etc/exports中进行了定义。在/etc/exports文件末添加如下一行:
/home/linux_20175307_20175308_20175319 *(rw,sync,no_root_squash,no_subtree_check)
将ubuntu下建立的实验目录共享出来
各字段含义:
*:允许所有的网段访问
rw:读写权限
sync:数据同步写入内存缓冲区和硬盘
no_root_squash:nfs客户端共享目录使用者权限
no_subtree_check:不检查父目录的权限 - 保存退出,重启nfs服务器
sudo /etc/init.d/nfs-kernel-server restart
- 在Ubuntu中,终端中输入命令
- 在超级终端建立目录
mkdir /arm_20175307_20175308_20175319
- 在超级终端通过NFS把宿主机中的程序运行目录映射到目标机中
mount -t nfs -o nolock 192.168.0.230:/home/linux/linux_20175307_20175308_20175319 /arm_20175307_20175308_20175319
- 在超级终端进入目录
cd /arm_20175307_20175308_20175319
- 超级终端中运行程序
./armhello
- TFTP
四.目标机模块分解(选作)
- 实验要求
- 在目标机上重现“系统调用版的myod”
- 以静态库或共享库的方式在目标机上重现上周“系统调用版的myod”
- 提交超级终端中的运行截图
- 步骤
- 在Ubuntu中,目录
linux_20175307_20175308_20175319
下编写myod的代码,代码实现详见组员20175308杨元的博客Myod C语言实现 - 在Unbuntu使用gcc编译后运行
gcc -I../include *.c -o ../bin/myod
cd bin
./myod ../test.txt
,可检验代码功能实现正常。
- 在Unbuntu使用arm-none-linux-gnuenbi-gcc编译生成armmyod
/usr/local/toolchain/toolchain-4.3.2/bin/arm-none-linux-gnuenbi-gcc *.c -o armmyod
- 挂载共享目录,通过NFS把宿主机中的程序运行目录映射到目标机中,操作同步骤三
- 在超级终端进入目录
cd /arm0_20175307_20175308_20175319/myod1
- 在超级终端运行armmyod
./armmyod test.txt
得出结果
- 在Ubuntu中,目录
实验中的问题及解决过程
- 1.目标机和宿主机无法互相ping通
解决方案:见实验步骤2
新学到的知识点
- 交叉编译
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单来说,就是在一个平台上生成另一个平台上的可执行代码。 - 宿主机与目标机
宿主机是执行编译、链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。
- NFS
NFS方式是开发板通过NFS挂载放在主机(PC)上的根文件系统。此时在主机在文件系统中进行的操作同步反映在开发板上;反之,在开发板上进行的操作同步反映在主机中的根文件系统上。实际工作中,我们经常使用NFS方式挂载系统,这种方式对于系统的调试非常方便。 - 超级终端
超级终端是一个通用的串行交互软件,很多嵌入式应用的系统有与之交换的相应程序,通过这些程序,可以通过超级终端与嵌入式系统交互,使超级终端成为嵌入式系统的显示器。 - file命令
语法:file [-bcLvz][-f <名称文件>][-m <魔法数字文件>...][文件或目录...]
参数:- -b 列出辨识结果时,不显示文件名称。
- -c 详细显示指令执行过程,便于排错或分析程序执行的情形。
- -f<名称文件> 指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。
- -L 直接显示符号连接所指向的文件的类别。
- -m<魔法数字文件> 指定魔法数字文件。
- -v 显示版本信息。
- -z 尝试去解读压缩文件的内容。
- [文件或目录...] 要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。