新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 讓單片機運行速度更快一些

讓單片機運行速度更快一些

作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏


所以,在RamApp.lnx中指定的定位規(guī)則應(yīng)該在SDRAM中,如下:
  
MEMORY
  {
  ram1: ORIGIN = 0x00003000, LENGTH = 0xf000
  ram: ORIGIN = 0x00F00000, LENGTH = 0x7000
  }
  SECTIONS
  {
  .data : {} > ram1
  .text : {} > ram
  }

最后,在860單片機系統(tǒng)的地址映射規(guī)則如圖2所示。對照圖1,可以觀察到這和傳統(tǒng)的程序地址映射有很大不同。


圖2地址映射表

3.2 搬運的過程

860T上電復(fù)位,RomTool.bin首先被執(zhí)行,完成初始化工作后,運行代碼搬運函數(shù),將RAMapp.bin搬運到SDRAM中,隨后改變PC(Program Counter)的值,無條件轉(zhuǎn)移到SDRAM中運行RAMapp.bin,如圖3所示。


圖3從Flash到SDRAM搬運代碼的過程

3.3 搬運代碼的驅(qū)動模塊及跳轉(zhuǎn)模塊源代碼

(1)搬運代碼驅(qū)動模塊的代碼

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)主函數(shù)及跳轉(zhuǎn)模塊

  #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 );
  # 跳轉(zhuǎn)模塊
  asm(“addis r2,0,0x00f0”);
  asm(“ori r2,r2,0x0000”); # 代碼起始地址0x00f00000
  asm(“mtspr LR,r2”);
  asm(“bclr 20,0”); # 無條件轉(zhuǎn)跳到鏈接寄存器
  # (LR)中的地址
  }
  FlashCode_Add_V:被搬運代碼的首地址,在Flash中。
  RamCode_Add_V:被搬運代碼的目標(biāo)地址,在RAM中。
  CodeLen_V:被搬運代碼的長度,按32位計算。

該函數(shù)在調(diào)用代碼搬運MoveCodeF_to_RAM函數(shù),將代碼從Flash搬運到SDRAM中后,將程序指針轉(zhuǎn)移到SDRAM中。注意跳轉(zhuǎn)的地址一定要和RamCode_Add_V一致。

4 小 結(jié)

可見,正確完成代碼搬運的關(guān)鍵在于:
  
① 確定被搬運代碼的物理地址映射規(guī)則, 物理地址一定是在SDRAM中;
② 被搬運代碼是被燒結(jié)在Flash中,后來又被搬運到SDRAM中;
③ 無條件轉(zhuǎn)移到SDRAM中,運行被搬運代碼(應(yīng)用程序代碼)。

對于其它型號的單片機,可以根據(jù)該原理類推,方法是一樣的,只是具體的代碼不同而已。相信你的單片機系統(tǒng)在經(jīng)過這樣的處理后,效率一定會高很多。

上一頁 1 2 下一頁

關(guān)鍵詞: 單片機運行速

評論


技術(shù)專區(qū)

關(guān)閉