使用的是Atmel公开的JTAGICE mkII的USB接口协议(外加自己**的一些和调试有关的协议),并使用2004年,国外**的JTAG调试协议。 虽然解决了一些问题(能够在main入口中断(使用PSB0断点),能够让AVR核心执行特定的指令,能够操作OCDR调试寄存器,能够读取IO口和SRAM中的数据(数据未验证)),但是还有不少待解决的问题: 1.JTAG调试时,读取的Flash并不成功,读取到的数据不对: // Read Flash Bytes void AVR_JTAGOCD_ReadFlash(uint16 addr,uint8 *buf,uint16 len) { uint16 i = 0; uint8 ocdr[2];
// Z = addr AVRI_LDI_Rd_K(31,(uint8)(addr >> 8)); // 验证OK AVRI_LDI_Rd_K(30,(uint8)(addr & 0xFF)); // 验证OK
for(;i < len;i++) { // LPM R16,Z+ AVRI_LPM_Rd_Zp(16); // OUT OCDR,R16 AVRI_OUT_A_Rr(ucIDRAddress,16); // Read OCDR AVR_JTAGOCD_ReadOCDR(ocdr); buf = ocdr[1]; } } 验证方法: // LDI R31,0xA5 AVRI_LDI_Rd_K(31,0xA5); // OUT OCDR,R31 AVRI_OUT_A_Rr(ucIDRAddress,31); // Read OCDR AVR_JTAGOCD_ReadOCDR(ocdr); 之后检测了ocdr的数据,确实就是前面LDI进去了
2.程序Break后(可能是发送了JTAG接口的Break命令,也可能是程序执行到了OCD设置的断点,也可能是程序执行了Break指令),马上读取PC指针,确实如协议所说的值,但如果在读取之前,执行了其他JTAG OCD操作(如果读取OCD寄存器等),会使得之后读取的PC指针增大(多一次操作增大1)。另外,使用AVR核心执行RJMP来修改PC值,之后读取PC值发现所做的修改并没有生效
3.JTAG High Level的单步调试怎么进行? High Level的单步调试命令在调试C语言时,由AVRStudio发送,但并没有设置中断,怎么判断哪些指令是当前要Step的C语句对应的指令? ...... |