没有合适的资源?快使用搜索试试~ 我知道了~
首页dsp28335开发总结
1 #pragma CODE_SECTION(InitFlash, "ramfuncs")? 众所周知,微处理器从内存RAM中取指令的速度要比从flash中取指令要快好多倍,但是RAM的缺陷限制了其不能存储用户程序代码,因为RAM掉电会丢失数据,但是其速度要快,而flash内信息掉电不丢失,因此可以保存用户编程的代码,但是其运算速度使得在一些实时性要求高或者对时间要求苛刻的场合不能满足要求。如果能够将两者有机的结合到一起,从而可以解决这两者之间的矛盾。 从片内flash搬运到RAM中的方法有两种不同的选择, asm(" RPT #7 || NOP")? 其实这条语句在DSP等系统开发中经常要用到,比如更改某些配置后需要延时几个时钟周期才能够生效,这时asm(” RPT #7 || NOP”)便可以闪亮登场了。虽然这个功能我们都知道而且经常使用,但是具体的细节很多人却不知道,包括我。今天在一个交流群里有人突然问这条指令下去执行之后,会占用多少时钟周期呢?结果可想而知问蒙了。
资源详情
资源评论
资源推荐
DSP 总结
1 #pragma CODE_SECTION(InitFlash, "ramfuncs")?
众所周知,微处理器从内存 RAM 中取指令的速度要比从 ash 中取指令
要快好多倍,但是 RAM 的缺陷限制了其不能存储用户程序代码,因为 RAM 掉
电会丢失数据,但是其速度要快,而 ash 内信息掉电不丢失,因此可以保存
用户编程的代码,但是其运算速度使得在一些实时性要求高或者对时间要求苛
刻的场合不能满足要求。如果能够将两者有机的结合到一起,从而可以解决这
两者之间的矛盾。
从片内 flash 搬运到 RAM 中的方法有两种不同的选择,一种是将 flash 中
部分代码搬运到 RAM 中运行;另一种便是将 flash 的所有程序代码都搬运到
RAM 中运行。前者利用#pragmaCODE_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、定义变量(装载或运行的起始地址)
externUint16RamfuncsLoadStart;
externUint16RamfuncsLoadEnd;
externUint16RamfuncsRunStart;
3、把要拷贝到 RAM 里的函数(eva_timer1_isr,eva_timer2_isr...)定义到
段 ramfuncs
#pragmaCODE_SECTION(eva_timer1_isr,"ramfuncs");
#pragmaCODE_SECTION(eva_timer2_isr,"ramfuncs");
#pragmaCODE_SECTION(evb_timer3_isr,"ramfuncs");
//声明中断函数
interruptvoideva_timer1_isr(void);
interruptvoideva_timer2_isr(void);
interruptvoidevb_timer3_isr(void);
interruptvoidevb_timer4_isr(void);
//初始化 flash控制寄存器函数为
voidInitFlash(void)
{
//函数内容省略,可参考 TI 提供的函数即可
}
4、在主函数中执行调用以下函数
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart)
;
InitFlash();
至此便将声明的中断函数在 flash 上电初始化时自动搬运到 RAM 中运行。
方法二:
1、参考博文:DSP28335—把 TMS320F28XXX 的程序段从 ash 复制
到 ram 中运行
http://blog.sina.com.cn/s/blog_762cf5f80101apfx.html
2、参考论文《基于 DSP28335 程序移植方法的研究与实现》有助于理解
系统启动过程及 FLASH 引导模式
2 asm(" RPT #7 || NOP")?
其实这条语句在 DSP 等系统开发中经常要用到,比如更改某些配置后
需要延时几个时钟周期才能够生效,这时 asm(” RPT #7 || NOP”)便
可以闪亮登场了。虽然这个功能我们都知道而且经常使用,但是具体
的细节很多人却不知道,包括我。今天在一个交流群里有人突然问这
条指令下去执行之后,会占用多少时钟周期呢?结果可想而知问蒙了。
简单写段代码编译下载到片子里面(我是用的 28335 进行测试的!),
观察 CPU Timer0 寄存器的 TIMER0TIM 位。发现执行 asm(” RPT
#7 || NOP”)之后,TIMER0TIM 位增量是 8.也就是说每执行一次需要
8 个时钟周期。确切的说是 8 个指令周期。这只是对 CPU 空闲的情况
而言,因为空闲的时候,一个指令周期大约就是一个时钟周期。如果
28335 有任务的时候,可能就会占用 9 个抑或更多的时钟周期,这要
分析流水线等因素。实际应用时,大可不必如此精准。用别的片子也
可能会多于 8 个时钟,主要看片子执行每条指令需要多少个时钟周期。
但有一点可以肯定的是 asm(” RPT #7 || NOP”)这条指令必然会侵占
8 个指令周期.因为这条指令的意思就是重复执行 7+1=8 次¶NOP 指
令。
简单的总结一下:
对于 TMS320F28335 而言 asm(” RPT #N || NOP”)会执行 N+1 次
NOP 指令,占用 N+1 个指令周期。正常情况下占用 N+1 个时钟周期。
其他的片子占用的时钟周期自己计算。O(∩_∩)o …
3 对 LOAD_START,LOAD_END,'RUN_START 汇编伪指令的理
解?
在 TI 给的 28335 例程 Example_2833xCodeRunFromXintf 中,这个例子的目的是将
定时器 0 和定时器 1 的中断服务函数的代码从 SARAM 的 L1 区搬运到外扩
SRAM(ZONE7)上运行,28335 有 3 个定时器 Timer0,Timer1,Timer2,其中只有
Timer0 经过 PIE,其他两个定时器中断直接与 CPU 相连,如下图
程序中将 Timer0 和 Timer1 的中断服务函数的代码搬运到外扩的 SRAM 上运行,
Timer3 的中断服务函数依然在片上 SARAM 上运行,Timer3 作为比较,看看 Timer0 和
Timer1 的中断服务函数是否在外扩 SRAM 上运行正常。在程序的 CMD 链接文件中有如
下的代码:
剩余16页未读,继续阅读
qq_26273783
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0