iOS获取设备CPU时钟频率

  • 背景

    用户反馈在使用APP过程中设备发烫变卡,我猜测是因为温度过高导致CPU降频了,但是iOS系统是没有提供获取其时钟频率的接口,所以我就查资料自己尝试了一下

  • 通过汇编语言计算得出iOS设备CPU的实时频率

  • 下面介绍如何获取
    AppDelegate.m 里面加入如下内容:
    1.把汇编文件cpuFrequ.s导入到项目中,将freqTest函数声明到AppDelegate.m里面;
    2.计算500次,然后取其中时间最少的一次,从而排除系统干扰,得到最高的频率值;
    3.每一次调用都是传循环参数10000,也就是执行add指令130*10000次,因此最后算频率的时候是1300000/time,也就是单位时间(s)内执行cycles的数量!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
extern int freqTest(int cycles);
static double GetCPUFrequency(void)
{
volatile NSTimeInterval times[500];
int sum = 0;
for(int i = 0; i < 500; i++)
{
times[i] = [[NSProcessInfo processInfo] systemUptime];
sum += freqTest(10000);
times[i] = [[NSProcessInfo processInfo] systemUptime] - times[i];
}

NSTimeInterval time = times[0];
for(int i = 1; i < 500; I++)
{
if(time > times[i])
time = times[i];
}
double freq = 1300000.0 / time;
return freq;
}

汇编部分的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
.text
.text
.align 4
.globl _freqTest

_freqTest:

freqTest_LOOP:

// loop 1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1

// loop 2
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1

// loop 3
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1

// loop 4
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1

// loop 5
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1

// loop 6
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1

// loop 7
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1

// loop 8
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1

// loop 9
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1

// loop 10
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1
add x1, x1, x1

subs x0, x0, #1
bne freqTest_LOOP

RET

到这就可以测试设备的实时CPU时钟频率了,我的测试方法是将App跑起来进入一个页面,获取一下此时的时钟频率,然后在该页面执行耗CPU的操作,观测CPU的占用率达到50%左右,此时设备会发烫,持续一段时间,然后销毁这个这页面(退出页面),之后定时获取CPU时钟频率,对比数据就可以判定是不是降频了.

谢谢您的支持!