- 论坛徽章:
- 0
|
使用GNU工具来来发OS,以及其上所运行的应用,一个重要的功能就是调试,而GDB中一些重要的调试命令是需要OS支持的,比如"info thread"这条命令。一般来说,要实现嵌入式OS对GDB的支持,最大的工作就是GDBServer中与OS相关部分的实现,比如刚才提到的"info thread"就需要GDBServer按照GDB Remote Serial Protocol协议中的定义,向Target的DEBUG通讯寄存器(ARM920T中的CP14协处理器中的寄存器)写命令("qfThreadInfo"),OS接受到此信息后,将所有Thread信息通过DEBUG通信通道传输给GDB。而以此为基础实现的newlibc则可以支持Target对Host机器的I/O操作,比如printf, fopen, fread等。但遗憾的是JLINK的GDBServer文档中没有与这些相关的描述,网上也没有类似的信息,因此这个想法目前是没有可能了。唯一可能的是是使用OpenOCD这个Debug软件,它是开源的而且也实现的GDBServer,网上也有一些爱好者在探讨类似的问题,不过目前还没有相应的实现,另外一个难题就是OS与GDBServer的通信,虽说硬件DEBUG通信通道已经存在了,但是OS怎么去检测GDBServer的请求目前还未知,或许有一个特殊的中断可用(2440datasheet好像没有这样的描述)?或者是GDB直接Pause机器,然后在下一个指令处插入一条特殊的SWI命令,来完成请求(如果是这样,那么没有实现这个接口的OS在调试时遇到请求就会崩溃。)?而OS内嵌的GDBServer可以采用上一种方式来实现对动态加载的Task的调试。
另一种实现方式就是通过修改GDBServer代码或者是GDB脚本来实现info thread,前者需要在GDB中直接定义好Task的数据结构,以及Task的队列指针,这种方法工作量大,而且不易维护,但是速度快,但是OS内核不需要做改动(在使用ST40系列开发板时,其OS21操作系统中有一些GDB相关的代码,但是没有显示实现的GDB Remote Serial Protocol,其实现原理不得而知)。后一种方法很灵活,但是速度比较慢,而且GDB脚本开发貌似懂的人也是很多,GDB脚本能否支持复杂的程序结构也不得而知。
总之,要实现GDB对特定操作体统的支持,确实不是件很容易的事情,也只有一个国际大公司,才有这个财力和精力去搞这些东西来完善其产品的开发工具。
不过,通过DEBUG通信通道移植newlib实现HostI/O操作应该不算太难(Target主动发送信息,主动接受数据),等哪天有时间了,再好好研究一下(据说只要实现5个函数就可以了)~
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94507/showart_1985637.html |
|