C6416启动失败
来源:互联网 发布:sql join inner join 编辑:程序博客网 时间:2024/06/04 18:06
问题描述
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长度的一段空间用作堆栈等。因此在用户代码中要注意不要在这些空间存放初始化的数据,否则启动有可能失败。
- C6416启动失败
- DSP c6416中断的使用
- DSP-C6416-录音混音算法工程
- mysql启动失败1067
- npkcrypt 服务启动失败
- SQUID启动失败问题
- npkcrypt 服务启动失败
- sshd启动失败
- Tomcat 启动失败,求助!!
- tomcat启动失败问题
- Mysql启动失败问题解决
- msdtc服务启动失败
- Xampp启动失败
- OracleOraDb10g_home1TNSListener启动失败
- eclipse启动失败
- OracleOraDb10g_home1TNSListener 启动失败
- apache启动失败解决方案
- virtualbox启动失败
- Python爬虫教程——新浪微博登陆
- Linux内核Socket CAN中文文档
- 利用R语言计算国内两个地点的距离
- 如何将Chromium Embedded Framework (CEF) 嵌入到你自己的程序中
- Ubuntu14.04下手动安装Firefox的Flash插件
- C6416启动失败
- 对存取控制的认识
- memcpy, memccpy函数实现——string.h库函数
- leetcode---Add Digits
- 深入理解JavaScript的变量作用域
- Majority Element
- 神经科学方面的sci杂志和影响因子
- asp连接sql server
- python显示中文