音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

關(guān)于拷貝代碼到SDRAM中執(zhí)行的不解,請指點!

作者:lhzw2001 欄目:ARM技術(shù)
關(guān)于拷貝代碼到SDRAM中執(zhí)行的不解,請指點!
常聽人家說代碼在FLASH中執(zhí)行的速度很慢,那行,

在44b0里是如何體現(xiàn)把代碼拷貝到SDRAM并執(zhí)行的呢?

我們寫應用程序時(比如寫個USB,或是做個應用系統(tǒng)之類的),好像沒有涉及到怎么把代碼拷貝到SDRAM中,并執(zhí)行它,請問這種情況常用嗎?

有看底層啟動代碼分析時,有說到把中斷向量表拷貝到SDRAM中來,

這樣可以更改,速度也快,這些在啟動代碼中是體現(xiàn)在哪里呢?

是不是  ^ _ISR_STARTADDRESS 就是把中斷向量拷貝到了內(nèi)存呢?


  ^ _ISR_STARTADDRESS
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4


2樓: >>參與討論
yxhyxh
44B0X本身并沒有映射的相關(guān)寄存器,跟4510不一樣.
如果你要在RAM中運行程序,那么你自己得在啟動代碼中將ROM中的RO域全部拷到RAM中的相應位置(當然,在之前,RW域應該已經(jīng)搬到RAM中的相應位置了).,然后,將PC指針指向RAM中正確的位置.像你給出的代碼中LDR    PC,=Main指令是不能夠?qū)е鲁绦蛟赗AM中運行的.我給你一個程序你分析分析.我的這個程序肯定是可以的:
44B0X代碼映射在RAM中執(zhí)行
                INCLUDE ..\inc\option.s
INCLUDE ..\inc\memcfg.s
;-------------------------------------
;Define ARM Mode&Interrupt Mask Bit
;-------------------------------------
USR_MODE    EQU 0x10    USER Mode
FIQ_MODE    EQU 0x11    FIQ Mode
IRQ_MODE    EQU 0x12    IRQ Mode
SVC_MODE    EQU 0x13    Supervisor Mode
ABT_MODE    EQU 0x17    Abort Mode
UND_MODE    EQU 0x1b    Undefined Mode
SYS_MODE    EQU 0x1f    SYSTEM Mode

IRQ_DIS     EQU 0x80    Disable IRQ
FIQ_DIS     EQU 0x40    Disable FIQ

MODEMASK    EQU 0x1f
NOINT     EQU 0xc0

;****************************************************************************
;中斷控制預定義
INTPND     EQU 0x01e00004
INTMOD     EQU 0x01e00008
INTMSK     EQU 0x01e0000c
I_ISPR     EQU 0x01e00020
I_CMST     EQU 0x01e0001c
I_ISPC     EQU 0x01e00024   

;****************************************************************************
;看門狗定時器預定義
WDTCON     EQU 0x01d30000

;****************************************************************************
;系統(tǒng)時鐘預定義
PLLCON     EQU 0x01d80000
CLKCON     EQU 0x01d80004
LOCKTIME    EQU 0x01d8000c

;****************************************************************************
;存儲器控制預定義
BWSCON      EQU 0x01c80000
REFRESH     EQU 0x01c80024

;****************************************************************************
;BDMA目的寄存器
BDIDES0     EQU 0x1f80008
BDIDES1     EQU 0x1f80028

;----------------------------------------------------------------
;定義用于處理IRQ中斷的宏定義
;-----------------------------------------------------
        MACRO
