当前位置: 代码迷 >> WinCE >> 看不懂一段代码的地址是如何来的,不知道这个地址该如何算出来
  详细解决方案

看不懂一段代码的地址是如何来的,不知道这个地址该如何算出来

热度:227   发布时间:2016-04-28 11:54:29.0
看不懂一段代码的地址是怎么来的,不知道这个地址该怎么算出来。
看不懂一段代码的地址是怎么来的,不知道这个地址该怎么算出来。
pISR = 0xE59FF3D8;  这个地址是怎么来的?


void InitializeInterrupt(void)
{
sV210VIC0 = (VIC_REG *)OALPAtoVA(BASE_REG_PA_VIC0, FALSE);
sV210VIC1 = (VIC_REG *)OALPAtoVA(BASE_REG_PA_VIC1, FALSE);
sV210VIC2 = (VIC_REG *)OALPAtoVA(BASE_REG_PA_VIC2, FALSE);

InitializeVIC();

// make value to assemble code "b IsrHandler"
//EdbgOutputDebugString("INFO: (unsigned)pISR : 0x%x\r\n", (unsigned)pISR);
//pISR =(unsigned)(0xEA000000)+(((unsigned)ASM_IsrHandler - (0x80000000 + 0x18 + 0x8) )>>2);

    pISR = 0xE59FF3D8;          // LDR PC, [PC, #3E0 - 8]
    *((volatile unsigned long *)(0x3F8)) = (unsigned)ASM_IsrHandler;

EdbgOutputDebugString("EOTG: USB DeInit 0x%x\r\n",(pISR));
INTC_ClearVectAddr();

//INTC_Enable(PHYIRQ_OTG);
}
------解决思路----------------------
1. 程式中已述明了
pISR = 0xE59FF3D8;          // LDR PC, [PC, #3E0 - 8]

意思就是 ldr pc, [pc, #3E0 - 8] 這句 assembly code assembler 後的 machine code 就是 0xE59FF3D8, 所以它不是 address
2. ARM 的 exception handler 位址是固定的, 如3L所言, 0x18 即為 IRQ Handler 的位址.
3. 
    pISR = 0xE59FF3D8;          // LDR PC, [PC, #3E0 - 8]
    *((volatile unsigned long *)(0x3F8)) = (unsigned)ASM_IsrHandler;

這段的意思是, 在 Address=0x18 的地方放入程式碼 ldr pc, [pc, #3E0-8], 在 IRQ 發生時, 會執行到它, 此行程式碼再把存在 0x3F8 內的資料當作位址, JUMP 過去執行, 而第二行就是將 ASM_IsrHandler 當作位址存在 0x3F8 中.
4. 這應是 Samsung 的BSP 中的 Eboot 的程式碼, 因為在 EBoot 中整個 Exception Handler 的機制都闕如, 所以它一般是不開IRQ的, 而 USBD 不用 IRQ 做又無法實現, 所以它的BSP才會鑽了個洞, 用這個方式來做.

Paul, Chao @ Techware
  相关解决方案