嵌入式系统学习
Day1 一些基础知识和想法
想法
- 为什么要在Linux上操作,而不是Windows或者mac,mac是arm不是更好吗
最初的理解:
厂家对mac的支持太少,基本上软件都是x86且Windows系统的,基本上摆脱嵌入式使用mac的可能
嵌入式设备本身使用的是Linux内核,从逻辑上来说,使用Linux编程它更符合操作习惯
学习后发现:前面理解基本正确
在Linux中,很多操作例如链接文件在Windows中机制不同,很多嵌入式设备的操作必须要在Linux中编译完成.(在Windows中解压Linux文件时就常遇到链接错误)
基础知识
- 磁盘分区挂载在某个目录
理解: Linux将分区挂载到目录,意味着当你访问某个目录时,Linux会确认这个目录是被哪个分区挂载,然后去访问这个分区中的内容
即将分区1挂载在/下,进行一系列文件操作
然后也将分区2挂载在/下,现在访问/将访问分区2,之前的操作将无法访问
- 环境变量的几种设置
- 只对当前终端有效
1
export PATH=$PATH:/path
- 对当前用户有效
1
2在~/.bashrc中添加
export PATH=$PATH:/path - 对所有用户有效
1
2在etc/environment中添加
export PATH=$PATH:/path
- 嵌入式设备的启动过程
加载uboot :
- 选择启动设备(闪存、SD卡、网络等)
- 加载内核镜像(uImage)到内存
加载内核kernel :
- 内核被引导到内存后初始化基本功能,
- 挂载根文件系统,配置文件为/etc/fstab
- 等待登陆
启动系统初始化进程init :
- 其配置文件为/etc/inittab或/etc/systemd ,该进程负责启动并管理其他用户空间进程,该进程在整个系统运行期间都存在
- 根据配置文件,找到并执行初始化脚本rcS,rcS一般会进行主机名配置(获取/etc/sysconfig/HOSTNAME)、启动级别配置
用户空间初始化 :
- 用户登陆(配置文件为/etc/passwd和/etc/shadow)其中passwd指定了shell的启动路径,shell被启动
- Shell 读取并执行用户配置文件(例如 /etc/profile 和用户的 ~/.bashrc)配置完后显示配置的命令提示行,例如root@buweihao
进入应用程序 :
这些应用程序可能包括各种任务,如通信、传感器数据采集、控制外设等。
根目录各个文件夹

