本文将公司常用的DSP系列芯片作为主要描述对象,内容涉及其工程文件的简介和启动过程的简单梳理,文中的内容多来自工作实践和自己的理解,以具体的工程应用为主,意在与大家进行技术交流,同时作为简单的技术积累,由于内容主观,不免有错误的理解和描述,误导之处还请谅解!并期待大家的提点!首先本文是基于DSP芯片—TMS320F2812进行的相关技术整理,下文将要提及的地址信息全部是DSP2812默认的片内地址,可根据手册查询,对于其他系列的芯片而言,文中相关内容仅具备对比和参考价值,特此说明。
对于DSP2812与其他主控芯片相似,其运行模式主要分为分为带有仿真器的调试仿真模式和脱离仿真器的独立运行模式,对于DSP来说两者的区别在于程序是分配在RAM中还是分配在FLASH中运行。以下主要讨论的是实现脱离仿真器上电自动运行的模式,即将程序和数据分配到片内FLASH中完成独立运行,仿真调试模式下文作为对比也简单说明仅作参考。
要建立一个完整的DSP程序工程包含需要几种必要的文件类型,其中涉及DSP启动过程的主要是CMD文件和asm文件,他们分别用于片内地址分配和地址跳转,共同引导了DSP从启动到运行的过程。
由于目前本人所应用的DSP都未涉及连接片外存储设备,因此本文中仅介绍DSP2812从片内flash启动的引导过程。首先在芯片上电后,默认状态下会到固定片内地址提取已经固化好的中断向量表,然后根据已固化好的地址指针,再提取程序中可能用到的函数信息,随即进入片内flash的启动模式,该启动模式下默认跳转到0x3F7FF6处(DSP2812),该地址是片内flash的一部分,根据以上信息,就需要在CMD文件中分配flash模式启动区域如下:
MEMORY
{
……
BEGIN : origin = 0x3F7FF6, length = 0x000002
PASSWDS : origin = 0x3F7FF8, length = 0x000008
……
}
该区域命暂时名为BEGIN,截止到目前DSP默认的启动流程进入并停止在该区域中,用户需要继续添加程序代码,其目的是将启动引入自己编写的C环境程序中,最终实现在主程序中运行,此处的程序代码需要写在asm文件中,同时在asm文件中用户自定义的代码名称也要在CMD文件中映射到BEGIN的地址上,使代码在该地址中运行,完成启动引导。需要注意的是根据DSP2812的片内信息,BEGIN区域距离默认的密码区仅有2个字的距离,只能放一个跳转指令,实现跳转。
经过上文的简单说明,不难看出含有跳转代码的asm文件是实现DSP启动引导的重要组成部分,将启动引入了C程序的入口,实现了DSP从启动到运行C程序的过程。如果工程文件下没有加载正确的asm文件或者类似的跳转指令,DSP将进入默认启动区 0x3F7FF6,失去后续指令而跳不出来,可能的现象是程序能够正确编译和烧写,但是上电后DSP无法运行编写的程序,使用户陷入误区,找不到程序不运行的真正原因。
因此对于一个正确的能够烧写的DSP工程文件来说,文中的CMD文件和asm文件都是必不可少的,在以上条件下如果工程编译无误,将生成正确的.out烧写文件,该文件将分别记录CMD的地址信息和asm中的跳转信息,正确烧写后才能够确保DSP独立运行。
到此基本能够实现做一个项目的最终目的,核心芯片DSP能够脱离仿真器独立运行,而带有仿真器的调试模式作为程序测试中的一项重要手段,其运行模式与上文中的独立运行模式相比有相似之处也有明显的区别,此处浅谈两者的异同,以更好的理解独立模式下程序的启动与运行。
首先两者都能够实现芯片上电后进入C程序运行的过程,区别在于两者CMD文件的地址空间分配不同,仿真模式的程序段全部来自芯片内部的RAM区域掉电消失,同时需要仿真器,其程序RAM地址分配如下(DSP2812RAM):
MEMORY
{
……
PRAMH0 : origin = 0x3f8000, length = 0x002000
……
}
所以调试状态下CMD文件中的映射也全部来自芯片的RAM区域,因此该模式下无需地址跳转即能够进入C程序中,从而该模式下不需要asm文件指引启动过程,调试时需要将该文件移除,只分配正确的RAM空间即可实现调试。
以上仅仅是个人在实践过程中对于DSP启动过程的笼统理解,难免偏颇,同时叙述也比较简单、粗糙,但仍然希望能与大家分享和讨论,以增进彼此对于软硬件方面理解。当然其中的错误也期待大家的善意批评和指点,最后希望以上的内容能够带给大家些许帮助或启发,以达到技术交流的目的,彼此都能够有所收获,不胜感激!