嵌入式概念:
是应用为中心,以计算机技术为基础,软硬件可裁剪,对功耗、体积、可靠性、成本都有严格要求的专用计算机系统。
内存寻址
- 独立寻址:片内片外存储器只能选择其中一个(芯片内部有标志引脚,使用高低电平来表示读取片内或者片外)
- 统一寻址:片内片外存储器都能使用,且使用的是同一片连续的寻址空间。
软件怎么访问硬件设备
- 软件==》 内存 ==》 内存映射 ==》 硬件控制寄存器 ==》 硬件
- 怎么直接通过内存地址实现对串口(uart)数据的发送
- 通过原理图结合开发板找到与PC相连的串口uart0
- 通过数据手册查找uart0的发送数据寄存器地址映射到了内存什么地址
- 发送数据地址为:0xc00a1020
- 向0xc00a1020写入数据完成发送,数据值最好大于32(空格),小于32也可以发送,只是不可见
- mw 0xc00a1020 0x41(A)
裸机开发的基本特点
- 没有操作系统(Linux)
- 不使用带有系统调用的标准C库
- 大量使用物理内存地址进行数据操作
- 如果要用到库函数,需要自己去实现
- 将编译和链接分步骤完成,实现对可执行程序的指定链接,并指定连接地址
- Linux 操作系统一般支持可执行文件格式elf,在裸机环境下不好使
- 需要将elf格式裁剪成纯净的二进制可执行文件
- 将纯二进制文件下载到链接时指定的物理内存空间,修改PC指向开始执行
程序的编译链接过程分解
- gcc -o main main.c 可以分解成以下步骤(可执行程序main的隐藏后缀是 .elf)
- gcc -E -o main.i main.c
- gcc -S -o main.S main.i
- gcc -c -o main.o main.S
- gcc -o main.elf main.o
安装交叉编译器
裸机代码编译流程
只编译不链接:arm-linux-gcc -c -o t.o t.c
链接并指定地址:arm-linux-ld -o t t.o -Ttext=0x48000000
链接并指定地址(修改程序入口函数):arm-linux-ld -o t t.o -Ttext=0x48000000 -e main
Boot 概念
启动引导,自举程序
由于boot设计比较偏底层,所以根据CPU架构和OS类型可能有所不同
uboot是对CPU架构和OS类型支持得比较多的一种开源引导程序
s5p6818启动流程
- 芯片最初是从iROM启动,叫BL0
- iROM选择启动的下一阶段引导程序BL1
- 单阶段启动:如果BL1可以完成内核加载,这就是单阶段启动
- 多阶段启动:启动加载内核的工作由BL2之后的程序完成,这就是多阶段启动
- 为什么BL1不直接加载到DDR
- SRAM比DDR更快
- DDR需要初始化,而SRAM不需要(总线结果不需要初始化,直接拿来就能使用)
BL1启动Bootloader第二阶段BL2
BL2启动内核
内核加载根文件系统
引导传参
- 所传数据结构必须约定一致
- 引导程序与内核之间必须约定一个参数存放的地址DDR Base+0x100(0x400000100)
- 数据格式约定一致
- 比如用户传给内核的参数:
- bootargs root=/dev/mmcblk0p8 rw rootfstype=ext4 init=/linuxrc lcd=wy070ml tp=gslx680
uboot介绍
- u-boot最初是由PPCBoot发展而来的
- u-boot已经成为当前主流引导程序
- 官方引导程序由于与硬件平台差异,所以并不能下载直接运行(需要经过调试和修改及移植)
- 编译uboot
- 源码获取:
- 下载地址:http://git.denx.de/?p=u-boot.git;a=summary
- 从芯片原厂获取配套的BSP
配置编译uboot
- 进入uboot源码目录:cd u-boot
- 清除编译痕迹(只是第一次做):make distclean
- 编译前配置成目标平台:make 6818_config
- 编译源码:make
- 编译完成后在源码根目录下会生成镜像:ubootpak.bin
镜像烧录
- 找到官方提供的标准镜像
- boot.img
- gtkfs.img
- ubootpak.bin
- 开发板开机进入uboot命令行模式
- 执行下载命令:fastboot
- 插入miniUSB下载线
- 如果打开了虚拟机,要确认USB连接到物理主机
- 在PC设备管理可以发现Android device并确认是否安装驱动
- 未安装驱动则需要重新安装,安装完驱动后重新插拔USB线
- 修改下载脚本文件
- REM表示注释一行
- 下载uboot:fastboot flash ubootpak ../linux_image/ubootpak.bin
- 下载内核:fastboot flash boot ../linux_image/boot.img
- 下载根文件系统:flash gtkfs ../linux_image/gtkfs.img
- 可写脚本完成三步下载
- 下载完成,开发板提示: Flash : ubootpak - DONE
- 下载完成后,Ctrl+C退回到命令行,获直接重启开发板即可