嵌入式系统调试(一)

前言: Android开发时,有了adb,就能在PC Shell或者Eclispe Debug窗口看到调试信息从而定位Bug。Android系统提供的调试手段很强大,Linux也是,但是对没有移植这些成熟的嵌入式系统开发板来说,实现嵌入式系统的调试,从工具到方式,都需要自己动手搭建。一套调试环境包括:

  • 上位机软件:比如串口调试助手,secureCRT
  • 调试接口:比如UART,SPI, I2C
  • 调试信息:比如内核信息,应用程序信息

调试信息的传送

内核运行产生的信息,通过printf函数输出到一个虚拟文件,再通过读取文件获得这些信息。所以文件读写,就是嵌入式系统调试的“传送门”。但文件读写必然会降低速度,影响内核和驱动性能。因此,程序里的print都会通过#if#endif 在编译时判断生成的是Debug版本,还是Release版本。通常,printf调试信息时还会附加上时间,进程,线程,优先级等附加信息便于分析。在内核中实现print函数时,也#define了Log的优先级 。

文件读写只是最简单最基本的调试手段,而像Android的adb,Linux的gadb,还能够实现断点、单步跟踪、堆栈分析、CPU性能分析等功能。只是这种强大的调试工具开发起来,也就不仅仅是向内存中读写文件,宏定义几个优先级就可以实现的。参考[5]中简单介绍了两种成熟的调试方案设计的方式,涉及硬件调试电路的设计和外接辅助调试设备。但无论adb还是gadb,都是从三个角度设计:

  1. PC上通过adb跟踪调试
  2. 嵌入式上运行adbserver
  3. adb和adbserver有规范的通信协议,通信方式可以选择无线或有线

实时嵌入式操作系统的原始调试方式

对于实施嵌入式操作系统,因为中断和任务抢占机制,单步、断点等方式是行不通的,会影响到其它现成正常运行的信号量。调试需要频繁修改,编译程序。一个大点的工程编译、烧录到Flash会耗费老多时间。原始调试方式降低30%生产力。

通用嵌入式操作系统的先进调试方式

IAR+JLINK、adb

其它

参考[4]中介绍了6种嵌入式(手机、平板)调试的手段,其中控制台信息重定向(到文件),UART+secureCRT,adb(USB或Wifi)都是我常用的。然而,还可以通过JTAG+trace32直接查看寄存器或内存,dump整个内存+trace32…


如果Linux下有gdb这样的调试工具,rtos上一定也存在,找到这样的开源库,交叉编译得到可以在开发板上运行的调试工具(除非内存和flash充足)
可以将类似的gdb,gdbserver分开


参考资料

[1]. 嵌入式Linux的调试技术
[2]. 说说嵌入式调试方式
[3]. 嵌入式开发调试方法
[4]. 嵌入式调试手段
[5]. IBM Developer: 嵌入式系统的调试

你可能感兴趣的:(嵌入式)