|
|||||||||||
| 技術(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ù) |
常聽人家說代碼在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 于 2006/3/3 9:24:00 發(fā)布:
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 于 2006/3/3 9:59:00 發(fā)布:
針對你提出的下面的問題,我再談?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 于 2006/3/3 19:53:00 發(fā)布:
re 非常感謝 yxhyxh 的熱心回答!讓我再次看到一個技術(shù)人的人格魅力! |
|
| 5樓: | >>參與討論 |
| 作者: luhuaren 于 2006/3/3 21:00:00 發(fā)布:
RE TO:yxhyxh 您QQ號是多少? 我在深圳。。 QQ號 83131943 或 29324911 |
|
| 6樓: | >>參與討論 |
| 作者: eqtwo 于 2006/3/4 8:27:00 發(fā)布:
我也正在這個問題上掙扎,可以加我嗎?QQ:37722433 |
|
| 7樓: | >>參與討論 |
| 作者: wydian 于 2006/3/4 12:49:00 發(fā)布:
11 沒有中斷的可以 有中斷的44b0 可能要麻煩 |
|
| 8樓: | >>參與討論 |
| 作者: yxhyxh 于 2006/3/6 8:58:00 發(fā)布:
我的MSN:yyyxxxhhyy@sohu.com 我的程序就是包含中斷的.只是理解上多拐個彎而已 |
|
| 9樓: | >>參與討論 |
| 作者: lhzw2001 于 2006/3/6 16:41:00 發(fā)布:
高手,以后,請多多指點小弟! |
|
| 10樓: | >>參與討論 |
| 作者: jy6715 于 2006/3/7 10:03:00 發(fā)布:
我也好好看看 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |