扫自己的盲,给别人看。 依然源自《主流ARM嵌入式系统设计技术与实例精解》
*******************************************************************************
关于开发工具和调试
*******************************************************************************
关于硬件调试
工具箱:万用表,示波器,电烙铁等
调试方法,注意模块化
1) 一般从电源供电部分开始,最好单独调试这一块,比如有可能的话切断对后
端负载的供电,保证各路供电电压正常,然后用示波器测试各路供电电压的纹
波,一般在50mV以内都算正常。
2) 然后接上负载,测量各处晶振的工作情况。无源晶振一般波形近于正弦波,
有源晶振多近于方波。
3) 调试最小系统,确保JTAG部分的连接正确,测量Flash和SDRAM上的时钟信号,
执行Reset操作测量CPU的Reset信号。如果工作正确,使用适当软件可以烧写Boot
Loader了。Boot Loader启动以后就可以通过某个特定外设来烧写文件系统和内
核了。
4) 根据具体应用对各外围子系统分别进行调试。
5) 整体调试
这是学究式的教条式做法,具体实践中可以灵活变通,实用为王。
工具箱
开发板(通常必须)
硬件仿真器(可选)
下载调试工具(JTAG)(必须)
开发编译环境(必须)
编译器arm-linux-gcc
汇编器arm-linux-as
链接器arm-linux-ld
库管理arm-linux-ar
版本管理 CVS, SVN, GIT等
LDS链接脚本,Makefile等(略)
*******************************************************************************
关于启动
*******************************************************************************
Boot过程,一般包括
大小端配置,ARM一般默认为小端格式,但是可以配置为大端格式。一般在上电时确定
外围内存接口配置,通常对Flash的初始化代码一般都位于bootloader里
启动模式选择,一般是通过硬件连线来确定的,比如从哪个位置以16位还是32位启动
内存地址重映射,主要是由于异常向量入口需要重映射。
关于内存重映射
CPU设计人员为了简化芯片设计,一般将所有异常入口集中放置在非易失性存储器中,
并在系统上电时将其映射到一个固定的连续地址空间上。由于读取非易失性存储器的
速度限制以及可能的位宽不匹配问题引入的性能问题,所以引入了重映射技术。就是
对已经确立的存储器映射再次修改,即重新分配地址资源。MAP发生在系统上电的时
候,REMAP则在系统上电稳定后发生,并且REMAP并不是必须的。
REMAP一般开始于系统的Boot Loader,一般是Boot Loader将非易失性存储器中的异常
向量复制到主存中,然后执行REMAP命令,将位于主存的异常向量块映射到以称向量表
地址空间上。这样以后系统产生的异常处理将从主存中开始执行。
*******************************************************************************
关于Boot Loader
*******************************************************************************
一般基于ARM处理器的Linux嵌入式开发,基本都是硬件板卡设计和软件系统设计同步进行。
硬件准备好之后,首先要将Boot Loader,内核,文件系统等移植到硬件系统上。最先一步
就是要移植Boot Loader先启动系统。
Boot Loader的主要工作:初始化板上硬件,收集硬件资源信息以提供给操作系统,引导、
加载操作系统。
常用Boot Loader,可以参见wikipedia上关于它的介绍,要选择适用于嵌入式系统的。
http://en.wikipedia.org/wiki/Comparison_of_boot_loaders
这里只介绍U-Boot,目前该项目位于:
http://www.denx.de/wiki/U-Boot/
关于U-Boot
Universal Boot Loader,历史渊源可以去看它的网站上的介绍。最大特点在于对众多处理
器架构的支持。
U-Boot提供两种模式,启动加载模式(boot loading)和下载模式(downloading)。
U-Boot提供了大量功能,包括以太网支持,BOOTP/TFTP,在线读写FLASH等外设,串口支
持,识别多种二进制格式(ELF32,pImage等),脚本支持,监控等。
U-Boot常用命令
1) 打印环境变量, printenv
2) 设置环境变量, setenv
3) 保存环境变量, saveenv
4) 通过串口下载, loadb
5) tftp网络下载,一般要先设置网络环境,然后通过网络下载映像文件到特定位置
U-boot> setenv ethaddr xx:xx:xx:xx:xx:xx
U-boot> setenv ipaddr xx.xx.xx.xx
U-boot> setenv serverip xx.xx.xx.xx (tftp server address)
U-boot> tftp xxxxxxxx kernel.bin
6) 内存操作命令:md, mm, nm, mw, cp, cmp, mtest
7) 闪存操作命令:protect, erase, flinfo
8) 文件系统命令:fatls, fatload, nfs
9) 脚本: run, bootcmd
a) CPU控制命令:go, bootm, bootp, kgo
b) 其他命令:usb, help, ?, ping
一般Boot loader的工作流程
1) 系统复位
2) 从复位向量地址开始执行,通常是某cpu下面的Start.S汇编代码。这里完成定义
异常向量表(需要关中断),初始化SDRAM,配置CPU模式,初始化工作时钟等
3) 把启动代码复制到RAM中,然后进行地址重映射,然后开始执行启动例程(一般用
C编写),这里初始化各种将要用到板上外设。
移植U-Boot主要是针对特定板子的移植,包括闪存、内存配置,串口配置等。如果有需要
在boot阶段需要启动的特殊硬件模块,那么需要自行添加对应的驱动支持。具体来说一般
需要移植如下几块:
CPU初始化部分,包括工作频率,时钟模块,大小端配置,Cache初始化
内存(SDRAM和FLASH)初始化,对应的接口寄存器设置各个参数,Flash初始化
常用必备外设接口初始化:串口、网卡接口、GPIO接口等
启动参数修改
链接编译的地址分配,主要在.lds文件中
编译参数的修改,主要修改Makefile文件