$HandlerLabel  HANDLER    $HandleLabel
$HandlerLabel
      sub   sp,sp,#4        
      stmfd sp!,{r0}
      ldr   r0,=$HandleLabel
      ldr   r0,[r0]
      由于相應的異常處理函數(shù)都已經(jīng)被復制到RAM中了,所以在取得的異常入口地址(ROM中的地址)加上一個偏移量,這個偏移量就等于RO域在RAM中的起始地址.這樣一來,當異常發(fā)生時,執(zhí)行的是RAM中的服務(wù)程序
      ldr r1,=|Image$$ZI$$Limit| to pointer the ram start address
      add r1,r1,#4
      add   r0,r0,r1 Remap to RAM
      str   r0,[sp,#4]
      ldmfd sp!,{r0,pc}
        MEND
;****************************************************************************        
    IMPORT  |Image$$RO$$Base|    Base of ROM Code
    IMPORT |Image$$RO$$Limit|   End of ROM code (=start of ROM data)
    IMPORT |Image$$RW$$Base|    Base of RAM to initialise
    IMPORT  |Image$$RW$$Limit|   End of RAM to Initialise
    IMPORT |Image$$ZI$$Base|    Base and limit of area
    IMPORT |Image$$ZI$$Limit|   to zero initialise
;***************************************************************************
IMPORT main         the Main Entry of C Source
;***************************************************************************
;    Reset Entry of Application
;***************************************************************************
AREA Startup ,CODE ,READONLY
CODE32
ENTRY
     B ResetHandler     Reset
     B HandlerUndef     Undefined ISR
     B HandlerSWI       SWI ISR
     B HandlerPabort    Prefetch Abort ISR
     B HandlerDabort    Data Abort ISR
     B .                Reserved
     B HandlerIRQ       IRQ ISR
     B HandlerFIQ       FIQ ISR
     
VectorBranch            Address = 0x0000 0020
     
    ldr pc,=HandlerEINT0    mGA    H/W interrupt vector table
    ldr pc,=HandlerEINT1     
    ldr pc,=HandlerEINT2    
    ldr pc,=HandlerEINT3    
    ldr pc,=HandlerEINT4567
    ldr pc,=HandlerTICK     mGA
    b .
    b .
    ldr pc,=HandlerZDMA0    mGB
    ldr pc,=HandlerZDMA1    
    ldr pc,=HandlerBDMA0    
    ldr pc,=HandlerBDMA1    
    ldr pc,=HandlerWDT     
    ldr pc,=HandlerUERR01   mGB
    b .
    b .
    ldr pc,=HandlerTIMER0   mGC
    ldr pc,=HandlerTIMER1   
    ldr pc,=HandlerTIMER2   
    ldr pc,=HandlerTIMER3   
    ldr pc,=HandlerTIMER4   
    ldr pc,=HandlerTIMER5   mGC
    b .
    b .
    ldr pc,=HandlerURXD0    mGD
    ldr pc,=HandlerURXD1    
    ldr pc,=HandlerIIC     
    ldr pc,=HandlerSIO     
&nbs
3樓: >>參與討論
yxhyxh
針對你提出的下面的問題,我再談?wù)勎业目捶?
問題:
  是不是  ^ _ISR_STARTADDRESS 就是把中斷向量拷貝到了內(nèi)存呢?


  ^ _ISR_STARTADDRESS
  HandleReset # 4
  HandleUndef # 4
  HandleSWI # 4
  HandlePabort # 4
  HandleDabort # 4
  HandleReserved # 4
  HandleIRQ # 4
  HandleFIQ # 4
答:
  這段代碼是為每個異常入口設(shè)置一個區(qū)域,存放異常入口向量.你理解的有點問題,不是拷貝.本身里面就存放的異常入口向量(包括IRQ\FIQ中斷向量),即使代碼是在ROM中運行的.
  參考啟動代碼中的一段程序:
   ldr r0,=HandleIRQ    ;Setup IRQ Handler
   ldr r1,=IsrIRQ
   str r1,[r0]
它所做的動作就是向RAM中HANDLEIRQ處存入IRQ中斷的入口向量.這個操作是在代碼向RAM中復制之前完成的.
實際上,IRQ中斷發(fā)生時,44B0X會從地址00000018H處取指令,這是44B0X的結(jié)構(gòu)決定了的,不因你是否將向量復制到RAM而改變.即執(zhí)行:B HandlerIRQ指令,跳轉(zhuǎn)到HANDLERIRQ去執(zhí)行.HANDLERIRQ是個什么樣的程序呢?再看看啟動代碼開頭所定義的宏函數(shù):

        MACRO
