5277|5

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何读取CPU ID? [复制链接]

如何读取CPU ID?也就是我希望在应用中判断到当前的CPU是什么类型的,比如是三星的2440、2450或6410等

最新回复

cpu的类型是在PB定制的时候有一个环境变量的,这个变量代表你的芯片类型。你应该test这个环境变量。  详情 回复 发表于 2009-5-31 11:44
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
如果要做,改怎么读取呀???
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这些CPU都没有ID的,也就是说不是CPU都有ID的,例如MX系列的CPU是有ID的

想要读ID,请先详细看看CPU的spec
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
看cpu的spec,确认有ID,并知道该寄存器的地址。
如果普通模式直接可访问的,就直接用“应用访问物理地址”的方式去读取(地址空间映射)。
如果要用协处理器的,就得写段汇编,再从应用程序里调用了。这种少见。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
x86下的方法:

  1. class CCPUInfo   
  2. {
  3.     public:
  4.         int GetTypeName(char *type);
  5.         int GetName(char *name);
  6.         int GetFamily();
  7.         bool withMMX();
  8.         bool hasFPU();
  9.         int GetSpeed();
  10.         CCPUInfo();
  11.         virtual ~CCPUInfo();

  12.     private:
  13.         bool FPU;
  14.         char * Name;
  15.         bool MMX;
  16.         int iFamily;
  17. };
  18. //-----------------------------------------------------------------
  19. //////////////////////////////////////////////////////////////////////
  20. // Construction/Destruction
  21. //////////////////////////////////////////////////////////////////////

  22. CCPUInfo::CCPUInfo()
  23. {
  24.     char OEMString[13];
  25.     int iEAXValue,iEBXValue,iECXValue,iEDXValue;

  26.         //获取CPU的品牌:
  27.     _asm
  28.         {
  29.         mov eax,0
  30.         cpuid
  31.         mov DWORD PTR OEMString,ebx
  32.         mov DWORD PTR OEMString+4,edx
  33.         mov DWORD PTR OEMString+8,ecx
  34.         mov BYTE PTR OEMString+12,0
  35.         }
  36.         Name=new char[15];
  37.         strcpy(Name,OEMString);

  38.         //更多CPU信息:
  39.     _asm
  40.         {
  41.         mov eax,1
  42.         cpuid
  43.         mov iEAXValue,eax
  44.         mov iEBXValue,ebx
  45.         mov iECXValue,ecx
  46.         mov iEDXValue,edx
  47.         }
  48.         MMX=bool(iEDXValue & 0x800000);
  49.         iFamily=(0xf00 & iEAXValue)>>8;
  50.         FPU=bool(iEDXValue & 0x1);

  51. }

  52. CCPUInfo::~CCPUInfo()
  53. {
  54.     delete []Name;
  55. }

  56. int CCPUInfo::GetSpeed()
  57. {
  58.     int PriorityClass, Priority;
  59.     HANDLE hThread,hProcess;

  60.     hThread=GetCurrentThread();
  61.     hProcess=GetCurrentProcess();

  62.     PriorityClass = GetPriorityClass(hProcess);
  63.     Priority = GetThreadPriority(hThread);

  64.     SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS);
  65.     SetThreadPriority(hThread,THREAD_PRIORITY_TIME_CRITICAL);

  66.     long lEAXValue,lEDXValue;

  67.     SleepEx(50,false);

  68.         _asm
  69.         {
  70.              xor eax,eax
  71.              rdtsc
  72.          mov lEAXValue,eax
  73.          mov lEDXValue,edx
  74.     }

  75.     if(SleepEx(500,false)==0)
  76.         {
  77.             _asm
  78.                 {
  79.                 xor eax,eax
  80.                     rdtsc
  81.             sub eax,lEAXValue
  82.             sbb edx,lEDXValue
  83.             mov lEAXValue, eax
  84.             mov lEDXValue, edx
  85.                 }
  86.     }

  87.     SetThreadPriority(hThread, Priority);
  88.     SetPriorityClass(hProcess, PriorityClass);
  89.         return lEAXValue/(1000.0*500);
  90. }

  91. bool CCPUInfo::withMMX()
  92. {
  93.     return MMX;
  94. }

  95. int CCPUInfo::GetFamily()
  96. {
  97.     return iFamily;
  98. }

  99. int CCPUInfo::GetName(char *name)
  100. {
  101.     if(name==NULL) return -1;
  102.         strcpy(name,Name);
  103.         return 0;
  104. }

  105. int CCPUInfo::GetTypeName(char *type)
  106. {
  107. //EAX的8到11位表明是几86:
  108. //                  3 - 386
  109. //                  4 - i486
  110. //                  5 - Pentium
  111. //                  6 - Pentium Pro Pentium II
  112. //                  2 - Dual Processors
  113.     if(type==NULL) return -1;
  114.         switch(iFamily)
  115.         {
  116.         case 2: strcpy(type,"Dual Processors");break;
  117.         case 3: strcpy(type,"386");break;
  118.     case 4: strcpy(type,"486");break;
  119.         case 5: strcpy(type,"Pentium");break;
  120.         case 6: strcpy(type,"P2,celeron,Pentium Pro");break;
  121.         default: strcpy(type,"Unknown Type");
  122.     }
  123.         return 0;
  124. }

  125. bool CCPUInfo::hasFPU()
  126. {
  127.     return FPU;
  128. }

复制代码
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

6
 
cpu的类型是在PB定制的时候有一个环境变量的,这个变量代表你的芯片类型。你应该test这个环境变量。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表