资源预览内容
第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
第6页 / 共25页
第7页 / 共25页
第8页 / 共25页
第9页 / 共25页
第10页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
TMS320F28335 DSP CMD 解读解读 在 DSP28335 工程文件里 不用 BIOS 产生 CMD 文件 手写 CMD 文件一般有两个 在 RAM里 调 试 时 用 的 两 个CMD文 件 分 别 为DSP2833x Headers nonBIOS cmd和 28335 RAM lnk cmd 烧 写 到flash里 时 用 的 两 个CMD文 件 分 别 为 DSP2833x Headers nonBIOS cmd 和 F28335 cmd 其中 DSP2833x Headers nonBIOS cmd 文件 可以在所有工程文件中通用 主要作用是把外设寄存器产生的数据段映射到对应的存储空间 可以跟 DSP2833x GlobalVariableDefs c 文件对照一下看看 下面通过一个简单例子 比如向 CpuTimer0Regs TIM all 写数据 来解读一下 CMD 文件是如何把寄存器里的值准确映射到所 在存储器的位置的 先在 DSP2833x GlobalVariableDefs c 文件里找到以下几行代码 ifdef cplusplus pragma DATA SECTION CpuTimer0RegsFile else pragma DATA SECTION CpuTimer0Regs CpuTimer0RegsFile endif volatile struct CPUTIMER REGS CpuTimer0Regs 由上可知CpuTimer0Regs是一个结构体变量名 其定义在DSP2833x CpuTimers c文件里 通过预处理命令 pragma 为这个结构体定义了一个名称为 CpuTimer0RegsFile 的数据段 接着在 DSP2833x Headers nonBIOS cmd 文件里找到如下代码 SECTIONS PieVectTableFile PIE VECT PAGE 1 DevEmuRegsFile DEV EMU PAGE 1 FlashRegsFile FLASH REGS PAGE 1 CsmRegsFile CSM PAGE 1 AdcMirrorFile ADC MIRROR PAGE 1 XintfRegsFile XINTF PAGE 1 CpuTimer0RegsFile CPU TIMER0 PAGE 1 红字体代码的作用就是 通过 SECTIONS 伪指令把 CpuTimer0RegsFile 数据段装载到名称 为 CPU TIMER0 的存储空间 同样在 DSP2833x Headers nonBIOS cmd 文件里找到如下代码 MEMORY PAGE 0 PAGE 1 DEV EMU origin 0 x000880 length 0 x000180 FLASH REGS origin 0 x000A80 length 0 x000060 CSM origin 0 x000AE0 length 0 x000010 ADC MIRROR origin 0 x000B00 length 0 x000010 XINTF origin 0 x000B20 length 0 x000020 CPU TIMER0 origin 0 x000C00 length 0 x000008 CPU TIMER0 存储空间通过 MEMORY 伪指令指示了其起始地址和长度 也就等于间接确 定了结构体 CpuTimer0Regs 的具体位置 所以通过以上几层映射关系 当向 CpuTimer0Regs TIM all 写数据时就可以准确的写入 DSP 内部寄存器所在的存储器的位置 由此看见 CMD 的作用就是为程序代码和数据分配存储空间 本节先针对 DSP2833x Headers nonBIOS cmd 文件做一下解读 后续再分别解读一下 CMD 用于调试和烧写时需要注意哪些问题 另外有关 volatile 关键字的解读可参考 在 nonBIOS 情况下 CMD 文件不外乎就三个 28335 RAM lnk cmd 用于仿真调试 DSP2833x Headers nonBIOS cmd F28335 cmd 用于 flash 烧写 仿真调试时只用前两 个 用于 flash 烧写时只用后两个 且不管在何种方式下 28335 RAM lnk cmd 和 F28335 cmd 不能同时用 也不能代替用 在 DSP28335 CMD 文件解读 1 中 已经介绍过 DSP2833x Headers nonBIOS cmd 在用 28335 RAM lnk cmd 时 一般情况下直接用 TI 给的 不需要做修改即可满足调试 用 模式较固定 当然你也可以做相应的修改用到哪块 RAM 存储空间 在 CMD 文件里做相 应的分配即可 MEMORY PAGE 0 BEGIN origin 0 x000000 length 0 x000002 BOOT RSVD origin 0 x000002 length 0 x00004E RAMM0 origin 0 x000050 length 0 x0003B0 RAML origin 0 x008000 length 0 x004000 ZONE7A origin 0 x200000 length 0 x00FC00 CSM RSVD origin 0 x33FF80 length 0 x000076 CSM PWL origin 0 x33FFF8 length 0 x000008 ADC CAL origin 0 x380080 length 0 x000009 RESET origin 0 x3FFFC0 length 0 x000002 IQTABLES origin 0 x3FE000 length 0 x000b50 IQTABLES2 origin 0 x3FEB50 length 0 x00008c FPUTABLES origin 0 x3FEBDC length 0 x0006A0 BOOTROM origin 0 x3FF27C length 0 x000D44 PAGE 1 RAMM origin 0 x000400 length 0 x000400 RAMH origin 0 x00C000 length 0 x004000 ZONE6B origin 0 x13FC00 length 0 x000400 ZONE7B origin 0 x20FC00 length 0 x000400 SECTIONS codestart BEGIN PAGE 0 ramfuncs RAML PAGE 0 text RAML PAGE 0 cinit RAML PAGE 0 pinit RAML PAGE 0 switch RAML PAGE 0 stack RAMM PAGE 1 ebss RAMH PAGE 1 econst RAMH PAGE 1 esysmem RAMM PAGE 1 IQmath RAML PAGE 0 IQmathTables IQTABLES PAGE 0 TYPE NOLOAD IQmathTables2 IQTABLES2 PAGE 0 TYPE NOLOAD FPUmathTables FPUTABLES PAGE 0 TYPE NOLOAD ZONE7DATA ZONE7B PAGE 1 ZONE6DATA ZONE6B PAGE 1 reset RESET PAGE 0 TYPE DSECT csm rsvd CSM RSVD PAGE 0 TYPE DSECT csmpasswds CSM PWL PAGE 0 TYPE DSECT adc cal load ADC CAL PAGE 0 TYPE NOLOAD 而编写用于 flash 烧写的 F28335 cmd 文件时相对来说较复杂些 根据不同的情况需要做 一些修改 1 不需要把部分代码 copy 到 RAM 里 一般情况不需要外扩 RAM 等时直接用 TI 的 F28335 cmd 即可 2 需要把部分代码从 flash 复制到 RAM 里 如延时函数 DSP2833x usDelay asm 等 这 时 CMD 文件需要做相应的修改 具体参考博文 3 从时间开销方面考虑 需要把整个程序从 flash 复制到 RAM 里 这时程序及 CMD 文 件都要做相应的修改 具体参考博文 翻译自 TI 应用手册 SPRAAU8 摘要摘要 这个应用报告和相关的代码提供了一种把编译后的程序段从 TMS320F28xxx 的 flash 复制到 ram 的功能 这样可以提高代码的运行速度 这个解决方案在直接启动 之后 进入 c int00 C 语言代码运行之前实现此功能 本应用报告中所讨论的项目内容和源代码可以从以下网址下载 http www s ti com sc techlit spraau8 zip 1 引言 在许多应用中 代码的执行速度是至关重要的 例如在医疗 监控 电机控制等等 一些对时间有严格要求的终端设备 许多应用使用 TMS320F28xxx DSCs 是因为它 的内置 flash 储存器 内置 flash 是 TMS320F28xxx 的一个优势 因为它使得设计者 不需要外接 flash 来储存代码 使用内部 flash 缺点是访问 Flash 需要等待状态 这使 得程序的运行变慢 在大多数应用中 这不是一个问题 其他一些应用中可能会为 了获得最高的运行速度要求无等待状态 内部 RAM 存储器具有零等待状态 它是 易失性存储器 所以 引导的初始化代码段不可以存储在此存储器中 现在提供的解决方案 使得设计者能够在运行时把被编译器初始化的代码段从 flash 复制到 ram 里 获得最大的运行速度 这使代码执行从多达 15 个等待状态的提升到 0 等待状态 另一种解决方案是只将某些函数从 Flash 复制到 RAM 详见 Runn ing an Application from Internal Flash Memory on the TMS320F28xx DSP SPRA958 这种方法应该使用在大多数使用 C2000 DSC 的应用上 其他要求严 格的时序和连续的零等待状态的应用程序应采用这里提出的解决方案 编写汇编程序来完成代码从 Flash 到 RAM 的复制 该汇编代码在复位向量后调用 c int00 之前执行 这保证了在 c int00 调用 mian 之前完成复制 有一些工程比较小 可以把所有初始化了的段都复制到 ram 然而 其他一些工程 的初始化了的段比所有的内部 ram 还要大 这些工程可能不可以把所有的初始化了 的段都复制到 ram 但是用这种方法复制其中一部分段 2 编译的代码段 编译器生成的包含代码和数据的多个部分 称为段 这下段被分为两个不同的组 初始化了的和没被初始化的 初始化的部分是由所有的代码 常量和初始化表组成 的 下表列出了由编译器产生的初始化段 初始化段 段名段名 内容内容 限制限制 cinit 显式初始化的全局变量和静态变量表 代码 const 显式初始化的全局和静态的 const 变量和字符串常量 不超过 64K 长度 econst 长调用的常量 数据中的任何地方 pinit 全局对象的构造函数表 代码 switch switch 语句产生的表 代码或者数据 text 可执行代码和常数 代码 没初始化的段是由未初始化的变量 堆栈和 malloc 产生的内存 下表列出了由编译 器产生的没初始化段 没初始化段 段名段名 内容内容 限制限制 bss 全局和静态变量 不超过 64K 长度 ebss 长调用的全局或静态变量 数据中的任何地方 stack 堆栈空间 不超过 64K 长度 sysmem malloc 函数产生的内存 不超过 64K 长度 esysmem far malloc
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号