1. 什么是tftp服务
tftp : 基于UDP开发的简单文本传输协议。
作用:通过网络的方式将ubuntu中的文件传输给开发板。
2. tftp服务的工作原理
- 设置开发板的启动方式为EMMC启动方式或者TF卡启动。
- PC端与开发板用网线连接,开发板上电,启动uboot
- 在SecureCRT串口工具中(串口工具与开发板用串口的USB线连接):
- 在挂载倒计时位0之前,按下电脑的任意键进入交互模式
- 使用tftp下载ulmage到内存中
- 使用tftp下载stm32mp157a-fsmla.dtb到内存中
- ubuntu中:
- tftp服务:/home/linux/tftpboot
- 存放要下载到开发板中的文件ulmage:linux内核的镜像文件stm32mp157a-fsmp1a.dtb:linux内核的设备树文件
3. 在ubuntu系统中安装tftp服务
- 安装tftp服务(ubuntu必须可以上网)
- sudo apt-get update ---->更新源
- sudo apt-get install tftpd-hpa tftp-hpa
- tftpd-hpa:服务器端
- tftp-hpa:客户端
- 修改1tftp服务的配置文件
- 打开tftp服务的配置文件:
- sudo vi /etc/default/tftpd-hpa
- 修改文件内容为如下内容:
- 打开tftp服务的配置文件:
- sudo vi /etc/default/tftpd-hpa
- 要文件内容修改为:
- # /etc/default/tftpd-hpa
- TFTP_USERNAME="tftp"
- TFTP_DIRECTORY="/var/tftpboot"
- TFTP_ADDRESS=":69"
- 修改为:
- # /etc/default/tftpd-hpa
- TFTP_USERNAME="tftp"
- TFTP_DIRECTORY="自己的tftpboot文件所在的目录"
- TFTP_ADDRESS=":69"
- TFTP_OPTIONS="-c -s -l"
- 打开tftp服务的配置文件:
- 在ubuntu的家目录下创建tftpboot目录
- 打开tftp服务的配置文件:
tftpboot目录的作用:将要使用tftp服务下载到开发板的程序存到这个目录下,
如果找到对应的文件则进行下载,如果没有找到则报"file not found"
$ cd ~
$mkdir tftboot
$chmod 777 tftpboot
4. 重启tftp服务(重启tftp服务的命令必须记住,后边会经常使用)
$ sudo service tftpd-hpa restart
注意:只要修改了tftp服务中配置文件的参数,就需要重启tftp服务,
使tftp服务配置文件中的配置立即生效。
5. 本地测试tftp服务是否安装成功
$tftp 127.0.0.1 ----> 使用tftp客户端连接本地的tftp服务
tftp > ----->表示tftp服务连接成功
tftp > get 1.txt ----->从~/tftpboot目录下下载文件到当前目录下,
因此需要在下载之前在~/tftpboot目录下创建1.txt
tftp > put 2.txt ------>将当前1目录下的2.txt文件上传到~/tftphoot目录下,
因此需要在上传之前在当前目录下创建2.txt
tftp > quit ------>退出
退出之后使用“ls”命令查看是否下载或者上传成功。
4. 安装NFS服务
4.1 什么是NFS服务
NFS:Network File System 网络文件系统
作用:开发板启动linux系统之后,通过网络的方式从ubuntu服务中挂载根文件系统,
也就是说将开发板的文件系统放到ubuntu服务器中,让开发板通过NFS的方式
挂载根文件系统,这种文件系统就是网络文件系统。
4.2 NFS文件系统工作原理
- 设置开发板的启动方式为EMMC启动方式或者TF卡启动。
- PC端与开发板用网线连接,开发板上电,启动uboot
- 在SecureCRT串口工具中(串口工具与开发板用串口的USB线连接):
- 在挂载倒计时位0之前,按下电脑的任意键进入交互模式
- 使用tftp下载ulmage到内存中
- 使用tftp下载stm32mp157a-fsmla.dtb到内存中
- ubuntu中:
- tftp服务:/home/linux/tftpboot
- 存放要下载到开发板中的文件ulmage:linux内核的镜像文件stm32mp157a-fsmp1a.dtb:linux内核的设备树文件
- NFS服务:/home/linux/rootfs
- 网络文件系统:/bin /dev /etc /home /usr /mnt /var /lib /root ......
- linux内核启动成功后,通过nfs从ubuntu服务器中挂载根文件系统
4.3 安装NFS网络文件系统
- 安装NFS网络文件系统
- sudo apt-get install nfs-kernel-server
- 修改nfs服务的配置文件
- 打开sudo vi /etc/exports,在配置文件的最后一行添加以下内容
- /home/linux/rootfs *(rw,sync,no_root_squash,on_subtree_check)
- 解释:
- /home/linux/rootfs:网络根文件系统的路径,修改为自己的路径
- * ---> 指所有用户
- rw ---> 对根文件系统可读可写的权限
- sync ---> 同步文件
- no_root_squash ---> 来访的root用户保持root账号权限
- no_subtree_check ---> 即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率
- 注意:
- 前面不可以加#,#是注释 可以注释默认的配置,添加自己的配置
- 打开sudo vi /etc/exports,在配置文件的最后一行添加以下内容
- 在ubuntu系统的家目录下解压缩开发板对应的根文件系统
- 拷贝根文件系统的压缩包到ubuntu系统家目录下可以使用共享文件夹或者直接拖拽。
- rootfs-ok.tar.xz ----> 根文件系统的压缩包
- 使用tar命令对根文件系统进行解压缩
- tar -xvf rootfs-ok.tar.xz
- 解压缩之后会得到一个rootfs的文件夹,rootfs文件夹就是开发板的根文件系统
- 注意,不可在windows下对rootfs-ok.tar.xz压缩包进行解压缩,windows不支持软连接文件
- 拷贝根文件系统的压缩包到ubuntu系统家目录下可以使用共享文件夹或者直接拖拽。
- 重启nfs服务使其立即生效(必须记住重启nfs服务的命令)
- sudo service nfs-kernel-server restart
- 注意:只要修改配置文件,就要重启服务
- 本地查看nfs服务是否安装成功
- sudo mount -t nfs IP地址:/home/linux/rootfs /mnt
- IP地址可以用本地回环测试地址:127.0.0.1
- 使用nfs网络文件系统挂载根文件系统到/mnt目录下,IP地址必须是自己ubuntu的IP地址。
- -t nfs :指定文件系统类型,使用nfs服务的方式进行挂载
- 是否挂在成功可以使用以下命令进行查看:ls /mnt
- 测试没有问题,可以执行取消挂载的命令:sudo umount /mnt
5. gnu命令的扩展
5.1 gcc/g++命令
gcc : 编译C语言
g++ : 编译C++语言
四部曲:预处理、编译、汇编、链接
- 预处理:展开头文件,删除注释,宏替换,不会检查语法错误
- gcc -E xxx.c -o xxx.i
- 编译:语法分析,词法分析,语义分析,检查语法错误,生成一个汇编文件
- gcc -S xxx.i -o xxx.s
- 汇编:将汇编文件生成一个二进制文件
- gcc -c xxx.s -o xxx.o
- 链接:链接库文件,生成可执行文件
- gcc xxx.o -o xxx
5.2 gdb命令
意义:代码调试的命令。
1. 使用gcc进行编译生成可执行程序
gcc -g xxx.c -i xxx
-g :添加gdb调试信息
2. 使用gdb命令启动程序
gdb 可执行程序名
3. gdb工具内部的命令
- quit ---> 退出
- list ---> 列出代码
- run ---> 运行程序
- continue ---> 继续运行程序
- break ---> 打断点
- break 行号 ---> 打断点在对应的行
- info b ---> 查看断点的信息
- delete 编号 ---> 删除断点
- 单步执行
- next
- step
- 查看变量的值
5.3 ld 命令
作用:链接的命令,将.o文件链接生成elf格式的可执行文件
5.4 objcopy 命令
作用:格式化拷贝命令,将.elf文件格式化拷贝生成.bin文件
5.5 objdump 命令
作用:反汇编命令,将.elf文件生成反汇编.dis文件
5.6 nm 命令
作用:查看文件符号信息
符号:变量名/函数名
5.7 size 命令
作用:查看elf文件各个段的大小
5.8 readelf 命令
作用:读取ELF文件的信息
5.9 strip 命令
作用: 压缩文件体积,比如可以删除elf文件中无用的信息,不影响程序的运行。
使用场合:嵌入式设备的存储空间有限,可以使用strip命令压缩文件的体积,节约存储空间