logo资料库

从Flash中搬移程序到RAM中(部分复制和全部复制).pdf

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
重要资料连接: http://blog.sina.com.cn/s/blog_762cf5f80101apfx.html DSP28335— DELAY_US 总结 (2013-11-05 15:03:42)转载▼标签: dsp 分类: 学习交流 在很多程序中都会调用延时程序 DELAY_US(A),在文件 DSP281x_Examples.h 中有如下宏定 义: #define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L) 从定义很容易推算出,需要延时 A 微妙就把 DELAY_US()的参数设置为 A 即可。 在仿真调试的情况下运行程序,延时是较准确的,但是当把程序烧写到 flash 里运行时,如 果程序上不做修改,就会很容易发现延时的时间比你设置的要长(通过延时控制 LED 灯闪烁, 很直观)。这是因为,DSP 访问 flash 时需要等待时间的,而访问 RAM 时几乎是零等待,所 以在使用 DELAY_US(A)时要想延时时间准确必须使其在 RAM 里运行,在程序上需做如下 修改: 1、在 DSP2833x_usDelay.asm 中,有如下代码: .def _DSP28x_usDelay .sect "ramfuncs" .global __DSP28x_usDelay _DSP28x_usDelay: SUB BF LRETR ACC,#1 _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0 其中.sect "ramfuncs"语句的作用就是就把用汇编写的函数 DSP28x_usDelay 定位在 ramfuncs 段。 2、 在 工 程 中 添 加源 文 件 DSP2833x_MemCopy.c, 该 文 件 中 的 函数 void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr),实现把你想复制的代码从装载地址 RamfuncsLoadStart—RamfuncsLoadEnd 拷贝到 RamfuncsRunStart 开始的 SARAM 空间中。 3、在文件 DSP2833x_SysCtrl.c 开头,通过伪指令定义一个代码段,注意位置一定要放在函数 前面(如下图所示)。
4、在 main 函数中要调用 MemCopy 函数,注意该函数放置的位置。 5、修改用于烧写的 CMD 文件 关于这里面语句的解释可以参考博文:http://blog.sina.com.cn/s/blog_762cf5f80101agc3.html 6、注意在头文件 DSP281x_GlobalPrototypes.h 别忘做如下声明: 本文原创,如有不正确的地方请指出~O(∩_∩)O 谢谢~ 另: 除了上面这种方式即通过 MemCopy 函数复制外,还可以把整个程序代码都复制到 RAM 里, 验证过一个简单的通过延时控制 LED 灯闪烁的程序。 把整个程序代码都复制到 RAM 里需要注意一些事项,具体可参考博文:
DSP28335—程序从 flash 复制到 ram 里的两种情况: 部分复制和全部复制 (2013-10-31 16:25:42) 转载▼ 标签: 分类: 学习交流 dsp 众所周知,微处理器从内存 RAM 中取指令的速度要比从 flash 中取指令要 快好多倍,但是 RAM 的缺陷限制了其不能存储用户程序代码,因为 RAM 掉电会丢 失数据,但是其速度要快,而 flash 内信息掉电不丢失,因此可以保存用户编程 的代码,但是其运算速度使得在一些实时性要求高或者对时间要求苛刻的场合不 能满足要求。如果能够将两者有机的结合到一起,从而可以解决这两者之间的矛 盾。 从片内 flash 搬运到 RAM 中的方法有两种不同的选择,一种是将 flash 中部 分代码搬运到 RAM 中运行;另一种便是将 flash 的所有程序代码都搬运到 RAM 中运行。前者利用#pragma CODE_SECTION(cpu_timer0_isr, "ramfuncs");来声明 将所要搬运的函数在 flash 上电初始化时自动将声明的函数搬运到 RAM 的 ramfuncs 段中,此方法也可以将所有的函数代码都搬运到 RAM 中,但是,这无 疑有点麻烦,有多少个函数就需要写多少条这样的语句,而且也只是搬运了函数 代码,其他的初始化数据段没有搬运,但是这种方法可以在用户程序太大以至于 RAM 中无法将所有代码都容纳下的情况下,将部分主要的要求时间苛刻的函数 搬运到 RAM 中运行以提高系统性能,例如一些中断函数。第二种方法可以在用 户编写代码都能被 RAM 所容纳下的情况下提高系统整体的性能,将 flash 代码 全部搬运到 RAM 中。但是当代码不能被 RAM 所容纳时此方法编不在可行,只 有硬件外扩 RAM 才行。下面就介绍一下这两种方法的具体实现方法: 方法一: 1、 cmd 定义: ramfuncs : LOAD = FLASHJ, PAGE = 0 RUN = RAMH0, PAGE = 0
LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart) 2、定义变量(装载或运行的起始地址) extern Uint16 RamfuncsLoadStart; extern Uint16 RamfuncsLoadEnd; extern Uint16 RamfuncsRunStart; 3、把要拷贝到 RAM 里的函数(eva_timer1_isr,eva_timer2_isr...)定义到段 ramfuncs #pragma CODE_SECTION(eva_timer1_isr, "ramfuncs"); #pragma CODE_SECTION(eva_timer2_isr, "ramfuncs"); #pragma CODE_SECTION(evb_timer3_isr, "ramfuncs"); // 声明中断函数 interrupt void eva_timer1_isr(void); interrupt void eva_timer2_isr(void); interrupt void evb_timer3_isr(void); interrupt void evb_timer4_isr(void); //初始化 flash 控制寄存器函数为 void InitFlash(void) { //函数内容省略,可参考 TI 提供的函数即可 } 4、在主函数中执行调用以下函数 MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart); InitFlash(); 至此便将声明的中断函数在 flash 上电初始化时自动搬运到 RAM 中运行。
分享到:
收藏