写在前面
推荐视频:
韦东山的个人空间-韦东山个人主页-哔哩哔哩视频 (bilibili.com)](https://space.bilibili.com/275908810/channel/seriesdetail?sid=3810665)
正点原子视频:https://space.bilibili.com/394620890/channel/seriesdetail?sid=2042045
我用的是正点原子的板子,一开始看着韦东山老师的教程,看完基础篇后发现还是折回去看正点原子的视频,因为有些东西不兼容用起来挺麻烦的,推荐新手入门的话买谁家的板子就看谁的视频,这个环境搭建是都兼容的,然后我比较喜欢韦东山老师的方法,在win下编辑完代码再通过Filezilla传到Ubuntu,最后由挂载的nfs把文件传输到板子,还有XMobaterm和Filezilla等软件很好用,大家可以跟着我这个教程搭好环境,然后先看正点原子的C应用篇以及QT篇,看完再折回去看驱动开发,that is all,下面开始吧!
如何学习linux
- 学uboot要3-6个月,工作也基本用不上
- 内核本身的裁剪移植一般是芯片厂家干的,不用我们干
所以先入门应用开发再回去学驱动开发
windows和linux区别
文件系统
ubuntu主要为分为文件系统
Windows会分为很多盘符
文件树:
dev表示分区,sda代表磁盘,1表示这是第一个分区,它挂载在Filesystem Root目录下
Linux命令-shell
Shell 的意思是“外壳”,在 Linux 中它是一个程序,比如/bin/sh、/bin/bash 等。它负责接收用户的
输入,根据用户的输入找到其他相应的程序并运行。比如我们输入“ls”并回车时,shell 程序找到“ls”程序并
运行,把结果打印出来。
Shell 有很多种实现,我们常用 bash。
Linux命令提示符
在 Ubuntu 中打开终端后,即可看到类似下图的提示符:代表成功进入终端,可输入命令
文中左下角绿色部分就是提示符
Linux命令格式
选项部分可有可无,一般就是指操作范围或操作程度,记得前面要加“-”如
ls -l 显示更完整信息
常用命令
先讲下绝对路径和相对路径的概念
Linux 下的根目录为“/”,从根目录下出发可以找到任意目录、任意文件。从根目录开始表示目录或文
件的方法称为**“绝对路径”**。比如:
/home/book 根目录下的home目录下的book目录
/home/book/1.txt
相对路径:假设当前正位于/home/book 目录下,那么:
./1.txt 表示当前目录下的 1.txt,即 /home/book/1.txt;“.”表示当前目录
../book/1.txt 表示当前目录的上一级目录里,book 子目录下的 1.txt
“/home/book/..”就是”/home”目录,”..”表示上一级目录
pwd
打印当前所在路径
cd
切换路径
$ cd - // 进入上次目录, 比如先进入 a 目录再进入 b 目录,执行此命令后即回到 a 目录
$ cd ~ // 进入家目录
mkdir和rmdir以及rm
mkdir:创建目录
rmdir:删除目录,但是无法删除非空目录,所以一般我们用rm
rm:
rm [目录] -r //递归删除(即先删除文件夹内部文件,再删除文件夹),这样就可删除非空文件夹,我们这里一般把文件夹叫成目录
rm -rf [目录]//递归强制删除
ls
列出目录内容
cp
复制文件
*表示全部的意思,所以dir1/ * 表示dir1目录下全部文件
cat
查看文件内容
touch
修改文件时间,如果没有这个文件则直接生成,可用于生成文件
touch [文件名] 把时间修改为当前时间
改变文件权限和属性
chgrp
chown
chmod
改变文件权限
r表示可读,w表示可写,x表示可执行
看一个目录的权限,只需要ls -l一下就出现了,最左边就是了;
查找/搜索命令
find:根据文件名称查找
find 命令格式为:
find 目录名 选项 查找条件
例三没有指定文件后缀
grep:查找文件内容
grep 命令的作用是查找文件中符合条件的字符串
grep [选项] [查找模式] [文件名]。
加上-n就是顺便列出关键字在第几行
-nwr的r 表示递归查找,即不止查找当前目录,还查找其子目录里的文件
压缩/解压命令
单个文件的压缩(解压)使用 gzip 和 bzip2 ,多个文件和目录使用 tar。
gzip
gzip 只能压缩单个文件,不能压缩目录
bzip2
bzip2 只能压缩单个文件,不能压缩目录
tar
c是第一个变量
网络
输入ifconfig可查看ip信息
sudo
在语句前加sudo就是以管理员的身份运行,当权限不够时就可以这样做
改成了所有者无法执行,这时候运行就会发现无权限,用sudo临时改成root用户才能运行
su root //把用户从book切换到root
修改path路径
所以就需要用绝对路径或相对路径运行,就算你已经在这个目录下也需要如此,或者修改path变量,把你当前文件夹包进去,又或者把你的文件复制到path变量里的文件夹都是可以的,具体如下:
VI编辑器使用
现场调试时,并没有 GUI 形式的编辑工具,vi 是唯一选择。
模式
打开、新建、保存
编辑模式
使用NAT配置网络环境
在 NAT 里,Ubuntu 要主动发起网络访问,需要经过 Windows 代劳,外面的设备只看到 Windows 发出的网络数据;Windows 收到数据的再转发给 Ubuntu。
即顺序为:ubuntu->Windows->开发板
在 NAT 里,外面的设备比如开发板要访问 Ubuntu,也只能通过 Windows 代劳:开发板是看不到Ubuntu 的,开发板是 ping 不通 Ubuntu 的。
开发板有时候是想访问 Windows,有时候是想让 Windows 代劳去访问 Ubuntu,Windows怎么区分?通过端口映射!
比如把 Windows 的 22 端口映射到 Ubuntu 的 22 端口,当开发板通过端口 22(这是 SSH 端口)访问Windows 的 IP 时,Windows 就知道:哦,这 22 端口数据不是发给我的,是要我转发给 Ubuntu 的。于是Windows 就把数据转发给 Ubuntu。这样开发板就可以通过 22 端口访问 Ubuntu 了。
Ubuntu配置NAT网络
先把Ubuntu设置为NAT模式
从韦东山老师的网盘资料下载的ubuntu镜像是已经安装好NAT网卡的了,所以不需要再操作这一步了,如果发现没有的话可以添加网络适配器,具体看韦东山老师的视频P2
这就是我们的NAT网卡,Ubuntu可以他挂到Windows的网络从而借助Windows访问外部网络
192.168.255.129是Ubuntu的IP地址
设置NAT网络的端口映射
在 NAT 网络下,外面的设备无法看到 Ubuntu,要想开发板能访问到 Ubuntu,需要进行端口映射。 **先关闭 Ubuntu,再关闭 VMware,才能设置。 **
我们需要映射这几个端口:22(ssh 端口)、111(rpc 端口)、2049(nfs 端口)、9999(mountd 端口)。这样,开发板访问 Windows 的这些端口时,才可以访问到 Ubuntu。
注:这个Ubuntu IP随时会改变,所以要是连不上的时候要重新去看Ubuntu的IP然后回到这里改IP,IP要写对,不然下面挂载NFS目录的时候就挂载不过去的!!!!
修改Ubuntu的mountd端口
在 NAT 网络下,要想开发板能通过 NFS 挂载 Ubuntu,需要修改 mountd 端口为 9999 。如果你还不会用 vi 命令,可以在 Ubuntu 桌面启动终端,执行以下命令,用 GUI 工具修改:
sudo gedit /etc/services
到这里网络部分就配置完毕了,接下来可以验证网络
验证网络
windows能否ping通Ubuntu
成功
Ubuntu能否ping通Windows
记得关防火墙
也成功了
Ubuntu和Windows能否ping通开发板
使用这个软件远程登录开发板的Ubuntu系统,给它设置ip
成功了,注意:开发板是没法ping通Ubuntu的,只能ping同Windows,然后Windows会根据端口号识别消息是发给自己还是Ubuntu,代转发。
编程前准备
使用 MobaXterm 远程登录 Ubuntu
注意:对于使用 NAT 的 Ubuntu,上图中步骤 2 里输入的 IP 是 127.0.0.1;如果不是使用 NAT,则需要输入 Ubuntu 的 IP。
使用MobaXterm登录开发板
这个是用串口,需要连接串口线,也可以用SSH连接,具体看韦东山的文档
使用 FileZilla 在 Windows 和 Ubuntu 之间传文件
注意:对于使用 NAT 的 Ubuntu,上图中步骤 2 里输入的 IP 是 127.0.0.1;如果不是使用 NAT,则需要输入 Ubuntu 的 IP。
红框的是文件夹下的具体文件
将hello.c拖到Ubuntu的book文件夹下面然后直接编译运行
使用 FileZilla 在 Windows 和开发板之间传文件
Ubuntu和开发板文件互传
Ubuntu和开发板的文件互传可以使用scp指令,前提是先按着我前面那样配置网络,然后使用scp命令
安装Ubuntu软件
确保 Ubuntu 能上网之后,使用下面命令一键配置/初始化开发环境(其实就是安装 tftp,nfs,vim 等软件,此脚本只支持 Ubuntu-16.04 /Ubuntu-18.04)。
建议把命令行放到文本编辑器里排成一行,然后复制过来,在MobaXterm里直接右键就粘贴了,这样一般就是一整行,不放在一行复制的话粘贴进终端就会全乱了,肯定是报错的,当然有时候排成一行复制还是会乱,这个时候就需要一段一段复制了,然后在要换行的地方加个“\”敲下Enter就换行了。
复制以下三条命令即可
wget --no-check-certificate -0 Configuring_ubuntu.sh https://weidongshan.coding.net/p/DevelopmentEnvConf/d/DevelopmentEnvConf/git/raw/master/Configuring_ubuntu.sh
sudo chmod +x Configuring_ubuntu.sh
最后一条需要进到DevelopmentEnvConf目录里才能运行
sudo ./Configuring_ubuntu.sh
配置ubuntu第一步出错 - NXP / IMX6ULL_PRO - 嵌入式开发问答社区 (100ask.net)
将开发板挂载到Ubuntu的NFS目录
注意是在开发板上执行命令
注:Ubuntu IP随时会改变,所以要是连不上的时候要重新去看Ubuntu的IP然后回到虚拟网络编辑器那里改IP,IP要写对,不然下面挂载NFS目录的时候就挂载不过去的!!!!它会一直显示connection timeout。
2049(nfs 端口)、9999(mountd 端口)
所以开发板想要访问Ubuntu的时候,也就是先通过windows的ip访问到windows,但是这个ip端口映射到了Ubuntu的端口上了,所以windows就知道这个消息不是给自己的,是给Ubuntu的,然后就把消息发到Ubuntu的ip上,这样Ubuntu就能收到板子信息了
所以在端口模式的方法下,我们用mount挂载nfs目录IP必须是Windows的,因为板子是ping不同Ubuntu的
把后者挂到前者
在这之前记得设置开发板ip,不然是挂不上的!!!
源码和工具链下载
如果你用的是韦东山的这个镜像,那Linux源码是已经下好了的,不用再下了
放在这个路径下
如果没有的话就自己下,下这个全功能板的,我的板子是正点的imx6ull nand板,我推荐的是下这个全功能板,不是文档下面的mini nand板
交叉编译工具链
交叉编译工具链用来在Ubuntu主机上编译应用程序,而这些应用程序是在ARM等其他平台上运行。 设置交叉编译工具主要是设置PATH, ARCH和CROSS_COMPILE三个环境变量
这里韦东山老师已经修改了,但是好像不是这个板子的,改成上面这个,copy进去
搞完后关掉MobaXterm Ubuntu的界面,再连进去
然后运行
arm-linux-gnueabihf-gcc -v
出现这样的信息就是ok了
运行第一个应用程序
编译程序
首先我推荐把在Ubuntu里文件放到 /home/book/nfs_rootfs 路径下,因为这个就是nfs目录,直接就同步到板子的/mnt目录了
接着在Ubuntu里对.c文件进行arm linux交叉编译,就会生成一个arm能运行的文件,比如:hello.c->hello
接着直接到开发板系统了,我们需要同步一下nfs的文件到/mnt文件夹(同步是每次上电必须做的)
可以在这里设置快捷方式
mnt在根目录下
所以直接cd /mnt/
然后运行hello文件即可,:./hello