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

xqhrs232 2014-12-30 03:52:22
看不懂一段代码的地址是怎么来的,不知道这个地址该怎么算出来。
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);
}
...全文
224 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqhrs232 2015-01-10
  • 打赏
  • 举报
回复
引用 7 楼 paul_chao 的回复:
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
0xE59FF3D8是LDR PC, [PC, #3E0 - 8]这条语句的机器码???
paul_chao 2015-01-09
  • 打赏
  • 举报
回复
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
  • 打赏
  • 举报
回复
我连会变中的函数ASM_IsrHandler的地址值都不知道是多少!pISR = 0xE59FF3D8; 明显说明ASM_IsrHandler的地址值是固定的。
91program 2014-12-30
  • 打赏
  • 举报
回复
这个要看 CPU 手机与原理图吧,只看代码估计是分析不出来的。 ———————————————————————————————————————————————— 我参加 CSDN 博客之星大赛了,投票网址如下,大家多多支持。多谢先! http://vote.blog.csdn.net/blogstar2014/details?username=91program#content
xqhrs232 2014-12-30
  • 打赏
  • 举报
回复


#define pISR		(*(volatile unsigned *)(DRAM_BASE_PA_START+0x18))


;------------------------------------------------------------------------------
;
;	StartUp Entry
;
;	Main entry point for CPU initialization.
;
;------------------------------------------------------------------------------
	LEAF_ENTRY      StartUp

		b		ResetHandler
		b		.				; HandlerUndef
		b		.				; HandlerSWI
		b		.				; HandlerPabort
		b		.				; HandlerDabort
		b		.				; HandlerReserved
		b		.				; HandlerIRQ
		b		.				; HandlerFIQ


这个地方的0X18应该是HandlerIRQ处在第7个中断!一个中断地址用4个字节的地址来存储!!!(7-1)*4=24(0x18)
xqhrs232 2014-12-30
  • 打赏
  • 举报
回复
看下面的几个文件也没看出什么名堂!!! 1、Startup.s 2、Oemaddrtab_cfg_eboot.inc 3、Image_cfg.inc/Image_cfg.h 4、Eboot.bib 5、Makefile.inc
xqhrs232 2014-12-30
  • 打赏
  • 举报
回复


#define pISR		(*(volatile unsigned *)(DRAM_BASE_PA_START+0x18))


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);
}


还有就是*((volatile unsigned long *)(0x3F8)) = (unsigned)ASM_IsrHandler;这句里面的0x3F8这个地址又是怎么去算的?

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