f2812把程序从FLASH搬到RAM中运行
### f2812 把程序从 FLASH 搬到 RAM 中运行 在嵌入式系统设计中,特别是在使用如 TMS320F2812 这样的数字信号控制器(DSC)时,为了优化性能,经常需要将部分程序从闪存(FLASH)移动到随机访问存储器(RAM)中执行。这是因为尽管 FLASH 存储器能够持久地保存数据,但它的读取速度通常比 RAM 要慢。因此,通过将时间敏感的关键代码段复制到 RAM 中执行,可以显著提高程序的运行速度。 #### 关键概念与步骤 **1. 代码分区** - **代码段的定义**:为了实现这一目标,首先需要通过编译器预处理器指令来指定哪些函数应该被放置在 RAM 中执行。例如,使用 `#pragma CODE_SECTION` 指令可以为特定的函数分配一个特殊的内存段。 - **示例**:在给定的代码片段中,可以看到 `#pragma CODE_SECTION(EPwm1_timer_isr,"ramfuncs")` 和 `#pragma CODE_SECTION(EPwm2_timer_isr,"ramfuncs")` 这两行指令,它们指定了中断服务函数 `EPwm1_timer_isr` 和 `EPwm2_timer_isr` 应该被编译并链接到名为 "ramfuncs" 的内存段中。 **2. 链接命令文件** - **映射规则**:为了确保这些代码段正确地加载和运行在 RAM 中,需要在链接器命令文件(例如 `.cmd` 文件)中定义相应的规则。这包括了如何将代码从 FLASH 加载到 RAM 以及如何设定运行地址。 - **示例**:在给定的 `.cmd` 文件片段中,定义了一个名为 `ramfuncs` 的内存段,它将在加载时位于 FLASH 区域 (`FLASHA`),而在运行时则位于 RAM 区域 (`PRAML0`)。具体的映射规则通过 `SECTIONS` 块中的配置实现: - `ramfuncs: LOAD=FLASHA, RUN=PRAML0, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), PAGE=0` **3. 内存复制** - **复制过程**:为了使这些代码能够在 RAM 中执行,需要在程序初始化阶段将它们从 FLASH 复制到 RAM 中。这一过程通常通过调用内存复制函数(如 `memcpy` 或者自定义的内存复制函数)来实现。 - **示例**:给定的代码片段中调用了 `MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart)` 函数,该函数的作用是将 FLASH 中从 `_RamfuncsLoadStart` 地址开始到 `_RamfuncsLoadEnd` 地址结束的内容复制到 RAM 中的 `_RamfuncsRunStart` 地址处。 **4. 初始化 FLASH** - **配置 FLASH**:在将代码复制到 RAM 之后,还需要对 FLASH 进行初始化,以便正确地设置等待状态等参数,从而确保后续的 FLASH 访问操作能够正常进行。 - **示例**:在给定的代码片段中,通过调用 `InitFlash()` 函数完成了 FLASH 的初始化工作。值得注意的是,为了确保程序的正确性,这个函数也需要被放置在 RAM 中执行。 #### 总结 通过以上步骤,可以有效地将时间敏感的代码段从 FLASH 移动到 RAM 中执行,从而提高整个系统的性能。这种方法特别适用于那些对时间响应有较高要求的应用场景,例如实时控制、高速数据处理等领域。此外,在实际应用中,还需要注意内存管理、中断处理等方面的问题,以确保系统的稳定性和可靠性。
第一步:
// Functions that will be run from RAM need to be assigned to
// a different section. This section will then be mapped using
// the linker cmd file.
#pragma CODE_SECTION(EPwm1_timer_isr, "ramfuncs");
#pragma CODE_SECTION(EPwm2_timer_isr, "ramfuncs");
MAIN()
{
// These are defined by the linker (see F2808.cmd)在CMD里面定义的变量
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
User specific code, enable interrupts:
// Copy time critical code and Flash setup code to RAM
// This includes the following ISR functions: EPwm1_timer_isr(), EPwm2_timer_isr()
// EPwm3_timer_isr and and InitFlash();
// The RamfuncsLoadStart, RamfuncsLoadEnd, and RamfuncsRunStart
// symbols are created by the linker. Refer to the F2808.cmd file.
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
// Call Flash Initialization to setup flash waitstates
// This function must reside in RAM
InitFlash();//FLASH初始化的函数不能在FLASH里面运行,必须拷到别的内存空间里运行才能对FLASH进行初始化。
}
- shayslmc2015-10-02试过了,能用,感觉比F28335麻烦一些,不过还是可以用的,谢谢分享
- Alexander_hyj2014-07-21说的很清楚谢谢!
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助