嵌入式系统:
以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗
有严格要求的专用计算机系统。
//专用的计算机系统,特点:软硬件可裁剪
嵌入式系统 = 软件系统 + 硬件系统
嵌入式软件系统
分类:带操作系统与不带操作系统
常见的嵌入式系统
安卓系统,linux系统,ios系统,vxworks,ucos
linux系统移植要点
搭建开发环境
bootload的选择和移植
kernel的配置、编译、移植
根文件系统的制作
工具集
gcc 编译器
arm-linux-gcc 交叉编译器
readelf 查看elf文件格式信息
file 查看文件类型
size 查看文件段大小
nm 查看符号表
strip 丢弃目标文件中的全部和特定符号,减小文件体积
strings 输出文件中可打印的字符串
objdump 反汇编
objdump 文件名 -sl > 目标文件
addr2line 地址转换出对应的行号
启动流程
上电-->uboot->kernel-->rootfs
Bootloader
Bootloader是硬件启动的引导程序是运行操作系统的前提;
在操作系统内核或用户应用程序运行之前运行的、小代码段。
对软硬件进行相应初始化和设定,为最终运行操作系统准备环境等
在嵌入式系统中,整个系统的启动加载任务通常由Bootloader来完成
Bootloader不属于操作系统,一般采用汇编语言和C语言开发。需要针对特定的硬件平台编写。
uboot
1.获取源码、编译环境
2.搭建好交叉编译环境
3.uboot是否支持板子的芯片(arch/$ARCH/cpu/cpu_type)
不支持解决思路:寻找新的uboot、找芯片厂家提供
4.uboot是否支持板子的外设(board/)
不支持解决思路:寻找新的uboot、找板子厂家提供(找相同芯片的板子)
5.编译
借鉴origen --> fs4412 源码+头文件
配置项添加
编译环境的设置 X86 ----> 修改Makefile 编译项----> arm-linux-
make distclean 防止前面其他板子的配置项干扰
make fs4412_config
make ----> u-boot.bin
6.烧写
公司提供的烧写方式
7.验证
看现象 思考 修改
现象:uboot烧写后,没有任何反应
思考:uboot是否为第一个程序 / 程序运行了一部分,就结束了 / 程序没有运行 / 硬件出问题了
没有运行-->cpu-->芯片手册寻找其启动流程-->
iRom-->bl1-->bl2--uboot
| soc | emmc |
解决:bl1+bl2+uboot-->u.bin
现象:灯亮了,灭了,循环
思考:亮-->程序开始-->灭-->板子复位
程序异常-->复位信号-->电源模块-->板子复位(寻找哪里出问题)
| 没问题 | | MRB high reset 不产生|
现象:灯常亮,交互界面没反应
思考:板子不复位, 界面<-->串口<-->板子
|-->驱动init
|-->驱动里面有第三方的参数
现象:界面有显示,tftp、ping无法使用
思考:程序没有命令-->猜测有-->commom找命令 cmd_*.c-->cmd_net.c-->ping有-->有宏开关
解决:把宏开关打开-->借鉴,看别人如何解决-->板子头文件声明打开
现象:命令有了 ping,但是卡住了
思考: |-->阻塞(等待资源等待不到)
|-->网络设备
|-->驱动没有调用
解决:借鉴别人
现象:ping能执行,但50000000有问题
思考:50000000-->sromc-->借鉴sromc init
现象:ping tftp都能使用,下载kernel,bootm启动
内核(kernel)
uImage(内核:源码)
xxx.dtb(设备树:配置)
内核:操作系统内部核心(设备管理、电源管理、进程管理、驱动、文件系统等)
完整的操作系统:人机交互的界面(命令行、图形界面)
lib(应用需要的库)
文件(根目录、配置文件等)
设备:板子厂家提供(设备相关->配置 设备驱动-->源码)
1.获取源码 kernel
2.支持芯片(arch/$ARCH/configs)
不支持:高版本 找厂家
3.支持板子(arch/$ARCH/boot/dts)
不支持:高版本 找厂家 找相同芯片的板子借鉴
内核移植流程
1.获取源码、交叉编译环境
2.uImage编译
2.1确认芯片是否适配 arch/$ARCH/configs/ exynos_defconfig
2.2Makefile --> ARCH=arm CROSS_COMPILE=arm-linux-
2.3make exynos_defconfig //修改默认配置为芯片所匹配的 覆盖.config
2.4make menuconfig //功能的增加、删减
2.5make uImage --> uImage
3.dtb编译
3.1确认板子是否匹配 arch/$ARCH/boot/dts/
3.2 cp exynos4412_origen.dts exynos4412_fs4412.dts
3.3Makefile --> origen.dtb --> fs4412.dtb
3.3make dtbs -->exynos4412_fs4412.dtb
4.验证
uboot --> kernel
现象:正常运行,但网络设备找不到
思考:设备没有-->去设备树找网络设备是否有
|-->没有-->借鉴有的
现象:网络还是没有
思考:系统还是不认识设备
|-->驱动是否存在-->驱动没有-->make menuconfig 增加
网络文件系统 nfs
nfs server 设置
1.安装sudo apt-get install nfs-kernel-server
2.准备目录:在家目录下,任意目录里面,解压 rootfs.tgz -->记录rootfs目录
3.配置nfs sudo vi /etc/exports -->rootfs 目录 *(rw,sync,no_subtree_check,no_root_squash)
4.重启 sudo /etc/init.d/nfs-kernel-server restart
uboot 配置
set bootargs root=/dev/nfs nfsroot=192.168.9.14:/home/hqyj/zz/rootfs/rootfs,v3 rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.9.15
tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000