电子说
在嵌入式系统设计中,让应用程序在TMS320F28xxx DSP的内部闪存上运行是一个常见需求。本文将深入探讨从内部闪存运行应用程序所需的特殊要求、软件修改以及性能优化技巧。
文件下载:TMDSC2KWRKSHPKIT.pdf
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下载,为代码开发提供起点。
在非DSP/BIOS应用中,用户链接器命令文件用于定义大部分内存并指定大部分段的链接位置。其格式与从RAM运行应用程序时使用的链接器命令文件相同,区别在于段的链接位置。相关外设头文件包含用于链接外设寄存器结构的链接器命令文件,可将其添加到代码项目中。一般来说,链接器命令文件的顺序不重要,但在某些罕见情况下,高级用户可能需要手动控制其评估顺序。
DSP/BIOS配置工具会生成一个链接器命令文件,指定如何链接所有DSP/BIOS生成的段以及默认情况下所有C编译器生成的段。从闪存执行时,可能需要生成并链接一个或多个用户定义的段。同样,外设头文件包含用于链接外设寄存器结构的链接器命令文件,需将其添加到项目中。在某些情况下,高级用户可能需要手动控制链接器命令文件的评估顺序。
存在两种基本段类型:初始化段和未初始化段。初始化段在设备上电时必须包含有效值,如代码和常量;未初始化段在设备上电时不包含有效值,如变量。因此,初始化段应链接到非易失性内存(如片上闪存),未初始化段应链接到易失性内存(如RAM)。
建议使用 -w 链接器选项,该选项会在链接器遇到项目中未在链接器命令文件中明确指定链接的段时发出警告。同时,应使用大内存模型,避免使用小内存模型,因为小内存模型要求某些初始化段链接到可寻址空间的低64Kw非易失性内存,而F28xxx设备在此区域没有闪存。
F28xxx设备的外设中断扩展(PIE)模块管理中断请求。上电时,所有中断向量必须位于非易失性内存(即闪存),并在代码的设备初始化过程中复制到PIE VECT RAM。可使用常量C结构包含所有128个32位向量,并使用 memcpy() 函数进行复制。对于某些设备,需避免覆盖前三个32位PIE向量位置。
DSP/BIOS的 .hwi_vec 段包含中断向量,必须加载到闪存但从RAM运行。用户负责将该段从其加载地址复制到运行地址,通常在 main() 中完成。可使用DSP/BIOS配置工具生成的全局符号确定加载地址、运行地址和段长度,并使用 memcpy() 函数进行复制。对于某些设备,需避免覆盖前三个32位PIE向量位置。
DSP/BIOS的 .trcdata 段必须加载到闪存但从RAM运行,且复制必须在 main() 之前进行。可使用DSP/BIOS配置工具提供的用户初始化函数完成复制,利用配置工具生成的全局符号确定加载地址、运行地址和段长度,并使用 memcpy() 函数进行复制。
闪存控制寄存器的初始化代码不能从闪存执行,否则可能导致不可预测的结果。因此,初始化函数必须在运行时从闪存(加载地址)复制到RAM(运行地址)。需注意闪存控制寄存器受代码安全模块(CSM)或双代码安全模块(DCSM)保护,不同设备的保护方式不同。可使用C编译器的 CODE_SECTION 编译指示创建可单独链接的段,并在用户链接器命令文件中指定加载和运行地址,最后使用 memcpy() 函数进行复制。
F28xxx设备的片上RAM提供的代码执行性能与设备的工作时钟频率相等(以MIPS为单位),而片上闪存的有效代码执行性能稍低。因此,对于时间关键或计算要求高的例程,可考虑从片上RAM运行。需为这些函数设置单独的加载和运行地址,并在运行时将其从片上闪存复制到RAM。
常量数据结构存放在 .econst 段中,访问闪存中的数据常量可能需要多个周期。为提高性能,可将频繁访问的常量和常量表保留在片上RAM中。可采用两种方法:
F28xxx设备的代码安全模块提供对软件的保护,防止未经授权的复制和篡改。设备分为单区代码安全模块(CSM)和双区代码安全模块(DCSM)。
CSM保护整个闪存、OTP内存和一些‘L’ SARAM块。CSM使用128位密码,在开发阶段建议使用0xFFFF的虚拟密码。开发完成后,可使用真实密码,并将0x0000值编程到密码地址前的118个闪存地址中。可使用汇编语言编程实现密码设置,并在用户链接器命令文件中放置密码和保留段。
双区安全与单区安全类似,但有三个主要区别:
可使用汇编语言创建区域配置表,并在用户链接器命令文件中链接相关段。
F28xxx设备包含ROM引导加载程序,可在设备复位后将代码执行转移到闪存。当引导模式选择引脚配置为‘Jump-to-Flash’模式时,ROM引导加载程序将分支到闪存中的跳转目标地址。用户应在该地址放置分支指令,分支到代码的起始位置。可使用汇编代码创建名为 codestart 的初始化段,并在用户链接器命令文件中放置该段。
C编译器运行时支持库中的C环境初始化函数 _c_int00 负责初始化全局和静态变量。当软件中存在大量初始化的全局和静态变量时,看门狗定时器可能在C环境引导例程完成并调用 main() 之前超时。可通过在C环境引导例程开始之前禁用看门狗定时器来解决该问题,在到达 main() 并开始正常代码执行流程后再重新启用。可使用汇编代码实现看门狗禁用和分支到 _c_int00 例程。
本文提供了包含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。
每个代码项目包含所有所需文件(除C编译器运行时支持库外),表3提供了CCS项目的目录结构描述。
总之,在TMS320F28xxx DSP上从内部闪存运行应用程序需要考虑多个方面,包括链接器命令文件的创建、段的链接位置、段的复制、代码安全模块密码的编程等。通过遵循本文介绍的步骤和技巧,工程师可以顺利地将应用程序配置为从内部闪存运行,并优化性能。你在实际应用中遇到过哪些相关问题呢?欢迎在评论区分享。
全部0条评论
快来发表一下你的评论吧 !