我有一个基于ARMv5的非XScale设备(SHARP Brain™电子词典),在NAND闪存中安装了Windows Embedded CE 6.0,我使用TCPMP播放我最喜欢的AAC乐曲和MPEG-4电影。 / p>
但是,当我启动TCPMP时,有时TCPMP会冻结。所以我研究了TCPMP,并设法发现执行此代码时会发生冻结。
CheckARMXScale PROC
mov r0,#0x1000000
mov r1,#0x1000000
mar acc0,r0,r1 ; <--- here
mov r0,#32
mov r1,#32
mra r0,r1,acc0
cmp r0,#0x1000000
moveq r0,#1
movne r0,#0
cmp r1,#0x1000000 ;64bit or just 40bit?
moveq r0,#2
mov pc,lr
此代码通过尝试执行XScale指令来确定是否存在XScale,并在抛出“未定义指令”异常时捕获异常。
问题是系统无法以某种方式将此异常正确传递给TCPMP,从而导致TCPMP冻结。它似乎不是因为Windows CE,而是因为该设备中的驱动程序错误。由于未正式支持在此设备上运行TCPMP,因此不会进行任何驱动程序更新。
我已将此问题发布到2channel,有些人声称这种确定XScale是否存在的方法并不好,但没有人试图找到更好的方法。所以我用谷歌搜索并阅读了ARMv5架构参考手册等等,但我什么都找不到。似乎几乎所有利用XScale指令集的程序都以相同的方式确定XScale是否存在。
问题是,是否可以确定是否存在XScale指令集,而不使用除用户模式之外的任何异常或任何CPU模式?
答案 0 :(得分:0)
(需要切换到内核模式)读取CP15寄存器c0,主ID寄存器又称ID代码寄存器又称ARM CPUID。顶部字节是XScale的实现者,它将是0x69('i',Intel)。
同时检查this thread。