在Linux中用軟體降低CPU的頻率

李先靜發表於2020-04-06

前段時間預研用的實驗板的配置為,CPU500MPXA270,記憶體64M。為了考查軟體在不同硬體配置是的效能問題,我們需要降低CPU的頻率和記憶體的大小。

 

調整記憶體的大小很容易,在linux的起始引數中加上mem=32M之類的引數就行了。例如下面的引數:root=/dev/mtdblock2 rootfstype=jffs2 console=ttyS0,115200 mem=32M

 

看了一下PXA270DataSheet,在電源管理的一章裡有描述,可以通過修改CCCRCLKCFG兩個暫存器的值達到調整CPU的頻率的目的。

 

但是在哪裡去修改呢?在bootloader還是在linux kernel裡?這方面的資料還比較少,猜想kernel的電源管理中是否已經有了這方面的支援呢?閱讀了一些程式碼,發現有兩個地方可以修改CPU的頻率。

 

一個是arch/arm/mach-pxa/ipmc.c裡為使用者提供了一個介面,用ioctl控制/dev/ipmc檔案,用命令IPMC_IOCTL_GET_DPM_CONFIG可以獲取CPU的頻率,用命令IPMC_IOCTL_SET_DPM_CONFIG 可以設定CPU的頻率。試了一下,獲取沒有問題,但設定之後kernel就死菜了。

 

另外一個是drivers/cpufreq/cpufreq.c裡也為使用者提供了一個介面,通過讀寫/proc/cpufreq才可以獲取和設定CPU的頻率。試了一下,獲取沒有問題,但設定之後沒有任何效果。

 

只好從bootloader著手,bootloader採用的是blob。花了一些時間研究,最終發現可以修改檔案blob-xscale/src/blob/xlli/xlli_LowLev_Init.s中的函式xlli_setClocks,來設定CPU的頻率,具體設定可以按datasheet中的說明。

 

終於成功了,不過還是有些疑惑。難道不能在執行時,動態修改CPU的頻率嗎?在空閒時降低CPU的頻率可以省不少電呢,這對於移動裝置很重要啊,為什麼都工作不正常呢?

 

相關文章