$HandlerLabel  HANDLER    $HandleLabel
$HandlerLabel
      sub   sp,sp,#4        
      stmfd sp!,{r0}
      ldr   r0,=$HandleLabel
      ldr   r0,[r0]
      由于相應的異常處理函數(shù)都已經(jīng)被復制到RAM中了,所以在取得的異常入口地址(ROM中的地址)加上一個偏移量,這個偏移量就等于RO域在RAM中的起始地址.這樣一來,當異常發(fā)生時,執(zhí)行的是RAM中的服務(wù)程序
      ldr r1,=|Image$$ZI$$Limit| to pointer the ram start address
      add r1,r1,#4
      add   r0,r0,r1 Remap to RAM
      str   r0,[sp,#4]
      ldmfd sp!,{r0,pc}
        MEND
     以及
     HandlerIRQ HANDLER HandleIRQ
     就知道了:
     實際上接著他就會去執(zhí)行RAM中HANDLEIRQ內(nèi)保存的地址處的代碼,即用戶編寫的.執(zhí)行程序:
IsrIRQ
     sub   sp,sp,#4
     stmfd sp!,{r8-r9}
     
     ldr   r9,=I_ISPR
     ldr   r9,[r9]
     mov   r8,#0
   
0                     Look-up IRQ Source
     movs r9,r9,lsr #1
     bcs %F1
     add  r8,r8,#4
     b   %B0
1
     ldr r9,=HandleADC Vector Table in SDRAM    
     add r9,r9,r8
     ldr r9,[r9]       ;Look-up IRQ ISR Address
     
     由于用C語言編寫的ISR函數(shù)已經(jīng)被復制到RAM中,所以,為了在RAM中執(zhí)行ISR,必須為取得的ROM中的ISR地址(這個地址實際是相對于0地址的)加上一個偏移量,這個偏移量就等于RO域代碼在RAM中的起始地址.這樣,當中斷發(fā)生時,實際執(zhí)行的是RAM中的ISR
     ldr r1,=|Image$$ZI$$Limit| ;to pointer the ram start address
     add r1,r1,#4
     add r9,r9,r1    ;Remap to RAM
     str r9,[sp,#8]
     ldmfd sp!,{r8-r9,pc}
  分析這段代碼,可以知道,如果發(fā)生了IRQ中斷,在這段程序中,會去查一個表,從這個表中尋找出用戶編寫的ISR中斷的入口地址,實際上到這一步才去執(zhí)行用戶編寫的ISR服務(wù)函數(shù).繞了一個大圈子.(這種處理方法在44B0X的DATASHEET中叫做非向量中斷,他還提供向量中斷模式,處理中斷的速度比這一種方式快).
  那么,程序查找的是一個什么樣的表呢?
  實際上也是在RAM中設(shè)置的一塊區(qū)域,如下:
;Don't use the label 'IntVectorTable',
;because armasm.exe cann't recognize this label correctly.
;the VALUE is different with an address you think it may be.
;IntVectorTable
HandleADC # 4
HandleRTC # 4
HandleUTXD1 # 4
HandleUTXD0 # 4
HandleSIO # 4
HandleIIC # 4
HandleURXD1 # 4
HandleURXD0 # 4
HandleTIMER5 # 4
HandleTIMER4 # 4
HandleTIMER3 # 4
HandleTIMER2 # 4
HandleTIMER1 # 4
HandleTIMER0 # 4
HandleUERR01 # 4
HandleWDT # 4
HandleBDMA1 # 4
HandleBDMA0 # 4
HandleZDMA1 # 4
HandleZDMA0 # 4
HandleTICK # 4
HandleEINT4567 # 4
HandleEINT3 # 4
HandleEINT2 # 4
HandleEINT1 # 4
HandleEINT0 # 4   0xc1(c7)fff84
這個表格中保存的是用戶編寫的ISR的入口地址,當然在用戶編寫的C程序中,必須將ISR的入口地址保存在這個表中,以備查用.怎么保存進去,到網(wǎng)上找一個例子程序,讀讀它的ISRINIT函數(shù)是怎么處理的就知道了



4樓: >>參與討論
luhuaren
re
非常感謝   yxhyxh  的熱心回答!讓我再次看到一個技術(shù)人的人格魅力!

5樓: >>參與討論
luhuaren
RE
TO:yxhyxh   您QQ號是多少?  我在深圳。。  QQ號 83131943 或 29324911

6樓: >>參與討論
eqtwo
我也正在這個問題上掙扎,可以加我嗎?QQ:37722433
 
7樓: >>參與討論
wydian
11
沒有中斷的可以 有中斷的44b0 可能要麻煩

8樓: >>參與討論
yxhyxh
我的MSN:yyyxxxhhyy@sohu.com
我的程序就是包含中斷的.只是理解上多拐個彎而已

9樓: >>參與討論
lhzw2001
高手,以后,請多多指點小弟!
 
10樓: >>參與討論
jy6715
我也好好看看
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
關(guān)于RTL9081的問題
請問各位大俠!!如何處理LPC3.3V與5.0V的電平轉(zhuǎn)換
找熟練掌握嵌入式軟件和硬件開發(fā)的工程師合作
關(guān)于PLC2210
請教 arm的初級問題
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號