本文章为我在学习I.MX6ULL ARM Linux时的记录文章,知识来源为《正点原子阿尔法 I.MX6ULL ARM Linux开发板》的视频教程和野火《i.MX Linux开发实战指南》的视频和电子书籍。
学习笔记涉及在学习过程中有关安装,使用,编程,debug的相关知识点和技巧,在一套教程学习完毕后,我将再次整理本笔记,将其中重要的坑点,知识点和一些技巧和问题解决等整理成专栏,敬请大家静待花开,谢谢!
U-Boot启动界面:(串口)
启动时3秒内按Enter进入U-Boot命令行模式。
注意:
1.ARM没有PC机中的BIOS,Uboot就类似于BIOS+系统引导程序
2.U-Boot 最重要的功能就是初始化DDR,并将linux镜像和dts设备数拷贝到内存中。
3.大多数的ARM在引导linux之前都需要U-Boot初始化DDR,但有一些ARM的bootROM(就比如I.MX6ULL)会自动初始化DDR,无需U-Boot再初始化了。
也可以直接在MakeFile中写好ARCH和CROSS_COMPILE:
1.help命令:?+命令名
例子:
? boot
2.信息查看命令:板子信息
bdinfo
3.与环境变量有关的命令:
1.setenv(重点):增,删,改环境变量信息
(注意 字符串和带空格的要加单引号把整个串括起来,单纯数字不用引号)
举例:
新增一个名为author 的环境变量,值为whstudio并保存
setenv author 'whstudio'
saveenv
删除一个名为author 的环境变量并保存(将值置为空就是删除)
setenv author
saveenv
修改一个名为author 的环境变量,值为whstudio并保存(环境变量存在就是修改)
setenv author 'whstudio'
saveenv
2.printenv(重点):查环境变量信息
举例:
查看所有环境变量:
printenv
内存操作命令(阅读说明1):
命令 | 用途 | 格式 | 举例 | 说明 |
---|---|---|---|---|
md | 显示内存值 | md[.b, .w, .l] address [# of objects] | md.b 80000000 14 | 0X80000000 开始的 20 个字节的内存值 |
nm | 修改指定地址的内存值 | nm [.b, .w, .l] address | nm.l 80000000 | 以.l 格式修改 0x80000000 地址的数据为 0x12345678(阅读说明2) |
mm | 修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增 | mm [.b, .w, .l] address | mm.l 80000000 | 以.l 格式修改 0x80000000 为起始地址的数据 |
mw | 使用一个指定的数据填充一段内存 | mw [.b, .w, .l] address value [count] | mw.l 80000000 0A0A0A0A 10 | 使用.l 格式将以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A |
cp | 数据拷贝命令 | cp [.b, .w, .l] source target count | cp.l 80000000 80000100 10 | 使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个内存块(0x10 * 4=64 个字节) |
cmp | 比较命令,用于比较两段内存的数据是否相等 | cmp [.b, .w, .l] addr1 addr2 count | cmp.l 80000000 80000100 10 | 使用.l 格式来比较 0x80000000 和 0X80000100 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节) |
说明1:
命令中的[.b .w .l]对应 byte、word 和 long,也就是分别以 1 个字节、2 个字节、4 个字节来显示内存值。address 就是要查看的内存起始地址,[# of objects]表示要查看的数据长度,这个数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度为20(十六进制为 0x14),如果显示格式为.b 的话那就表示 20 个字节;如果显示格式为.w 的话就表示 20 个 word,也就是 202=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是204=80 个字节。另外要注意:
uboot 命令中的数字都是十六进制的!不是十进制的!
说明2:
输入上述命令以后如图 30.4.3.2 所示:
图 30.4.3.2 nm 命令
在图 30.4.3.2 中,80000000 表示现在要修改的内存地址,ffffff00 表示地址 0x80000000 现在的数据,?后面就可以输入要修改后的数据 0x12345678,输入完成以后按下回车,然后再输入‘q’即可退出,如图 30.4.3.3 所示:
图 30.4.3.3 修改内存数据
修改完成以后在使用命令 md 来查看一下有没有修改成功,如图 30.4.3.4 所示:
图 30.4.3.4 查看修改后的值
从图 30.4.3.4 可以看出,此时地址 0X80000000 的值变为了 0x12345678。
要使用网络首先要配置一些环境变量:
环境变量 | 描述 |
---|---|
ipaddr | 开发板 ip 地址,可以不设置,使用 dhcp 命令来从路由器获取 IP 地址。 |
ethaddr | 开发板的 MAC 地址,一定要设置。 |
gatewayip | 网关地址。 |
netmask | 子网掩码。 |
serverip | 服务器 IP 地址,也就是 Ubuntu 主机 IP 地址,用于调试代码。 |
例如:
setenv ipaddr 192.168.1.50
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.250
saveenv
注意:
网络地址环境变量的设置要根据自己的实际情况,确保 Ubuntu 主机和开发板的 IP 地址在同一个网段内。
比如我现在的开发板和电脑都在 192.168.1.0 这个网段内,所以设置开发板的 IP 地址为 192.168.1.50,我的 Ubuntu 主机的地址为 192.168.1.250,因此 serverip 就是192.168.1.250。
ethaddr 为网络 MAC 地址,是一个 48bit 的地址,如果在同一个网段内有多个开发板的话一定要保证每个开发板的 ethaddr 是不同的,否则通信会有问题!设置好网络相关的环境变量以后就可以使用网络相关命令了。
命令 | 用途 | 格式 | 举例 | 说明 |
---|---|---|---|---|
ping | 是否可以与指定ip进行通信 | ping ip | ping 192.168.1.250 | 注意!只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping命令做处理,如果用其他的机器 ping uboot 的话会失败! |
dhcp | 用于从路由器获取 IP 地址 | dhcp | dhcp | 直接输入 dhcp 命令即可通过路由器获取到 IP 地址 |
nfs | 通过 nfs 可以在计算机之间通过网络来分享资源 | nfs [loadAddress] [[hostIPaddr:]bootfilename] | nfs 80800000 192.168.1.250:/home/zuozhongkai/linux/nfs/zImage | 使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处 (ubuntu系统上要建立并开启nfs服务) |
tftp | 通过网络下载东西到 DRAM 中 | tftpboot [loadAddress] [[hostIPaddr:]bootfilename] | tftp 80800000 zImage | 将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处 (ubuntu系统上要建立并开启tftp服务) |
注意点1:
nfs 命令的区别在于,tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。
注意点2:
在图 中可以看到“TFTP error: ‘Permission denied’ (0)”这样的错误提示,提示没有权限,出现这个错误一般有两个原因:
①、在 Ubuntu 中创建 tftpboot 目录的时候没有给予 tftboot 相应的权限。
②、tftpboot 目录中要下载的文件没有给予相应的权限。
针对上述两个问题,使用命令“chmod 777 xxx”来给予权限,其中“xxx”就是要给予权限的文件或文件夹。
安装VScode
VScode其实在linux下可以直接运行,不需要安装
我们要做的是给文件夹找一个合适的位置,然后把开始菜单和桌面的程序图标加进去
第一步:下载VScode
在Visual Studio Code官网下载:
VScode linux 64位
第二步:解压缩文件
tar -xvzf code-stable-1536736541.tar.gz
第三步:移动到/usr/local/ 目录,给可执行的权限, 然后就已经可以运行了
mv VSCode-linux-x64 /usr/local/
chmod +x /usr/local/VSCode-linux-x64/code
第四步:添加到开始菜单和桌面
复制一个VScode图标文件到 /usr/share/icons/ 目录(后面会有用),并且编辑VSCode.desktop
cp /usr/local/VSCode-linux-x64/resources/app/resources/linux/code.png /usr/share/icons/
vim /usr/share/applications/VSCode.desktop
然后这样写:
[Desktop Entry]
Name=Visual Studio Code
Comment=Multi-platform code editor for Linux
Exec=/usr/local/VSCode-linux-x64/code
Icon=/usr/share/icons/code.png
Type=Application
StartupNotify=true
Categories=TextEditor;Development;Utility;
MimeType=text/plain;
保存退出,在开始菜单里面应该就看到VScode了。
如果想要桌面上也存在,就这样:
cp /usr/share/applications/VSCode.desktop ~/桌面位置
安装交叉编译器
通常编译工具链对编译环境有较高的要求,编译复杂的程序时,可能需要巨大的存储空间以及强大的 CPU 运算能力加快编译速度。常见的ARM 架构平台资源有限,无论是存储空间还是 CPU 运算能力,都与 PC 相去甚远,特别是对于 MCU 平台,安装编译器根本无从谈起。有了交叉编译,我们就可以在 PC 上快速编译出针对其他架构的可执行程序。
安装过程非常简单,apt安装即可:
sudo apt install gcc-arm-linux-gnueabihf
安装NFS server和挂载NFS目录
第零步:ubuntu和板子处于一个路由器内,并相互ping成功
第一步:虚拟机设置,实体机请跳过:
网络连接选择桥接并勾选复制物理网络连接状态:
笔记本中经常会有两个或者两个以上的网卡,根据需要进行如下设置:
再点击管理员模式:
在里面选择直通(近似可以这样理解)的网卡即可。
总之,大家的电脑和虚拟机不同,不管如何折腾或者怎么连接,目的就是虚拟机和板子之间可以互相Ping成功
ubuntu ping 板子:
第二步:安装NFS server和挂载NFS目录
apt安装即可:
sudo apt-get install nfs-kernel-server
查看id:
id
记下uid(用户id) 和gid(组id),接下来要用。
安装 NFS 服务后,会新增一个/etc/exports 文件(即/etc 目录下名字为 exports 的文件),
NFS 服务根据它的配置来运行。
这里我们直接使用shell命令修改一下:
sudo echo "/home/pibot/nfs *(rw,sync,all_squash,anonuid=????,anongid=????,no_subtree_check)" > /etc/exports
sudo exportfs -arv
别忘了把uid和gid填入问号里面去
这里面的*代表所有ip均可以访问,当然也可以指定ip,把它换成:ip/24即可
把/home/pibot/nfs换成你想要挂上去的文件夹
板子设置:
mkdir /home/root/mountnfs
mount -o vers=4 192.168.0.128:/home/pibot/nfs /home/root/mountnfs
执行过去了,就基本正常了,再去挂载目录下看