DSP

C6416启动失败

2019-07-13 17:29发布

问题描述

NXX板要使用国产化FT-C6416芯片,其与TI的C6416功能兼容,只是要额外安装仿真器驱动,且只支持CCS3.3以下版本。
NXX板硬件粗调后要用软件做测试,由于开发环境尚未准备好,只能使用老的BIN文件通过主机下载。测试发现闪灯程序运行正常。然而改用CCS5.4下开发的闪灯程序后,主机下载BIN文件功能不正常。灯只亮不闪。

问题分析

由于两者的代码是一致的,只是开发环境和配置的区别。因此先分析两个BIN文件的区别。
BIN文件的格式见图。先是一个入口地址,然后多个由“长度-地址-数据”组成的段,最后是一个0x00000000结束。
启动文件格式 仔细比较新旧版两个BIN文件,发现地址范围不一致。然后追溯map文件发现老版本的内存中留了一段从零地址到0x20地址的空间未使用,而新版本中使用了全部地址,且起始处存放的是中断向量表。 会不会是这个差异导致的问题呢?找出C6000启动相关的文档,发现C6000的启动流程是这样的。
在HPI启动下,主机先给DSP发送一个复位信号,复位完成后DSP采集启动引脚信号发现是主机启动模式,则陷入Stall状态。这时主机可以通过HPI接口写DSP内存,然后通过DSPINT给DSP发送中断。DSP收到中断后跳转到内存起始地址执行。
然而一般情况下入口地址并不一定在内存起始地址处,而是随着代码和编译器而变化的。因此为了保证正常执行,需要主机在中断前先往DSP的起始地址入写一个跳转指令,跳转到入口地址那里。
这就解释了为什么老版代码避开了开始的一段空间了,因为这里是要放跳转指令的。否则写入的其他正常代码会被跳转指令覆盖导致运行错误。
奇怪的是,在TI的C6416上,即使代码使用了全部的空间,闪灯程序也能运行成功。看来FT与TI还是略有差别的,并非如宣扬的那样完全兼容。

解决方法

修改tcf文件中内存配置,避开从0到0x20共32字节的地址空间。然后重新编译后生成BIN文件下载,灯成功闪烁起来。

归一化

每个处理器的每种启动模式都有一些注意事项,需要特别留意。
在《C6000 Boot Mode and Emulation Reset(SPRA978)》中提到,C6000处理器的ROM/FLASH启动时,DMA从Flash首地址搬移一些代码到内存地址0处,然后从这里开始执行。一般未编程的Flash设备数据全为0xffffffff,这会被解码为NOP,不会有问题。然而一旦继续执行超过地址边界,将产生严重问题,有时仿真器也不能控制。为此需要在Flash起始处写入一段死循环代码,使得CPU启动后可控。
C6678上电后执行RBL代码,要在每个核里保留0xD23F长度的一段空间用作堆栈等。因此在用户代码中要注意不要在这些空间存放初始化的数据,否则启动有可能失败。