学习知识|如何学习嵌入式开发( 十 )


以上这些知识 , 往往需要较长时间的学习和积累 , 需要亲自参与实践的机会 。 对于刚刚接触嵌入式系统硬件开发的学生来讲 , 一般不可能全部了解这些知识 , 但也不会是通通一无所知 。 笔者结合自己开发和教学的经验认为:首先应该选定一款主流且较为简单的嵌入式系统处理器 , 比如基于ARM7TDMI 内核的AT91M40800,S3C44B0 等嵌入式系统处理器 , 学习32 位RISC处理器的编程模型 , 指令集 。 高校教学中 , 单片计算机课程一般以8051系列单片为核心讲解 , 由于现代32位处理器的结构和开发方式同8位单片机有着较大的差别 , 学习者还是需要花一点力气来研究以下32位处理器的 。 以ARM处理器为例 , 学习者就需要理解处理器的多种工作模式 , 备份寄存器 , RISC 指令集的特点 , MMU 和虚拟地址 , 中断处理过程等内容 。 在学习指令集的过程中 , 最好能够每学习几条指令 , 就使用这几条指令在模拟器上实验以下 , 观察处理器执行的结果 。 这个过程一方面是学习者对于指令本身的学习能够取得一个比较好的效果 , 另外也是对开发工具本身的一种学习 。 接着 , 就可以开始学习片上资源的使用和配置方法 。 这时就需要一个方便使用的开发板 , 学习者能够通过JTAG仿真器将开发板同调试PC机相连 , 进行程序的下载 , 调试 。 特别是要仔细研究系统的初始化过程和中断处理的过程 。 在开发过程中如果遇到问题 , 应自己分析问题产生的原因 , 通过分析缩小问题可能产生的范围 , 最终找到问题的所在 。 最重要的就是要保持一种解决问题的信心 , 面对困难如何处理 , 往往能够决定最终系统是否能够调试成功 。 然后 , 学习者可以开始仔细学习处理器同存储器的连接 , 存储空间的配置 , 各种外扩器件 , 如网卡 , AC97声卡的工作原理和使用方法 。 嵌入式系统硬件设计中往往需要使用可编程器件 , 学习者还需要一定的时间来学习使用常用的可编程器件(CP L D / F P G A) , 常用的有Xilinx和Altera公司的产品 。 进行系统硬件原理图设计 , 就需要使用原理图设计的EDA工具 , 常用的EDA 原理图设计工具主要包括Cadence公司的Capture , Protel公司的Protel99SE等 。 接下来就可以参照评估板的电路图 , 根据系统的设计要求 , 开始进行原理图的绘制了 。 在原理图绘制过程中 , 一定要搞清评估板电路连接的原因 , 对于一时没有搞清楚的问题切不可蒙混过关 。 例如 , 有些处理器的地址线是以字节位单位的 , 而另一些处理器的地址线则是以两个字节为单位的 , 当连接16位的存储器的时候 , 切不可想当然的把处理器的A 0 直接连接到存储器的A 0 上面 。 另外 , 学生还应具有一定的PCB板图绘制能力 , 因为在现阶段 , 很多公司还不能完全把原理图的设计工作和PCB 的绘制工作分开 , 往往要求硬件设计人员既能进行原理图设计又能进行板图设计 。 即使是PCB设计和原理图设计分开的公司 , 也需要原理图设计者能为PCB 的设计者对于不同的信号提出布板要求 。
3.驱动程序和操作系统移植工作
现代嵌入式系统的开发同传统8位单片机系统的开发相比 , 一个显著的区别就是嵌入式操作系统的广泛使用 。 在拿到焊接完毕的电路板 , 并进行基本的测试后 , 就要进行驱动程序和操作系统的移植工作了 。 首先要进行的Bootloader的编写和移植工作 。 Bootloader相当于PC系统的BIOS 。 对于有些嵌入式操作系统 , 如uc/OSII没有bootloader同样可以开发调试 。 但是对于WindowsCE和嵌入式linux系统而言Bootloader就是必须的了 。 本文以Windows CE 为例 , 做一个简要的说明 。
Windows CE 系统的移植工作主要就是BSP(板级支持包)的开发过程 。 BSP将具体的硬件差异同操作系统的核心隔离开来 , 主要由Bootloaer , OAL(OEMAbstraction Layer)和设备驱动程序三部分组成 。 WindowsCE系统中Bootloader叫做Eboot 。 Eboot被写入系统的引导Flash 。 系统启动时运行Eboot , 完成通过网卡将调试PC 机中WindowsCE 操作系统映像下载到目标系统的SDRAM中并开始执行的功能 。 对于一个系统移植人员 , 首先需要阅读文档 , 了解WindowsCE系统Bootloader和BSP的基本概念和开发过程 。 (呵 , 还要做这工作啊 , 我还没想到(初学^_^))Windows CE的开发系统Platform Builder提供了详细的文档和例程 , 开发人员需要仔细的阅读文档和例程 。 搞清楚各个函数之间的调用关系 。 在开发过程中的一个重要的步骤就是打通串口 , 使得目标板能够通过PC机串口向调试PC 机发送数据 。 由于ARM系统的仿真器比较昂贵 , 而且操作系统的调试往往不使用JTAG调试器进行单步调试 。 所以能从串口观察程序的执行过程和结果对于调试就显得十分重要了 。 串口打通之后一个比较棘手的问题就是网卡芯片的调试 。 刚刚接触嵌入式系统开发的人往往没有直接在寄存器级上使用网卡芯片的经验 , 而网卡芯片的说明一般都较为简短 , 这就要求开发者学习一些以太网的基础知识 , 对以太网的MAC 层有一个基本的认识 。 另外 , 各种网络调试(抓包)工具的使用也能大大降低系统调试的难度 。 系统的OAL需要根据具体硬件的不同做出相应的修改 , 这个部分可参照文档进行 , 在调试过程中根据串口的信息分析出错的地方 。 要充分发挥跨文件字符串搜索工具的功能 , 在浩如烟海的源文件中找到出错的位置 。 当然 , 随着开发者对系统文件目录结构的熟悉和了解 , 错误定位的速度会不断加快 。 WindowsCE 的驱动程序相对而言是比较好写的 。

推荐阅读