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

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);
}
...全文
276 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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这个地址又是怎么去算的?
在Windows 10或Windows 11操作系统中,用户经常会遇到共享打印机时出现的一系列错误代码,这些错误代码可能会阻碍打印机共享功能的正常使用。常见的错误代码包括0x00000057、0x00000709和0x0000011b,这些代码通常指出了不同的问题,比如权限不足、服务未运行或配置错误等。除此之外,还有一些故障提示如“连接失败”或“内存不足”,这些都可能影响到打印机共享的稳定性。 要解决这些故障,首先要确保打印机已经正确地连接到网络,并且在需要共享的电脑上进行了设置。确保打印机驱动程序是最新的,并且在共享设置中没有错误配置。对于权限问题,需要检查网络上的用户账户是否具有足够的权限来访问共享打印机。同时,也要确保打印机服务正在运行,特别是“Print Spooler”服务,因为这是打印机共享服务的核心组件。 在某些情况下,问题可能与操作系统的更新有关,如升级到最新版的Windows 10或Windows 11后可能出现的兼容性问题。这时,可能需要查看微软的官方支持文档来获取特定的解决方案或更新。 对于错误代码0x00000057,这通常是由于没有足够的权限来访问网络打印机或其共享资源,解决方法是确保网络打印机的权限设置正确,包括在组策略中设置相应的访问权限。而0x00000709错误可能是由于打印机驱动问题或打印机端口配置错误,可以尝试重新安装或更新打印机驱动来解决。至于0x0000011b错误,这往往是因为打印机队列服务的问题,检查并重启“Print Spooler”服务通常是解决这类问题的常见手段。 至于“连接失败”或“内存不足”这类故障,通常与客户端和打印机之间的网络连接以及打印机本地资源的使用情况有关。检查网络连接,确保打印机所在的网络段没有故障或中断。同时,如果打印机的打印队列长时间得不到处理,可能会导致内存不足的情况,这时可能需要清理打印队列或增加打印机的内存配置。 为了帮助用户更快速地解决这些问题,市面上出现了各种打印机共享错误修复工具。这些工具往往通过预设的修复程序来自动检测和修正打印机共享中常见的问题。它们可以快速检查打印机驱动、网络连接以及共享设置,并且能够提供一键修复功能,大幅减少了用户自行排查和解决问题的难度。 然而,在使用这些修复工具之前,用户应确保这些工具的来源是安全可靠的,避免因使用不当的修复工具而引发其他系统安全或隐私问题。用户可以到官方平台或者信誉良好的软件提供商处下载这些工具。通过细心检查打印机的共享设置,及时更新驱动程序和服务,以及合理使用修复工具,大多数共享打印机的问题都可以得到有效的解决。

19,520

社区成员

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

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