按照理解,simulator的时候,复位 应该从L2RAM 的 0x00800000 地址开始执行。
但是,
测试程序,调试的时候,
0x00800000 地址开始分配给了 stack。_c_int00 在0x801660开始,程序从此开始运行。
疑问:
1、复位的时候,PC是如何指向 0x801660的?
2、程序做调整,这个_c_int00会有所变化,但是复位都是从_c_int00开始。
信息:
.stack 0 00800000 00001200 UNINITIALIZED
00800000 00000008 rts64plus.lib : boot.obj (.stack)
00800008 000011f8 –HOLE–
00801200 00000140 main.obj (.text)
00801340 000000c0 rts64plus.lib : autoinit.obj (.text:__auto_init)
00801400 000000c0 : exit.obj (.text:_exit)
008014c0 000000a0 : cpy_tbl.obj (.text:_copy_in)
00801560 000000a0 : memcpy64.obj (.text:_memcpy)
00801600 00000060 : cpp_init.obj (.text:___TI_cpp_init)
00801660 00000060 : boot.obj (.text:_c_int00)
008016c0 00000040 : args_main.obj (.text:__args_main)
00801700 00000020 : exit.obj (.text:_abort)
hongkun ma:
回复 Shine:
@Shine Zhang@Tony Tang
谢谢 热情解释和答复!
DSP程序复位后入口程序:c_int00 初始化SP,DP等用户应用入口程序:main
CCS V5.4 在 Run – Deubug Configurations – Target – Auto Run Options – Run to symbol 里,可以填写 一个程序名称,默认是 main(),你甚至可以改为你的的一个任意子程序。然后,你点 Debug 界面下的 Restart,调试界面就运行到 你制定的 程序停下来。在 c_int00 和 你制定的程序之间如果有你打的 断点,则会在断点处停止。
疑问:1、这种复位是CCS的操作,不是硬件的复位。 也就是说在CCS下,simulator的时候,PC初始指针不是硬件复位的芯片起始地址。而是由CCS环境直接设置为 c_int00 的地址?
2、当生成烧入到FLASH的程序的时候, 是不是应该把 c_int00链接在 芯片复位地址处? (C6455 EMIFA 8-bit ROM boot 在 0xB000 0000,共计8M空间) 这个过程,是在 哪个环节完成? 是在 LINK环节?还是在把obj文件转换为 hex文件的环节?
如果是在Link环节,simulator的时候,为何不是预期的?还是说,需要通过 Options 来设置? 3、另外一个问题,C6455的 L2RAM 是2M,如果程序编译后,数据空间和程序空间的总和大于2M, CCS 会怎么支持simulator?
hongkun ma:
回复 hongkun ma:
首先感谢各位大佬!
1、关于 simulator 的复位地址问题,答案已经明确,也找到了出处。
文件《spruec6g-C645xC647x Bootloader User's Guide》- 3.3.1 No Boot Mode
No-boot mode is usually selected when the user wants to download the application using an emulatorin conjunction with Code Composer Studio (CCStudio). In this usage case, when CCStudio connects tothe DSP, it brings the DSP out of the sleep state and PC execution is halted. CCStudio downloads theapplication image in DSP memory and the start address for execution is set to the application entrypoint (CCStudio uses the default entry point _c_int00). Application code execution starts when the userinvokes the CCStudio Run command.
造成原来疑惑的来源:
文件《tms320c6455-Fixed-Point Digital Signal Processor》 – 2.4.1 Boot Modes Supported
No boot (BOOTMODE[3:0] = 0000b)With no boot, the CPU executes directly from the internal L2 SRAM located at address 0x80 0000.Note: device operations is undefined if invalid code is located at address 0x80 0000. This boot mode isa hardware boot mode.
地址0x80 0000 是修饰L2 SRAM的,确实没有说是从这个地址开始执行。应该是自己按照历史经验误解。
不过,误解也是情有可原,确实也有的方式是从 0x80 0000开始的。参考信息如下:
文件《spruec6g-C645xC647x Bootloader User's Guide》- 3.3.1 No Boot Mode
The other usage option is a host that downloads the application to L2 (using an emulation protocol likeRTDX) and provides an NMI to the DSP so that the application execution can start. The entry point tothe application is always the L2 base. The application must be linked so that the entry point for theapplication is the L2 base (_cint_00 should be mapped to 0x0080000).
另外,
文件《spruec6g-C645xC647x Bootloader User's Guide》- 3.3.4 HPI Boot Mode
Direct HPI bootloading mode involves the host making direct write accesses to DSP memory. The DSPde-asserts the HINT line to indicate that it is ready and then enters the sleep state. The host thenstarts to make direct writes of the application code and data sections to DSP memory. The host canalso modify the default entry point of the application (default entry point is 0x800000) by writing to theboot exit address in scratch memory (for details, see Table 10). When the host is finished writing theapplication to DSP memory, it asserts the DSPINT event. This brings the DSP out of the sleep stateand starts execution at the address specified in the boot exit address. Since the HPI can only make32-bit aligned accesses, the application data and code sections need to be 32-bit aligned.
总结下来,把代码复制到 内部L2SRAM 后运行的时候,默认入口地址确实是0x80 0000,
但是在装载用户程序过程中,可以通过约定方式修改 这个入口地址(修改为 c_int00 的链接后的地址)。
尤其非常明确了,CCStudio uses the default entry point _c_int00。