2012-01-06 81 views
4

我正在使用at91sam9260进行我的开发。有一个Linux内核运行在它上面,我开始自己的软件。我可以使用JTAG在嵌入式Linux上调试我的程序吗?

我想知道如果我可以使用JTAG调试器来调试我正在使用的软件,而没有看到Linux内核上发生了什么?

我在问,因为我认为在查看完整的Linux执行过程中调试我的软件可能会变得非常复杂。

换句话说,我想知道在使用JTAG探头进行调试时是否可能存在一些抽象层?

回答

2

一般来说,您可以将jtag作为调试器,与您在该处理器上运行的软件完全无关。例如,如果您停止处理器想要更改RAM中的某些指令并重新启动,则ram中的指令更改是数据访问,它不会通过指令高速缓存,而是通过数据访问缓存,如果你有一个单独的指令和数据缓存,它们被启用,并且你修改的一些指令位于指令缓存中的地址,你可以很快地将新的和陈旧的指令送到处理器。 Linux喜欢在那里使用缓存。

其次是mmu,处理器/ jtag很可能在mmu的处理器端而不是物理地址上运行,所以根据硬件的工作方式,例如,如果您通过地址设置断点处理器中的调试单元和操作系统任务在相同的地址空间切换到另一个程序/线程时,您将在错误的程序的正确地址断点。如果调试器/处理器通过修改ram中的指令来设置断点,那么您会遇到上面的缓存问题,如果没有缓存,那么您将在正确的线程中断开正确的指令,但是那样会导致缓存问题。

如果处理器支持基于jtag的调试,但不会根据您选择在该处理器上运行的任何软件进行更改,那么绝对是底线。

+0

感谢大家的回答。你可能是对的,告诉我使用另一个更合适的调试器在Linux内核之上运行。实际上,我目前也正在尝试通过uart使用gdb来调试我的程序。这比我想象的要复杂一点。无论如何,再次感谢。 – nomoney29 2012-01-09 08:03:20

+0

不同意:即使除了虚拟内存,调试在多任务内核下运行的应用程序代码如果驱动调试器的软件没有意识到(或者最好是合作)内核,它可能会非常难看。通常,这些程序使用内核中的调试功能(例如ptrace)和目标上运行的调试存根进行调试,并通过数据接口进行通信。硬件调试器对于调试内核本身更为有用,尤其是它的初始启动。 – 2014-03-12 21:29:07

2

这取决于JTAG设备,它是驱动程序。就我个人而言,我只知道一个能够做到这一点的设备:XDS560 + Code Composer Studio(CCS)。但是,也可以有其他的。

我建议咨询您设备的制造商。

3

可能不是 - 据我所知,大多数JTAG调试器都假定能够在处理器中设置断点。在多任务操作系统下,也会停止操作系统内核。

像QNX这样的嵌入式操作系统的调试器在OS内核之上运行,并且通过以太网进行通信。

0

对于ARM,Asset Arium系列为claimed以能够调试应用程序代码。虽然我没有尝试过。

相关问题