没有说句的过程,但是我真的很希望能够在代码的某些位置设置断点和单步执行。显然存在一些设置问题。有什么想法吗?
更新:
我有很多东西要学习,发现很多错误。
首先通过终端使用OPENOCD
您真的需要停止目标才能访问arm中的寄存器
好像我也拥有JTAG速度高
被测设备已打开WDT。现在关闭该选项,我可以暂停目标并查看正确的寄存器。我可以看到发生了这种情况,因为它将开始很好地读取PC,但是到降低注册表时,它将读取所有F。DUT已缓存并启用了MMU,因此尽管我可以暂停目标,然后重新启动总是以数据中止而告终。在ocd中查看arm11.c似乎有很多存根尚未实现,无法打开缓存。我已经尝试过在恢复之前刷新缓存,但仍然会中止数据。需要进行更多调查,但如果有任何建议,请告诉我。
到目前为止,谢谢您的帮助,这肯定是一种学习经验。
#1 楼
事实证明,用于ARM11的openocd中存在一些错误。我最终进行了一些更改,以使其按照手臂规范运行:在
arm11_debug_entry
中打开数据的流失中止。检查应该是:
if (!(dscr & DSCR_STICKY_ABORT_IMPRECISE))
然后在C1控制寄存器之前添加以下代码
/* Enable Debug Cache write back, and disable line fills */
/* mcr p15,7,R0,c15,c0,0 */
retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xeeef0f10, 0x07);
if (retval != ERROR_OK)
return retval;
现在我保存然后恢复C1控制寄存器
/* Read Modify write control register 1 to disable MMU/Cache etc. Store to reprogram upon return */
/* MRC p15,0,R0,c1,c0,0 */
arm11_run_instr_data_from_core_via_r0(arm11, 0xee110f10, &cntrlregval);
if (retval != ERROR_OK)
return retval;
arm11->saved_c1cntrl = cntrlregval;
/* Perform Modifications */
/* MCR p15,0,R0,c1,c0,0 */
retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xee010f10, cntrlregval);
if (retval != ERROR_OK)
return retval;
在
arm11_leave_debug_state
/* disable debug cache write thrus, etc */
retval = arm11_run_instr_data_prepare(arm11);
if (retval != ERROR_OK)
return retval;
retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xeeef0f10, 0x00);
if (retval != ERROR_OK)
return retval;
/* re write Coprocessor control */
retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xee010f10, arm11->saved_c1cntrl);
if (retval != ERROR_OK)
return retval;
retval = arm11_run_instr_data_finish(arm11);
if (retval != ERROR_OK)
return retval;
我会尽力让这些更改生效,以便其他人不会遇到我的问题。
#2 楼
考虑到您想单步执行,迟早要暂停处理器,是什么让您现在无法尝试呢?我正在尝试设想,如果正在运行的程序使总线保持使用状态,那么JTAG单元将如何检查内存?我希望TAP可以在处理器运行时访问某些边界单元,因为它们基本上是复制/镜像的值,但是其他内存我不知道。
我建议停止目标,然后再试一次。对我来说,最有意义的是IDA仅在具有控制权时才可以查询并接下来正确显示CPU寄存器和内存的状态。
评论
您可以在此处发布OpenOCD输出,telnet命令行的输出以及您在GDB中使用的命令吗?我不是OpenOCD的专家,可能是错误的,但是在许多目标上,我认为您必须进入调试模式才能执行此操作,这涉及到暂停处理器。