求助 关于MRC p15,0,R0,c0,c0,0的问题

baiminsheng 2009-03-27 12:00:09
MRC p15,0,R1,c0,c0,0这个指令是来读取ARM CPU的ID号到ARM寄存器R1里面的吗?如果是的话,我现在在EVC环境下嵌入了有下面汇编内容的.s文件:
AREA |.text|, CODE

EXPORT ARMCPUID
ARMCPUID PROC
MRC p15, 0, R1, c0, c0 ,0
STR R1,[R0],#0
MOV pc,lr
END
我想调用ARMCPUID这个函数来读取R0中存储的ID号,我怎么在EVC的环境下读取呢?
下面我简单说一下我的过程:我建立了一个button和一个edit,想通过点击这个button 在edit中显示出这个ID来,我在edit中关联了一个CString型的变量m_ID,然后在调用了ARMCPUID(&m_ID)来读取,但是我没有成功,请高人指点我应该如何去做,是不是我的这几句汇编不对啊。非常着急,我在线等,不胜感激。
...全文
373 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
baiminsheng 2009-03-27
  • 打赏
  • 举报
回复
哦 不好意思,我最开始写错了,是想读R1中内容,其实写哪个寄存器都行,呵呵
baiminsheng 2009-03-27
  • 打赏
  • 举报
回复
恩对是读c0到R0,我看datasheet上说的c0存储的就是ID,其实嵌入x86CPU的汇编只用_asm{}就能实现,但是现在嵌入的是ARM的汇编就不能那么做了,现在比较困惑,ADS我没有用过。
gooogleman 2009-03-27
  • 打赏
  • 举报
回复


上面的协处理器指令是读C0 送到R1

EVC嵌入汇编没有做过。

你参照一下ADS的样子试试。
baiminsheng 2009-03-27
  • 打赏
  • 举报
回复
谢谢您的提醒,我知道哪里出问题了,我定义的变量的类型不对,应该是unsigned int类型的,真是一着不慎满盘皆输啊呵呵,现在读出结果来了,显示的结果是1761946886.不知道对不对,我再检查一下,谢谢您了。我会把分数给您。我看看分数怎么给啊。我的msn是minshengbai@live.cn.如果您有兴趣,可以加我。再次感谢。
paul_chao 2009-03-27
  • 打赏
  • 举报
回复
有說明圖, 但沒法附上 (Please refer Intel XScale® Core Developer’s Manual, Page 81, Register 0: ID & Cache Type Registers)

31:24 Read / Write Ignored Implementation trademark (0x69 = ‘i’= Intel Corporation)
23:16 Read / Write Ignored Architecture version = ARM* Version 5TE

這東西會回傳一個 32-bits 值給你, 該值應為 0x6905xxxx, 所以你檢查 m_ID 的值, 該變數應為 unsigned int 的型態.

所以該函數 ARMCPUID 應該是正常工作, 是你期待錯了.

Paul, Chao @ Techware
baiminsheng 2009-03-27
  • 打赏
  • 举报
回复
不好意思,我的cpu是ARM PXA255的
baiminsheng 2009-03-27
  • 打赏
  • 举报
回复
那个.s文件里面定义了ARMCPUID这样的一个函数,我在button的程序代码中直接可以调用这个函数来进行读取,我在button的代码中是这样写的:
void CARMCPUDlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData();
ARMCPUID(&m_ID);//这个ARMCPUID函数就是在.s文件中Export的那个函数
UpdateData(false);
}
没有成功指的是:没有传回给我任何信息,我感觉ARM CPU的ID应该是一个字符串形式数据
我的arm型号是PXA270。
整个在我主机上的EVC程序是没有问题的,而在那个arm的设备上 我点击了那个button按钮以后 就没有读出数据。
baiminsheng 2009-03-27
  • 打赏
  • 举报
回复
那个.s文件里面定义了ARMCPUID这样的一个函数,我在button的程序代码中直接可以调用这个函数来进行读取,我在button的代码中是这样写的:
void CARMCPUDlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData();
ARMCPUID(&m_ID);//这个ARMCPUID函数就是在.s文件中Export的那个函数
UpdateData(false);
}
没有成功指的是:没有传回给我任何信息,我感觉ARM CPU的ID应该是一个字符串形式数据
我的arm型号是PXA270。
整个在我主机上的EVC程序是没有问题的,而在那个arm的设备上 我点击了那个button按钮以后 就没有读出数据。
paul_chao 2009-03-27
  • 打赏
  • 举报
回复
請教何謂 "然后在调用了ARMCPUID(&m_ID)来读取,但是我没有成功", 請問這個沒有成功, 指的是傳回值不對, 還是有錯誤發生呢?? 若是傳回值不對, 那該傳回值為何, 您預期的值又為何??

