开发新嵌入系统时的工具序列和步骤
from: http://www.lslnet.com/linux/docs/linux-3073.htm
一个最小的嵌入式系统仅需如下基本组成部分:
1 : 一个用作引导的可用设施(工具);
2 : 一个具备内存管理,进程管理,和定时器服务的Linux微内核;
3 : 一个初始进程;
为让上面的最小嵌入式系统变得有一定实用性,尚需加上一些东西:
1 : 硬件的驱动程序;
2 : 一个或几个应用进程以提供必要的应用功效.
随着对系统要求的增加,也许还要用到下面这些组件:
1 : 一个文件系统(或许放在ROM或RAM中);
2 : TCP/IP 网络协议栈;
3 : 一个磁盘用来存放半易失性数据和提供交换能力.
在为一个新的硬件开发一个新的嵌入式LINUX系统时要用到的典型调试 工具的序列和步骤:
1:写出或移植一段启动代码;一个嵌入式系统的BIOS并不需要太多的灵活性,仅处理一种硬件配置方案.这些代码比较简单但也另人厌烦.它是一些把特定的数写入指定硬件寄存器的指令序列.不过这是很关键的代码,因为这些数值必须要符合你的硬件并且要按特定顺序来完成.在大多数情况下,(这些代码中)有一个最小化的加电自检模块用以检查内存,让一些LED闪现一下,也可能探测一些其它让Linux OS启动和运行的必要硬件.测试启动代码,可以使用电子仿真器(in-circuit emulator),把待测代码加载到仿真器中并通过仿真器调试它.如果没有可用的仿真器,也可以跳过这一步,不过需要一个较长的调试周期.
启动代码最终要从非易失性存储器中运行,通常是用闪存或EPROM芯片,放入的具体方法依赖于"目标"硬件和工具.一个常见的方法是把闪存或EPROM芯片插入到一个EPROM或闪存"烧炉"中.把程序"烧入"(存入)芯片中.然后,把芯片插入到你目标板上的一个插槽中,打开电源.这种方法要求在板子上具有插槽化(socketed)部分;然而,有些设备包格式(结构)不允许被插槽化(socketed). 另一种办法是通过一个JTAG接口.一些芯片包含一个JTAG接口,从而可以对芯片编程.这是一种最简便的办法.芯片可以被永久地焊接到板子上.一段电缆从板子上的JTAG连接器(通常是一个PC卡)连接着一个JTAG接口.接下来要求在操纵JTAG接口的PC上做一些用户定制性编程.在仅需较少运行量的产品中,也可以使用这种方法.
2:写一段代码在串型口上输出一字符串,像"Hello,World!"(其实,我更喜欢人类发明电话后,通过电话说的第一句话"Watson, come here I need you");
传统上,开发嵌入式系统的首选工具是仿真器。这是一块比较昂贵的设备,一般插于微处理器和它的总线之间的电路中,从而让开发者监视和控制所有输入和输出 微处理器的各种活动和行为.在装配起来,可能有一些困难,并且由于它们的侵入性,装上后可能造成不稳定 的性能;尽管这样,它们却能在总线级上给出一个系统正在发生什么的清晰的描绘并排除了很多在硬件和软件 接口最底层上的猜测工作.
在以往,一些工程项目依赖它--经常在开发周期中的各个阶段--作为主要的调试工具.不过,一旦当编制的软件 有能力支持一个串型口的时候,大量的调试可以不用ICE而使用别的方法来完成.同样,大部分新一代的嵌入式系统 采用蛮像食谱式的微处理器设计;通信工作的启动代码常常是具备的以使串型口尽快地工作,这意味着开发者能 在没有ICE的情况下也能很好地进展;去掉了ICE,从而降低了开发成本.一旦串型口可以工作起来,便能用于支持那 些日渐复杂的开发工具的相关(软件)层。
3:移植gdb目标码使之能在串型口上工作.这将允许向另一台正运行着gdb程序的LINUX主机会话;你只不过要告诉 gdb是通过串型口调试该目标程序;gdb通过串型口与你的测试计算机上的gdb目标码会话并给出全部C源码级的 调试信息.你也可以利用这一(通信)能力把附加的代码下载到RAM或闪存中.
借助gdb,执行余下的直到LINUX内核开始接管之前的所有硬件和软件的初始化代码.
4: 一旦LINUX内核启动后,上述的串型口就成为LINUX的控制台端口并可以利用它的便利来进行后继开发过程.再使用gdb的内核调试版本kgdb.这一步常常不是必需的.如果你有一个网络连接,比如,10BaseT,你或许会想让它紧接着工作起来.
如果你的目标平台运行的Linux kernel是全功能的(即:未经删减过功能),你可以利用gdb或其图形化替代品如xgdb去调试你的应用进程.