TMS320F28xxx DSP:从内部闪存运行应用程序的全面指南
在嵌入式系统设计中,让应用程序在TMS320F28xxx DSP的内部闪存上运行是一个常见需求。本文将深入探讨从内部闪存运行应用程序所需的特殊要求、软件修改以及性能优化技巧。
文件下载:TMDSC2KWRKSHPKIT.pdf
1. 引言
TMS320F28xxx DSP系列专为嵌入式控制器应用的独立运行而设计。片上闪存通常可消除对外部非易失性存储器和主机处理器的需求。要配置应用程序从闪存运行,只需遵循几个简单步骤。本文涵盖了正确配置应用程序软件以从内部闪存执行所需的主要问题和步骤,同时介绍了DSP/BIOS和非DSP/BIOS项目的要求,并讨论了一些性能考虑因素和技术。
适用设备与工具版本
本文讨论的问题适用于TMS320F28xxx设备家族的当前成员,包括F281x、F280x/2801x/28044、F2823x/2833x、F2802x、F2803x、F2805x和F2806x等系列。代码和方法适用于特定的开发工具版本,如CCS v5.3.0、Code Generation Tools v6.1.1和DSP/BIOS v5.42.0.07。虽然未来工具版本可能存在差异,但通常会保持向后兼容性。
示例项目
为F2812、F2808、F28335、F28027、F28035、F28055和F28069提供了示例CCS v5项目,可从http://www-s.ti.com/sc/techlit/spra958.zip下载,为代码开发提供起点。
2. 创建用户链接器命令文件
2.1 非DSP/BIOS项目
在非DSP/BIOS应用中,用户链接器命令文件用于定义大部分内存并指定大部分段的链接位置。其格式与从RAM运行应用程序时使用的链接器命令文件相同,区别在于段的链接位置。相关外设头文件包含用于链接外设寄存器结构的链接器命令文件,可将其添加到代码项目中。一般来说,链接器命令文件的顺序不重要,但在某些罕见情况下,高级用户可能需要手动控制其评估顺序。
2.2 DSP/BIOS项目
DSP/BIOS配置工具会生成一个链接器命令文件,指定如何链接所有DSP/BIOS生成的段以及默认情况下所有C编译器生成的段。从闪存执行时,可能需要生成并链接一个或多个用户定义的段。同样,外设头文件包含用于链接外设寄存器结构的链接器命令文件,需将其添加到项目中。在某些情况下,高级用户可能需要手动控制链接器命令文件的评估顺序。
3. 段的链接位置
3.1 段类型
存在两种基本段类型:初始化段和未初始化段。初始化段在设备上电时必须包含有效值,如代码和常量;未初始化段在设备上电时不包含有效值,如变量。因此,初始化段应链接到非易失性内存(如片上闪存),未初始化段应链接到易失性内存(如RAM)。
3.2 链接选项
建议使用 -w 链接器选项,该选项会在链接器遇到项目中未在链接器命令文件中明确指定链接的段时发出警告。同时,应使用大内存模型,避免使用小内存模型,因为小内存模型要求某些初始化段链接到可寻址空间的低64Kw非易失性内存,而F28xxx设备在此区域没有闪存。
3.3 不同项目的段链接
- 非DSP/BIOS项目:编译器使用的特定段在从RAM或闪存运行时相同,但从闪存运行时,所有初始化段必须链接到非易失性内存,未初始化段必须链接到易失性内存。具体段的链接位置可参考表1。
- DSP/BIOS项目:DSP/BIOS配置工具的内存段管理器允许指定各种DSP/BIOS和C编译器生成段的链接位置。具体链接信息可参考表2。
4. 从闪存复制段到RAM
4.1 复制中断向量(仅非DSP/BIOS项目)
F28xxx设备的外设中断扩展(PIE)模块管理中断请求。上电时,所有中断向量必须位于非易失性内存(即闪存),并在代码的设备初始化过程中复制到PIE VECT RAM。可使用常量C结构包含所有128个32位向量,并使用 memcpy() 函数进行复制。对于某些设备,需避免覆盖前三个32位PIE向量位置。
4.2 复制 .hwi_vec 段(仅DSP/BIOS项目)
DSP/BIOS的 .hwi_vec 段包含中断向量,必须加载到闪存但从RAM运行。用户负责将该段从其加载地址复制到运行地址,通常在 main() 中完成。可使用DSP/BIOS配置工具生成的全局符号确定加载地址、运行地址和段长度,并使用 memcpy() 函数进行复制。对于某些设备,需避免覆盖前三个32位PIE向量位置。
4.3 复制 .trcdata 段(仅DSP/BIOS项目)
DSP/BIOS的 .trcdata 段必须加载到闪存但从RAM运行,且复制必须在 main() 之前进行。可使用DSP/BIOS配置工具提供的用户初始化函数完成复制,利用配置工具生成的全局符号确定加载地址、运行地址和段长度,并使用 memcpy() 函数进行复制。
4.4 初始化闪存控制寄存器(DSP/BIOS和非DSP/BIOS项目)
闪存控制寄存器的初始化代码不能从闪存执行,否则可能导致不可预测的结果。因此,初始化函数必须在运行时从闪存(加载地址)复制到RAM(运行地址)。需注意闪存控制寄存器受代码安全模块(CSM)或双代码安全模块(DCSM)保护,不同设备的保护方式不同。可使用C编译器的 CODE_SECTION 编译指示创建可单独链接的段,并在用户链接器命令文件中指定加载和运行地址,最后使用 memcpy() 函数进行复制。
4.5 从RAM执行时间关键函数以最大化性能(DSP/BIOS和非DSP/BIOS项目)
F28xxx设备的片上RAM提供的代码执行性能与设备的工作时钟频率相等(以MIPS为单位),而片上闪存的有效代码执行性能稍低。因此,对于时间关键或计算要求高的例程,可考虑从片上RAM运行。需为这些函数设置单独的加载和运行地址,并在运行时将其从片上闪存复制到RAM。
4.6 将关键全局常量链接到RAM以最大化性能(DSP/BIOS和非DSP/BIOS项目)
常量数据结构存放在 .econst 段中,访问闪存中的数据常量可能需要多个周期。为提高性能,可将频繁访问的常量和常量表保留在片上RAM中。可采用两种方法:
- 方法1:从RAM运行所有常量数组:为整个 .econst 段指定单独的加载和运行地址,并在运行时将其复制到RAM。
- 方法2:从RAM运行特定常量数组:选择性地将常量从闪存复制到RAM,将选定的常量放置在命名段中并复制到RAM。
5. 编程代码安全模块密码
F28xxx设备的代码安全模块提供对软件的保护,防止未经授权的复制和篡改。设备分为单区代码安全模块(CSM)和双区代码安全模块(DCSM)。
5.1 单区安全设备(DSP/BIOS和非DSP/BIOS项目)
CSM保护整个闪存、OTP内存和一些‘L’ SARAM块。CSM使用128位密码,在开发阶段建议使用0xFFFF的虚拟密码。开发完成后,可使用真实密码,并将0x0000值编程到密码地址前的118个闪存地址中。可使用汇编语言编程实现密码设置,并在用户链接器命令文件中放置密码和保留段。
5.2 双区安全设备(DSP/BIOS和非DSP/BIOS项目)
双区安全与单区安全类似,但有三个主要区别:
- 从安全区执行的代码只能访问该区域或非安全内存中的数据。
- 每个区域使用位于OTP内存中的16x16位‘区域选择块’控制对该区域的安全访问。
- 安全配置表位于OTP内存中,每个条目只能写入一次。
可使用汇编语言创建区域配置表,并在用户链接器命令文件中链接相关段。
6. DSP复位后从闪存执行代码
F28xxx设备包含ROM引导加载程序,可在设备复位后将代码执行转移到闪存。当引导模式选择引脚配置为‘Jump-to-Flash’模式时,ROM引导加载程序将分支到闪存中的跳转目标地址。用户应在该地址放置分支指令,分支到代码的起始位置。可使用汇编代码创建名为 codestart 的初始化段,并在用户链接器命令文件中放置该段。
7. 在C环境引导期间禁用看门狗定时器
C编译器运行时支持库中的C环境初始化函数 _c_int00 负责初始化全局和静态变量。当软件中存在大量初始化的全局和静态变量时,看门狗定时器可能在C环境引导例程完成并调用 main() 之前超时。可通过在C环境引导例程开始之前禁用看门狗定时器来解决该问题,在到达 main() 并开始正常代码执行流程后再重新启用。可使用汇编代码实现看门狗禁用和分支到 _c_int00 例程。
8. C代码示例
8.1 概述
本文提供了包含CCS v5代码项目的下载,涵盖了F281x、F280x、F2802x、F2803x、F2805x、F2806x和F2833x子系列的超集设备。每个设备类型(除F2802x、F2803x和F2805x外)有四个不同的项目:非DSP/BIOS项目(从片上RAM运行和从片上闪存运行)和DSP/BIOS项目(从片上RAM运行和从片上闪存运行)。这些项目仅为示例,使用的开发工具版本为CCS v5.3.0、Code Generation Tools v6.1.1和DSP/BIOS v5.42.0.07。
8.2 目录结构
每个代码项目包含所有所需文件(除C编译器运行时支持库外),表3提供了CCS项目的目录结构描述。
8.3 附加信息
- 构建项目后,.out 文件将位于
Debug 目录中。 - 使用RAM示例时,板应配置为“Jump to H0 SARAM”(F2812)或“Jump to M0 SARAM”(其他设备)引导模式;使用FLASH示例时,板应配置为“Jump to Flash”引导模式。
- 示例项目的链接位置未经过精细调整,若作为代码开发的起点,可能需要调整链接以提高性能。
- 非DSP/BIOS项目在 DefaultIsr_nonBIOS.c 文件中定义了完整的中断服务例程;DSP/BIOS项目在 DefaultIsr_BIOS.c 文件中定义了完整的(硬件)中断服务例程。
总之,在TMS320F28xxx DSP上从内部闪存运行应用程序需要考虑多个方面,包括链接器命令文件的创建、段的链接位置、段的复制、代码安全模块密码的编程等。通过遵循本文介绍的步骤和技巧,工程师可以顺利地将应用程序配置为从内部闪存运行,并优化性能。你在实际应用中遇到过哪些相关问题呢?欢迎在评论区分享。
发布评论请先 登录
TMS320F280x/C280x系列数字信号处理器:功能特性与应用指南
TMS320F281x与TMS320C281x DSPs:功能特性与应用指南
TMS320F281x/C281x DSPs:高性能数字信号处理器的全面解析
TMS320F2805x系列实时微控制器:特性、应用与开发指南
TMS320F280x/C280x系列数字信号处理器深度解析
TMS320F243与TMS320F241 DSP控制器:数字信号处理的得力助手
深入解析TMS320F280x与TMS320C280x系列数字信号处理器
TMS320LF2401A与TMS320LC2401A DSP控制器深度解析
TMS320VC5507 DSP深度剖析:从特性到应用的全方位指南
Microchip PIC18F2XXX/4XXX 系列闪存微控制器编程指南
TMS320F28P650DK实时微控制器技术文档总结
TMS320F280013x系列微控制器技术解析与应用指南
TMS320F280015x微控制器技术解析:面向实时控制的高效解决方案
Texas Instruments TMS320F28P65x/TMS320F28P65x-Q1实时MCU数据手册
Texas Instruments TMS320F28P55x/TMS320F28P55x-Q1实时MCU数据手册
TMS320F28xxx DSP:从内部闪存运行应用程序的全面指南
评论