通过EHPI接口下载程序到5509a,项目中CPU和c5509a之间是16位的HPI接口,非复用模式。
下载程序的过程基本上是按照SPRA375F的顺序来做的:
1.将5509a芯片复位:reset引脚拉高;
2.通过EHPI接口将bin文件写入到EHPI接口可以操作的DRAM中:通过仿真器看memory view,从入口地址开始一个个字节比对,是写成功的。
3.将程序入口地址和非0等待标志写入0x60、0x61地址处。
现在的问题是在第3步:
从memory view上,看到0x60地址值是0x0000,0x0000。
用仿真器跟踪,程序也是一直在如下循环里。
FF80EE a4c0 MOV @#60h,T0
FF80F0 7dff0044 AND #65280,T0,T0
FF80F4 0404f7 BCC #0xff80ee,T0 == #0
但是我bin文件是有写进去的。
我map文件中是 ENTRY POINT SYMBOL: "_c_int00" address: 00002300
从仿真器看0x2300地址开始的值,一个个字节比较过去,和我的bin文件是一致的。
但是0x60地址的值却没有写进入,这是为什么呢?
我是一名新手,还希望论坛里的高手能够指点一下!万分感谢!
user5871948:
我向0x60写入的是0xff00,向0x61写入的是0x2300. 我目前的bin文件只有八百多字节(只是点亮led测试下)。
user5871948:
回复 user5871948:
我不确定字节序是不是对的,我的bin文件开头的几字节是 00 00 23 00 00 00 00 01 从memory view上看到0x2300地址开始的值是 0000 2300 0000 0001
Shine:
“从memory view上,看到0x60地址值是0x0000,0x0000。”说明host没有成功把entry point写到0x60,0x61地址,建议检查一下host那边。
user5871948:
回复 Shine:
Thanks Shine.
(1)连上仿真器,看CCS memory view,程序从FF8000开始执行的时候,0x60地址处的值是0xff00 0x2300.然而执行到FF801F这步的时候,0x60地址处的值就变成了0x0000 0x0000.
FF8000 ec314e000090 AMAR *(#00090h),XSPFF8006 ec315e000080 AMAR *(#00080h),XSSPFF800C ec316e000000 AMAR *(#00000h),XDPFF8012 4653 BSET ST1_C54CMFF8014 46b3 BSET ST1_INTMFF8016 4682 BCLR ST1_SXMDFF8018 46e2 BCLR ST1_CPLFF801A 3c01 MOV #0,AC1FF801C ebc018 MOV AC1,dbl(@#60h)——–经过这步0x60地址处的值就变成了0x0000 0x0000.FF801F e651103401 MOV #16,port(#03401h)FF8024 e651103400 MOV #16,port(#03400h)FF8029 a7513401 MOV port(#03401h),T3
我操作步骤是:开机让Host加载完毕并往0x61处写0x2300、往0x60处写0xff00后,然后再连仿真器并选择CCS的connect,这个步骤对吗?如果反过来,先连仿真器并选择CCS的connect,再Host加载完毕并往0x61处写0x2300、往0x60处写0xff00,会出现Host HPI写失败。
(2)由于执行到FF801F这步的时候,0x60地址处的值就变成了0x0000 0x0000.所以我直接操作CCS的Edit memory,将0x61h写入0x2300,将0x60h写入0xff00,然后F10单步运行,可以跑到_c_int00、_args_main,但是跑到002421这步的时候,PC突然被赋值为45cd51,程序跑飞了.
00240C _args_main:00240C 5e80_5f80 NOP_16 || NOP_16002410 000000 RPTCC #0, AC0 == #0002413 3a00 POP AC0,AC0002415 00258a RPTCC #138, T1 < #0002418 000100 RPTCC #0, AC1 == #000241B 127a00 CMPOR T3 >= AC0, TC1, TC100241E 000000 RPTCC #0, AC0 == #0002421 020012 RETCC AC0 == #0————-跑到这步时,PC跑飞了002424 bc00 MOV HI(AC0),@#00h002426 000000 RPTCC #0, AC0 == #0002429 000002 RPTCC #2, AC0 == #000242C 0012be RPTCC #190, AC2 != #000242F 000000 RPTCC #0, AC0 == #0002432 000000 RPTCC #0, AC0 == #0002435 020012 RETCC AC0 == #0002438 c000 MOV AC0,@#00h00243A 000024 RPTCC #36, AC0 == #000243D 0a0002 RPTBLOCAL #0x002442002440 0012c2 RPTCC #194, AC2 != #0002443 000000 RPTCC #0, AC0 == #0002446 240a ADD AC0,AR2
想问下:为什么跑到_args_main,执行RETCC AC0 == #0这条命令后,程序就跑飞了,是什么原因呢?
user5871948:
回复 user5871948:
没有vectors.asm这个文件,会导致执行RETCC AC0 == #0这条命令后,程序跑飞吗?
还是我的堆栈没有初始化好呢?
Shine:
回复 user5871948:
先连仿真器,然后在判断0x60,0x61是否为非0值的地方设个断点运行,host往DSP加载代码,看断点处能否停下来。
Shine:
回复 user5871948:
工程里没有vectors.asm?
user5871948:
回复 Shine:
Thanks Shine.
1.先连仿真器,然后在判断0x60,0x61是否为非0值的地方设个断点运行,host往DSP加载代码,看断点处能否停下来。
–断点处全速运行,在host加载完之后,ccs会弹出一个出错界面"仿真器连接失败,超时",然后仿真器就disconnect了。2.我的工程里没有vectors.asm.
3.想问下_args_main()里运行到RETCC后跑飞,是什么原因呢?
user5871948:
回复 user5871948:
Thanks Shine. 我现在改用-a ASCII格式,生成的ehpi16.asc总共2622字节,我去掉了最开头的5个字节,将后面的2617个字节加载到5509中。 连仿真器,通过CCS跟踪,按照如下的顺序一路跑下来: 002300 _c_int00, __text, .text: 00233B exit: 00239B atexit: 0023F1 abort: 0023F2 C$$EXIT: 0023F8 $vectors.asm:67:69$: 0023FA _register_unlock: 002402 _register_lock: 00240A _nop: 00240C _args_main: 002448 _auto_init: 0024AA DSPRunLed: 0024DB C$L1: 0024DD main: 0024EC C$L2, C$DW$L$_main$2$B: 0024F1 C$DW$L$_main$2$E: 0024F2 __etext, etext: 最后停在002D39这步,并一直循环执行这步:002D39 00921d RPTCC #29, AC2 != #0 我计算了下:002D39-002300 = 000A39 = 2617,正好是我下载的总字节数。 我有三个问题: (1)ASCII文件第一行是地址信息, 不用加载,那么:应该从asc文件的第几个字节开始加载? (2)我的main()是一个while(1)循环,但是从仿真器跟踪结果是:这个while(1)循环只执行了一遍就跳出来了, 我还是试了下把while(1)改成for()循环,也是只执行了一遍,为什么循环不起作用呢? (3)我是在main()中循环调用DSPRunLed(),但是从仿真器跟踪结果是:先跑了DSPRunLed(),再跑main(),这个顺序完全是按照段的地址顺序。从仿真器看main这段的汇编,并没有类似call DSPRunLed,函数的调用关系为什么失效呢?
user5871948:
回复 user5871948:
请求支援!
实在是不知道可以怎么调了,仿真器跟踪的从入口点开始的每条命令都是boot命令生成的asc文件,而boot命令是完全按照spra375f来的。贵司5509真的支持hpi口引导吗?