交叉开发:
是一种开发方式,也是用来开发软件的
编写代码------->编译代码(gcc)-------->运行代码
一. 交叉编译(corss-compiling)
交叉编译,是一种编译方式,也是把一种程序语言翻译为一种机器语言
交叉?(编译代码的环境和你运行代码的环境不一样)
编译环境:一般指的是编写代码和编译代码的环境(主机的信息: x86-64, windows
/ x86-64, Linux-ubuntu)
运行环境:一般指的是你运行程序(编译后的二进制)的那一个主机的信息(x86-64, Linux-ubuntu / ARM, Linux)
在实际开发中,编译环境和运行环境一般是不相同的 (产品一般是不具备写代码和编译代码条件的,没有编辑器和编译器)
我们只能在自己的PC上面写完代码(keil / ubuntu),编译好,再下载(烧写)到具体的产品上面运行,这个过程就是我们所说的交叉开发
如:
在PC机上去写一个代码,编译好,下载带51单片机上运行
在PC机上去写一个代码,编译好,下载带ARM开发板上运行
....查资料: ARM和x86是什么?
ARM:
ARM是一种处理器架构,全称为Advanced RISC Machine。ARM处理器由ARM公司设计,是一种低功耗、高性能的处理器架构,广泛应用于移动设备、嵌入式系统、个人电脑以及服务器等领域。ARM处理器采用精简指令集计算技术(RISC),具有较高的能效比和较低的能耗。它具有灵活的架构设计,可以根据应用需求进行定制,支持多核处理器和多线程技术。目前,ARM处理器在全球市场占据主导地位,并且在人工智能、物联网和汽车领域等新兴应用中有着广阔的发展前景。
处理器架构:
处理器架构是指计算机处理器的设计和组织方式,包括指令集、寄存器、内部结构、流水线和总线等各个方面的组织和设计。处理器架构决定了处理器的性能、功耗和功能等特性。
处理器架构可以分为复杂指令集计算机(CISC)和精简指令集计算机(RISC)两种类型。CISC处理器具有复杂的指令集,一条指令可以执行多个操作,相对而言更加复杂,但也更加灵活。而RISC处理器具有简化的指令集,每条指令只执行一个简单的操作,相对而言更加简单,但也更加高效。
处理器架构还可以细分为32位架构和64位架构,表示处理器寄存器中一次可操作的数据的位数。64位架构相比32位架构具有更大的寻址空间和更高的运算速度。
另外,处理器架构还可以根据是否支持并行计算划分为单核处理器和多核处理器。多核处理器具有多个核心,可以同时执行多个任务,提高处理器的整体性能。
不同的处理器架构适用于不同的应用领域和场景,如移动设备、嵌入式系统、个人电脑、服务器和超级计算机等。选择合适的处理器架构对于系统的性能、功耗和成本等方面至关重要。
x86:
x86(也称为IA-32)是一种常见的处理器架构,最初由Intel公司推出,并广泛应用于个人电脑和服务器等领域。x86处理器采用复杂指令集计算机(CISC)架构,具有较为复杂的指令集,允许进行多个复杂的操作。
x86架构最早出现于20世纪80年代中期,随后不断发展和升级。现在的x86处理器包括Intel的Core系列和Xeon系列以及AMD的Athlon系列和Ryzen系列等。x86处理器以其高性能和灵活性广受欢迎,并成为个人电脑和服务器市场的主导架构。
x86架构的特点包括指令集的丰富和复杂性、支持虚拟内存和多任务操作系统、广泛的软件兼容性等。x86处理器还支持流水线、超标量和多核等技术,提高了指令的执行效率和系统性能。
总的来说,x86是一种常见的处理器架构,被广泛应用于个人电脑和服务器等领域,主要由Intel和AMD等公司生产,具有丰富的软件兼容性和高性能。
在一种环境下面去生成另一种环境可以运行的可执行文件
如: 在x86环境(linux/ubuntu)生成开发板(ARM)可以运行的程序
ARM开发板的程序如何编译呢?
gcc ------>编译器(生成的可执行文件,可以放到x86上面运行)
arm-linux-gcc ----->交叉编译器(生成的可执行文件,可以放到ARM上面运行)
交叉编译环境一般使用linux系统
PC机(编写)--->PC机上进行交叉编译--->可执行程序--->下载到目标板上运行
二. 交叉编译器的安装
sudo apt-get install gcc 安装普通的编译器(前提:联网)
sudo apt-get install arm-linux-gcc 新版本的Ubuntu可以下载,但是下载之后,可能用不了一般来说,交叉编译器都是芯片厂商做好的,编译好的(我们也可以自己做),直接拿过来使用就可以了
编译器版本和编译内核的编译器版本一致
💖交叉编译器的安装:
1. 把交叉编译器工具链的压缩包,放到自己的linux系统下(家目录)不要放到共享文件夹(共享文件夹是windows的文件夹)
cp arm-linux-gnueabi-5.4.0.tar.xz /home/china/
// 把交叉编译器复制到家目录
cd /home/china
2. 解压到一个合适的目录
sudo mkdir /usr/local/arm // 自己新建一个目录
sudo tar -xvf arm-linux-gnueabi-5.4.0.tar.xz -C /usr/local/arm// 解压到指定的目录
cd /usr/local/arm 里面就有你需要的编译器3. 找到你解压之后的编译器目录
/usr/local/arm/5.4.0/bin
这个目录里面就有常用的交叉编译器工具就可以使用这个工具去编译我们的可执行程序
/usr/local/arm/5.4.0/bin/arm-linux-gcc 1.c -o 1
使用编译器的时候需要加路径?
因为编译器所在的路径不是系统的默认路径,把这个路径加入到默认的路径中(环境变量PATH)不然shell不知道你的命令在哪里为什么我们敲ls,pwd不需要指定路径呢?
因为这些命令在我们系统的默认路径下面
a. 你可以把你的命令放到默认路径下面去
b. 你可以使你的编译器的目录变成默认路径的一部分
把我们这个目录加入到一个名字叫做PATH的环境变量
PATH:这个环境变量保留了系统默认的可执行文件的目录列表
PATH=dir1:dir2:dir3:dir4:......
4. 修改环境变量
把我们编译器所在的路径变成默认路径的一部分
====>参考shell中的环境变量练习:
学过了shell(脚本文件,重复写命令)
写一个shell脚本,把/usr/local/arm/arm-2009q3/bin所有的工具都建立一个对应的软链接
./xx.sh 就会为所有的工具都建立一个对应的软链接
arm-none-linux-gnueabi-c++
====>arm-linux-c++
提示: shell 中 ${},## 和%%的用法
假如我有一个变量:
file=xxx/dir1/dir2/dir3/dir4/my.file.txt
可以使用${}获取字符串中的不同内容:
${file#*/}:删除第一个 / 以及左边的字符串
====>
dir1/dir2/dir3/dir4/my.file.txt
${file#*.}:删除第一个 . 以及左边的字符串
====>
file.txt
${file##*/}:删除最后一个 / 以及左边的字符串
====>
my.file.txt
${file##*.}:删除最后一个 . 以及左边的字符串
====>
txt
${file%*/}:删除从右边数第一个 / 以及右边的字符串
====>
xxx/dir1/dir2/dir3/dir4
${file%%*/}:删除从右边数最后一个 / 以及右边的字符串
====>
xxx
#!/bin/bash list=`ls arm-none-*` for var in $list do #取每一个var的最后一个-后面的字符串 var1=${var##*gnueabi-} #把取到的字符串(var1)放到arm-linux-后面 var2=arm-linux-$var1 #echo $var2 ln -s $var $var2 done
三. 把我们自己的程序下载到嵌入式开发板上面运行
ARM芯片(三星的s5pv6818的处理器)
两部分:屏幕(LCD显示屏 + 触摸屏)
底板(主板)
网线
电源线
串口线(两端一样)
USB-转串口
开发板和PC通信
串口通信
串口线
PC-----------------------开发板
串口软件(SecureCRT)
开发板的使用:通过串口和PC通信
windows中要先安装串口线的驱动
设备管理器:其他设备:显示 usb2.0-ser! 表示没有安装驱动(不识别此设备)
右击设备名称---->更新驱动程序软件--->浏览计算机以查找驱动程序软---->找到解压之后的usb_com文件夹(包含子目录)----->下一步
USB-转串口(需要安装驱动程序)
插入USB-转串口,会显示在设备管理器中
端口:
USB-SERIAL CH340(COMX)
ch340表示的是设备名称
COMx表示设备连接到计算机的哪一个端口使用串口软件去读写串口的数据
secureCRT(windows)
putty(windows)
xshell(windows)
minicom(linux)
Linux中常用的命令行串口工具
sudo apt install minicom
设置串口通信协议:
sudo minicom -s
....打开secureCRT,点击快速连接
协议:serial 串口协议
端口:COMX 连接到你计算机的哪一个USB口
波特率: 115200 每秒发送的bit数
把流控去掉
确定,出现绿色的小√就可以了
Ctrl+C 会出现一个虚拟终端,这个终端就是控制开发板的
操作方法和虚拟机一样的,通过命令行操作
开发板的所有信息都会通过串口传入PC,PC也可以通过串口控制开发板
进入开发板之后,建议设置一个自己的工作文件夹(可以修改/etc/profile) :vi /etc/profile
自己的数据都放到自己的工作文件夹
cd ~
mkdir SC
cd SC通过串口下载文件到开发板上面运行
开发板没有编译器,所以我们需要先在PC上编译好,再下载到开发板上面运行
- 串口下载文件(Xmodem/Ymodem/Zmodem)
rx recive Xmodem
在开发板上面使用xmodem协议去接收数据
开发板已经做好了接收准备,在PC上面发送文件即可开发板:
rx hello
开发板使用xmodem的协议接受一个名字叫做hello的文件
CRT上发送:
传输--->发送xmodem--->选择你要发送的文件
rz + 回车
- 运行开发板上面的文件
./hello
-/bin/sh: ./hello: Permission denied
权限不够
======>
chmod +x hello
./hello
./hello: line 1: syntax error: unexpected "("
放到开发板上面运行的程序都需要使用arm-linux-gcc编译器编译开发板的屏幕是不会有变化的,因为你没写程序控制屏幕
四. U盘
1. 给自己的U盘建立文件系统分区
Linux中的分区命令(fdisk)
sudo fdisk -l 列举当前系统中所有存储设备的信息
fdisk /dev/sda1
需要操作/dev/sda1这个设备
2. 格式化(mkfs)
Linux系统有可能不认识你U盘的数据
U盘中的数据有自己的文件系统(有自己的存储格式)
也可以把U盘格式化为指定的文件系统(把文件系统的元数据写入到分区的最前面)3. 挂载(mount) <----
把指定的存储设备(U盘的分区文件系统),加载到操作系统的文件系统的某一个路径下面(一般都是自动挂载的,windows)
在Linux下面,也可能会自动挂载,一般在如下的位置
1)/mnt/media
2)/media
3)/mnt/udisk <------------ 我们的开发板
U盘的内容就出现在了这个目录下面,U盘自动挂载到/mnt/udisk如果没有自动挂载,可以尝试使用mount命令手动挂载
mount /dev/sdb1 /mnt
/dev/sdb1 // 你要挂载的分区的名称
/mnt // 你要把设备挂载到操作系统的哪一个目录下面去
挂载成功,/dev/sdb1磁盘中的内容就会出现在/mnt目录下面4. 卸载
umount /mnt
1)把传输的文件拷贝到U盘
2)把U盘插到开发板上
3)U盘自动挂载到开发板的 /mnt/udisk
4) 文件拷贝到自己的开发板目录
注意:可能自动挂载会不成功,需要手动挂载
cd /mnt/udisk 目录
ls 查看不到U盘中的文件
手动挂载步骤:
①创建一个用来挂载U盘的路径
eg: mkdir /FT/udisk
②mount /dev/....(查看插入U盘时文件) 自己创建U盘的挂载路径
eg: mount /dev/sda1 /FT/udisk
③切换到自己的挂载路径
④用完后记得解除
umount 自己创建U盘的挂载路径
eg: umount /FT/usidk
五. 配置网络
网络:开发板有一个有线网卡,可以直接联网
虚拟机联网:参考Linux基础的内容
开发板:
a. 连接网线
可以连桌面上的网线(开发板和教室中所有的机器在一个局域网)
可以直接用一根网线连接PC机和开发板(开发板和PC机两台机器构成了一个局域网),这样做的话,PC就不要连wifib. 设置网络信息(IP地址)
如果使用教室局域网,可以使用命令自动获取IP地址
udhcpc可以通过命令设置IP地址(但是是临时的)
ifconfig eth0 172.11.0.4 netmask 255.255.254.0 up
route add default gw 172.11.1.1需要开机就设置,可以使用配置文件(把上面的语句中的一种写入/etc/profile)
reboot
或者还有一种方式:
在开发板的 /etc/init.d目录下面建立一个简单的脚本文件
名称必须是 Start.sh
系统每一次重启都会执行这个脚本
内容为:
#!/bin/sh#关闭eth0的网卡
ifconfig eth0 down#设置eth0网卡的物理地址(最后两位建议每个同学的都不相同)
ifconfig eth0 hw ether 08:90:00:A0:35:88#设置网卡的IP和子网掩码
ifconfig eth0 172.11.0.4 netmask 255.255.254.0 up#设置网关
route add default gw 172.11.1.1=#打开telnetd服务
telnetd &注意:
脚本必须有可执行权限
手动运行一次脚本或者重启开发板才可以生效
IP地址不能和Windows相同
同一个局域网中网关和子网掩码必须相同如果开发板需要访问外网网址,还需要添加域名解析服务器地址
设置DNS服务区
vi /etc/resolv.conf
增加一行:
nameserver 114.114.114.114
开发板就可以ping通百度了
经过上面的操作,你的开发板,虚拟机和windows应该处于同一个局域网
可以相互ping通windows:
地址 172.11.0.1
子网掩码 255.255.254.0
网关 172.11.1.1
DNS 114.114.114.114Ubuntu:
地址 172.11.0.3
子网掩码 255.255.254.0
网关 172.11.1.1
DNS 114.114.114.114
开发板:
地址 172.11.0.4
子网掩码 255.255.254.0
网关 172.11.1.1
DNS 114.114.114.114
六. tftp / ftp
网络文件传输协议
在虚拟机中搭建一个文件传输服务器(tftp / ftp)
目的:使用网络传输文件到开发板
tftp是一个网络服务程序,是CS架构
C: client 客户端 开发板
S: server 服务器 PC / ubuntu
可以在虚拟机中搭建一个tftp的服务器,在开发板上面就可以使用tftp客户端下载文件
在虚拟机中安装:
安装:
sudo apt-get install tftp-hpa
启动:
sudo service tftpd-hpa start
停止:
sudo service tftpd-hpa stop
重启:
sudo service tftpd-hpa restart查看:
sudo service tftpd-hpa status
配置tftp的配置文件:( /etc/default/tftpd-hpa )
# /etc/default/tftpd-hpa 注释
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/china/tftpboot"
// 服务器共享到网络上面的目录(必须有可执行权限)TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"查看当前虚拟机中的tftp服务器的进程是否正常启动:
ps -ef | grep tftp在同一个局域网中的其他设备(虚拟机/开发板)上就可以使用tftp从服务器上面下载文件,也可以上传文件到服务器(前提是网络正常)
cd ~/tftpboot
or
cd /home/china/tftpboot
在开发板上使用tftp命令下载:
tftp -g(get获取) -r(remote远程) 远程文件名 服务器地址
如:
tftp -g -r a.txt 172.11.0.3
从172.11.0.3这个服务器(虚拟机:/home/china/tftpboot)上面下载一个叫做a.txt的文件到本地(开发板)的当前目录在开发板上使用tftp命令上传:
tftp -p -l 本地文件名 服务器地址
如:
tftp -p -l 1.txt 172.11.0.3
把当前目录下面的1.txt文件推送到服务器172.11.0.3的目录 (/home/china/tftpboot)
Ubuntu中也可以使用tftp服务器
tftp 172.11.0.3 进入tftp的命令行
or
tftp localhost 表示本地IP地址下载:get b.txt
上传:put n.txt
退出tftp:quit
七. 补充
1. 计算机中如何比较两个文件是否相同(大小/内容)?
一般使用md5sum
md5sum a.txt 计算这个文件的md5值
如果两个文件的md5值相同,那么我们认为这两个文件是相同的 !!!2. 刷机: (最好不要实验,因为软件和硬件都是定制的,有可能不兼容)
USB线连接到OTG(注意安装OTG的驱动)
步骤:
让开发板进入boot命令行(类似于BIOS)
开机启动的时候,在5S内按任意键,进入boot命令行
如果需要继续启动:
输入命令boot
如果需要刷机:
a.在boot命令行输入fastboot
b.打开windows中的刷机包,刷机auto.bat (windows中的脚步)
等待完成即可
八. 任务
1. 查资料了解telnetd服务怎么搭建并且搭建一个telnet服务(搭建到虚拟机)
可以使用CRT连接虚拟机或者开发板
安装telnetd 服务
sudo apt-get install telnetd
sudo apt-get install xinetd
sudo apt-get install telnetd-ssl
查看telnet运行状态
sudo netstat -a | grep telnet
telnet localhost
telnet 172.11.0.3
输入用户名(china)和密码(123456)即可
exit退出
https://www.cnblogs.com/smartmsl/p/10878287.html也可以使用超级终端工具(CRT)连接
快速连接--->协议:telnet
主机名:IP地址
2. 自己在ubuntu中搭建一个ftp服务器
可以在开发板中使用wget下载服务器中的内容
3. 自己学习一下scp这条牛逼的命令(跨主机复制)
只有能够ping通,就可以自由的复制文件
scp 1.c china@172.11.0.1:/home/china/123
把当前目录下面的1.c文件复制到IP地址为172.11.0.1上面的china用户的/home/china/123目录下面
前提是安装ssh服务
4. ssh协议,搭建一个ssh服务器,可以实现远程登录
https://blog.csdn.net/gymaisyl/article/details/86570426/
上面三个都是建立在网络连通的情况下