新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 让单片机运行速度更快一些

让单片机运行速度更快一些

作者: 时间:2016-12-02 来源:网络 收藏


所以,在RamApp.lnx中指定的定位规则应该在SDRAM中,如下:
  
MEMORY
  {
  ram1: ORIGIN = 0x00003000, LENGTH = 0xf000
  ram: ORIGIN = 0x00F00000, LENGTH = 0x7000
  }
  SECTIONS
  {
  .data : {} > ram1
  .text : {} > ram
  }

最后,在860单片机系统的地址映射规则如图2所示。对照图1,可以观察到这和传统的程序地址映射有很大不同。


图2地址映射表

3.2 搬运的过程

860T上电复位,RomTool.bin首先被执行,完成初始化工作后,运行代码搬运函数,将RAMapp.bin搬运到SDRAM中,随后改变PC(Program Counter)的值,无条件转移到SDRAM中运行RAMapp.bin,如图3所示。


图3从Flash到SDRAM搬运代码的过程

3.3 搬运代码的驱动模块及跳转模块源代码

(1)搬运代码驱动模块的代码

void MoveCodeF_to_RAM(UWORD *FlashCode_Add, UWORD *RamCode_Add,UWORD CodeLen) {
  do{
  *RamCode_Add++ = *FlashCode_Add++;
  CodeLen?
  } while ( CodeLen!=0)
  }

该段代码是将开始地址为FlashCode_Add,长度为CodeLen的Flash代码搬运到开始地址为RamCode_Add,长度为CodeLen的SDRAM 中。

(2)主函数及跳转模块

  #define FlashCode_Add_V 0x02810000
  #define RamCode_Add_V 0x00f00000
  #define CodeLen_V 0x00070000/4
  void main(){
  UWORD *I=(UWORD *) FlashCode_Add_v;
  UWORD *j= (UWORD *) RamCode_Add_v;
  UWORD *k= (UWORD *) CodeLen_V;
  MoveCodeF_to_RAM( (UWORD *) i, (UWORD *) j, (UWORD *)k );
  # 跳转模块
  asm(“addis r2,0,0x00f0”);
  asm(“ori r2,r2,0x0000”); # 代码起始地址0x00f00000
  asm(“mtspr LR,r2”);
  asm(“bclr 20,0”); # 无条件转跳到链接寄存器
  # (LR)中的地址
  }
  FlashCode_Add_V:被搬运代码的首地址,在Flash中。
  RamCode_Add_V:被搬运代码的目标地址,在RAM中。
  CodeLen_V:被搬运代码的长度,按32位计算。

该函数在调用代码搬运MoveCodeF_to_RAM函数,将代码从Flash搬运到SDRAM中后,将程序指针转移到SDRAM中。注意跳转的地址一定要和RamCode_Add_V一致。

4 小 结

可见,正确完成代码搬运的关键在于:
  
① 确定被搬运代码的物理地址映射规则, 物理地址一定是在SDRAM中;
② 被搬运代码是被烧结在Flash中,后来又被搬运到SDRAM中;
③ 无条件转移到SDRAM中,运行被搬运代码(应用程序代码)。

对于其它型号的单片机,可以根据该原理类推,方法是一样的,只是具体的代码不同而已。相信你的单片机系统在经过这样的处理后,效率一定会高很多。

上一页 1 2 下一页

关键词: 单片机运行速

评论


技术专区

关闭