具体内容跳到2.1.4
命令解释器shell的逻辑
以下是shell的执行步骤
- shell会从键盘或串口接收命令,并将其显示于终端
- 当shell接收回车时开始解析命令
- 查找PATH中的命令对应的可执行文件
- 将命令和参数输送到对应的程序,并执行
- 输出程序返回的结果到终端
开发环境网络设置
目的: 使用NFS或者tftp.NFS可以将嵌入式设备的目录挂载在ubuntu中,tftp则是一种轻量级传输协议,可以提供方便的文件互传,都可以提高开发效率
操作:
一、理解网卡
NAT网卡
通过和宿主机交换信息,宿主机和外网相连的方式达到目的桥接网卡(一般为真实物理网卡)
将服务器直接于嵌入式设备相连交换信息在虚拟机中添加一个网卡,选择桥接模式
在Windows的虚拟网络编辑器中选择正确的网口
二、人工指定网络IP
三者的网段要一致
- 设置Ubuntu的ipv4网络(机器码设为11)
- 设置Windows的ipv4网络(机器码设为10)
- 设置开发版网络(机器码设为9)
1
2setenv ip 192.168.1.9
setenv gateway 192.168.1.1 - 实现互ping
Day2开发环境的进一步建立
在Windows端配置软件
- MobaXterm 用于登陆Linux命令终端 (可以直接在虚拟机操作,但它也可以连开发版,切换方便)
- Source Lnsight 用于编程 (轻量级阅读代码)
- FileZilla 用于与Linux文件互传 (VMtools不是可以直接通过拖拽吗,要它何用?)
在Linux端配置软件
- tftp(轻量级传输协议,通过网络传输文件、引导、更新固件)
- nfs(将目录挂载到本地)
- vim
BSP
配置专用gcc交叉编译器
一、将交叉编译工具放到Linux中后,环境变量添加以下几行
1 export ARCH=arm # 表示为arm架构编译文件
2 export CROSS_COMPILE=arm-none-linux-gnueabi- # 编译工具gcc的前缀
3 export PATH=$PATH:/home/book/Desktop/arm-2009q3/bin # 编译工具的bin地址
以下是代码,也可以通过vim来手动添加
1 | echo 'export ARCH=arm |
二、通过env命令查看环境变量是否设置正确
三、在交叉编译软件目录下使用.sh文件批量建立gcc交叉编译软件符号链接?是否意味着编译软件中的大量gcc需要一一对应不同的具体交叉编译情况,具体如何操作暂时存疑
配置u-boot
配置kernel内核
移植rootft根文件系统
根文件系统有镜像文件形式(内化格式)和文件夹形式
镜像形式生成根文件系统
- 创建dev、proc、sys、tmp、var、root、lib文件夹,移植一些必要的内容, 跳转到文件夹内容详情
lib为库文件,将特定的编译器下lib文件复制到此处
etc下创建profile脚本,在用户登陆时将会自动运行,示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# Global profile configuration for all users
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
# Set user-related environment variables
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\# '
PATH=$PATH
# Get the hostname
HOSTNAME=`/bin/hostname`
# Export environment variables
export USER LOGNAME PS1 PATH HOSTNAMEroot为root用户文件夹
- 进行挂载
1 | 从/dev/zero设备中读取数据,然后写入到名为rootfs.ext2的文件中,每次写入的块大小为1MB,总共写入10块,这里创建出一个空内容的镜像文件 |
- 将1中创建的文件夹导入到./rootfs/下,rootfs.ext2就已经可以用啦 ! 可以通过fastboot烧录到开发版
- 开发版在uboot命令行下输入fastboot进入fastboot状态
- Windows将根文件镜像文件放到fastboot目录,在fastboot目录开启命令行,执行fastboot flash system rootfs.ext2
文件夹形式生成根文件系统
如前面的1,将文件夹创建完就已经是完整的根文件系统
通过Source Lnsight查看内核源码
内核源码在工作中非常重要,需要熟悉如何查看它
- 在option中的file type option文件类型中添加*.s文件,这样才能识别汇编文件
- 创建new project导入源码文件夹
- 识别文件时勾选add all且递归所有子目录
- 再在project下Synchronize Files中勾选强制重加载所有文件
- 在search中点击Browse Project Symbols,就可以在project files中选择要查看的源文件
将通过串口使电脑连接开发版
目的:使Windows通过串口将指令发送到嵌入式开发版设备
操作:
- 用串口线连接两台设备
- 通过MobaXterm创建新的session,选择Serial,完成配置后开机开发版
通过nfs将开发版的目录挂载到ubuntu中
目的: 挂载操作使得开发效率大大提高
操作:
嵌入式设备nfs配置
由于使用的嵌入式设备X210是已经配置过,因此只需要学会阅读信息即可
使用命令printenv打印信息
1 | x210 # printenv |
可以看到设备1.88被设置为从1.141这个服务器下载/root/rootfs/rootfs_test目录下的文件,因此我们的服务器ip和目录都应该相应设置正确
ubuntu配置nfs
首先,我们需要创建/root/rootfs/rootfs_test目录
1 | mkdir -p /root/share_nfs |
然后,将这个目录设置为允许1.88访问的nfs的服务器目录,重启服务
1 | echo '/root/share_nfs 192.168.1.88(rw,sync,no_subtree_check)' >> /etc/exports |
最后,进行挂载操作
share_nfs为本地文件夹路径
1 | sudo mount -t nfs 192.168.1.88:/root/rootfs/rootf_test /root/share_nfs |