順便可否把您測試的機器上的 CPU 型號一併告知.

Paul, Chao @ Techware
ARM实验 仅供参考;//===================================================================== ;// File Name : 2410slib.s ;// Function : S3C2410 (Assembly) ;// Program : Shin, On Pil (SOP) ;// Date : March 20, 2002 ;// Version : 0.0 ;// History ;// 0.0 : Programming start (February 26,2002) -> SOP ;//===================================================================== ;//Interrupt, FIQ/IRQ disable NOINT EQU 0xc0 ;//1100 0000 ;//Check if tasm.exe(armasm -16 ...@ADS 1.0) is used. GBLL THUMBCODE [ {CONFIG} = 16 THUMBCODE SETL {TRUE} CODE32 | THUMBCODE SETL {FALSE} ] MACRO MOV_PC_LR [ THUMBCODE bx lr | mov pc,lr ] MEND AREA |C$$code|, CODE, READONLY ;//============== ;// CPSR I,F bit ;//============== ;//int SET_IF(void); ;//The return value is current CPSR. EXPORT SET_IF SET_IF ;//This function works only if the processor is in previliged mode. mrs r0,cpsr mov r1,r0 orr r1,r1,#NOINT msr cpsr_cxsf,r1 MOV_PC_LR ;//void WR_IF(int cpsrValue); EXPORT WR_IF WR_IF ;//This function works only if the processor is in previliged mode. msr cpsr_cxsf,r0 MOV_PC_LR ;//void CLR_IF(void); EXPORT CLR_IF CLR_IF ;//This function works only if the processor is in previliged mode. mrs r0,cpsr bic r0,r0,#NOINT msr cpsr_cxsf,r0 MOV_PC_LR ;//==================================== ;// MMU Cache/TLB/etc on/off functions ;//==================================== R1_I EQU (1<<12) R1_C EQU (1<<2) R1_A EQU (1<<1) R1_M EQU (1) R1_iA EQU (1<<31) R1_nF EQU (1<<30) ;//void MMU_EnableICache(void) EXPORT MMU_EnableICache MMU_EnableICache mrc p15,0,r0,c1,c0,0 orr r0,r0,#R1_I mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_DisableICache(void) EXPORT MMU_DisableICache MMU_DisableICache mrc p15,0,r0,c1,c0,0 bic r0,r0,#R1_I mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_EnableDCache(void) EXPORT MMU_EnableDCache MMU_EnableDCache mrc p15,0,r0,c1,c0,0 orr r0,r0,#R1_C mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_DisableDCache(void) EXPORT MMU_DisableDCache MMU_DisableDCache mrc p15,0,r0,c1,c0,0 bic r0,r0,#R1_C mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_EnableAlignFault(void) EXPORT MMU_EnableAlignFault MMU_EnableAlignFault mrc p15,0,r0,c1,c0,0 orr r0,r0,#R1_A mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_DisableAlignFault(void) EXPORT MMU_DisableAlignFault MMU_DisableAlignFault mrc p15,0,r0,c1,c0,0 bic r0,r0,#R1_A mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_EnableMMU(void) EXPORT MMU_EnableMMU MMU_EnableMMU mrc p15,0,r0,c1,c0,0 orr r0,r0,#R1_M mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_DisableMMU(void) EXPORT MMU_DisableMMU MMU_DisableMMU mrc p15,0,r0,c1,c0,0 bic r0,r0,#R1_M mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_SetFastBusMode(void) ;// FCLK:HCLK= 1:1 EXPORT MMU_SetFastBusMode MMU_SetFastBusMode mrc p15,0,r0,c1,c0,0 bic r0,r0,#R1_iA:OR:R1_nF mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_SetAsyncBusMode(void) ;// FCLK:HCLK= 1:2 EXPORT MMU_SetAsyncBusMode MMU_SetAsyncBusMode mrc p15,0,r0,c1,c0,0 orr r0,r0,#R1_nF:OR:R1_iA mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//========================= ;// Set TTBase ;//========================= ;//void MMU_SetTTBase(int base) EXPORT MMU_SetTTBase MMU_SetTTBase ;//ro=TTBase mcr p15,0,r0,c2,c0,0 MOV_PC_LR ;//========================= ;// Set Domain ;//========================= ;//void MMU_SetDomain(int domain) EXPORT MMU_SetDomain MMU_SetDomain ;//ro=domain mcr p15,0,r0,c3,c0,0 MOV_PC_LR ;//========================= ;// ICache/DCache functions ;//========================= ;//void MMU_InvalidateIDCache(void) EXPORT MMU_InvalidateIDCache MMU_InvalidateIDCache mcr p15,0,r0,c7,c7,0 MOV_PC_LR ;//void MMU_InvalidateICache(void) EXPORT MMU_InvalidateICache MMU_InvalidateICache mcr p15,0,r0,c7,c5,0 MOV_PC_LR ;//void MMU_InvalidateICacheMVA(U32 mva) EXPORT MMU_InvalidateICacheMVA MMU_InvalidateICacheMVA ;//r0=mva mcr p15,0,r0,c7,c5,1 MOV_PC_LR ;//void MMU_PrefetchICacheMVA(U32 mva) EXPORT MMU_PrefetchICacheMVA MMU_PrefetchICacheMVA ;//r0=mva mcr p15,0,r0,c7,c13,1 MOV_PC_LR ;//void MMU_InvalidateDCache(void) EXPORT MMU_InvalidateDCache MMU_InvalidateDCache mcr p15,0,r0,c7,c6,0 MOV_PC_LR ;//void MMU_InvalidateDCacheMVA(U32 mva) EXPORT MMU_InvalidateDCacheMVA MMU_InvalidateDCacheMVA ;//r0=mva mcr p15,0,r0,c7,c6,1 MOV_PC_LR ;//void MMU_CleanDCacheMVA(U32 mva) EXPORT MMU_CleanDCacheMVA MMU_CleanDCacheMVA ;r0=mva mcr p15,0,r0,c7,c10,1 MOV_PC_LR ;//void MMU_CleanInvalidateDCacheMVA(U32 mva) EXPORT MMU_CleanInvalidateDCacheMVA MMU_CleanInvalidateDCacheMVA ;r0=mva mcr p15,0,r0,c7,c14,1 MOV_PC_LR ;//void MMU_CleanDCacheIndex(U32 index) EXPORT MMU_CleanDCacheIndex MMU_CleanDCacheIndex ;r0=index mcr p15,0,r0,c7,c10,2 MOV_PC_LR ;//void MMU_CleanInvalidateDCacheIndex(U32 index) EXPORT MMU_CleanInvalidateDCacheIndex MMU_CleanInvalidateDCacheIndex ;r0=index mcr p15,0,r0,c7,c14,2 MOV_PC_LR ;//void MMU_WaitForInterrupt(void) EXPORT MMU_WaitForInterrupt MMU_WaitForInterrupt mcr p15,0,r0,c7,c0,4 MOV_PC_LR ;//=============== ;// TLB functions ;//=============== ;//voic MMU_InvalidateTLB(void) EXPORT MMU_InvalidateTLB MMU_InvalidateTLB mcr p15,0,r0,c8,c7,0 MOV_PC_LR ;//void MMU_InvalidateITLB(void) EXPORT MMU_InvalidateITLB MMU_InvalidateITLB mcr p15,0,r0,c8,c5,0 MOV_PC_LR ;//void MMU_InvalidateITLBMVA(U32 mva) EXPORT MMU_InvalidateITLBMVA MMU_InvalidateITLBMVA ;//ro=mva mcr p15,0,r0,c8,c5,1 MOV_PC_LR ;//void MMU_InvalidateDTLB(void) EXPORT MMU_InvalidateDTLB MMU_InvalidateDTLB mcr p15,0,r0,c8,c6,0 MOV_PC_LR ;//void MMU_InvalidateDTLBMVA(U32 mva) EXPORT MMU_InvalidateDTLBMVA MMU_InvalidateDTLBMVA ;//r0=mva mcr p15,0,r0,c8,c6,1 MOV_PC_LR ;//================= ;// Cache lock down ;//================= ;//void MMU_SetDCacheLockdownBase(U32 base) EXPORT MMU_SetDCacheLockdownBase MMU_SetDCacheLockdownBase ;//r0= victim & lockdown base mcr p15,0,r0,c9,c0,0 MOV_PC_LR ;//void MMU_SetICacheLockdownBase(U32 base) EXPORT MMU_SetICacheLockdownBase MMU_SetICacheLockdownBase ;//r0= victim & lockdown base mcr p15,0,r0,c9,c0,1 MOV_PC_LR ;//================= ;// TLB lock down ;//================= ;//void MMU_SetDTLBLockdown(U32 baseVictim) EXPORT MMU_SetDTLBLockdown MMU_SetDTLBLockdown ;//r0= baseVictim mcr p15,0,r0,c10,c0,0 MOV_PC_LR ;//void MMU_SetITLBLockdown(U32 baseVictim) EXPORT MMU_SetITLBLockdown MMU_SetITLBLockdown ;//r0= baseVictim mcr p15,0,r0,c10,c0,1 MOV_PC_LR ;//============ ;// Process ID ;//============ ;//void MMU_SetProcessId(U32 pid) EXPORT MMU_SetProcessId MMU_SetProcessId ;//r0= pid mcr p15,0,r0,c13,c0,0 MOV_PC_LR END

19,523

社区成员

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

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