




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
CPU調(diào)頻調(diào)壓的設(shè)計與實現(xiàn)作者簡介:大Q在某半導(dǎo)體公司任職,主要從事硬件、芯片、驅(qū)動、軟件,整體方案及架構(gòu)的功耗設(shè)計。喜歡研究linux,liteos等系統(tǒng)的功耗設(shè)計思路,以及業(yè)界如何結(jié)合實際場景進行軟硬件方案設(shè)計。DVFS全稱DynamicVoltageandFrequencyScaling,本章主要講解CPU的DVFS。Linux的CPU調(diào)頻調(diào)壓由cpufreq完成,cpufreq需要拆成兩個詞看cpu-freq,通過字面意思可知,cpufreq和CPU及頻率有關(guān)。隨著半導(dǎo)體工藝的演進,芯片性能越來越強,軟件迭代對CPU性能的需求也越來越大,CPU頻率也越來越高。如果一直讓CPU運行在最高頻率下,功耗、發(fā)熱等問題也會隨之而來,本章我們講解CPU調(diào)頻調(diào)壓的設(shè)計與實現(xiàn)。13.1Linuxcpufreq的設(shè)計與實現(xiàn)本節(jié),我們主要聚焦對Linux內(nèi)核cpufreq的實現(xiàn)機制進行分析,包括配置、主要結(jié)構(gòu)體、主要函數(shù)、工作時序等。13.1.1架構(gòu)設(shè)計概覽DVFS在低功耗軟件棧中的位置如圖13-1所示,屬于非睡眠形式的動態(tài)功耗控制方式。圖13-1DVFS在低功耗軟件棧中的位置13.1.2模塊功能詳解Linux的cpufreq框架用一句話概括就是基于軟硬件約束通過一定的策略完成CPU頻率的調(diào)整。這里軟硬件配置如頻率范圍、CPU個數(shù)等由cpufreq驅(qū)動初始化時通過相應(yīng)流程配置,主要由policy模塊承載,同時,policy模塊也管理governor和driver的聯(lián)系等事項。策略主要指governor模塊即基于什么調(diào)頻,kernel默認(rèn)的governor有performance、powersave、conservative、ondemand、userspace以及目前默認(rèn)應(yīng)用的schedutil,最后完成CPU頻率配置的模塊就是driver了,頻率配置可以調(diào)用CLK模塊接口完成,也可自行根據(jù)芯片配置流程完成,如果clk實現(xiàn)較好,建議通過CLK模塊完成。調(diào)頻調(diào)壓均支持的CPU(其他模塊有同樣約束)一般有如下配置約束:升頻時,如果需要升壓,需要先完成電壓配置(記起regulator模塊沒)并等待電壓穩(wěn)定后再進行頻率配置,降壓時,需要先降低頻率,然后再配置降壓。這是由硬件決定的,先頻率高于額定電壓時,相當(dāng)于CPU在超頻運行,不一定會出問題,出問題也是千奇八怪,難以定位,還是按照芯片約束來吧。另外,cpufreq框架還支持notify機制,在頻率發(fā)生變化前后調(diào)用通知,對于需要感知CPU頻率變化的模塊,收到通知事件時,可以進行對應(yīng)配置。13.1.3配置信息解析Linuxcpufreq依賴如下特性宏:CONFIG_CPU_FREQ=yCONFIG_CPU_FREQ_GOV_ATTR_SET=yCONFIG_CPU_FREQ_GOV_COMMON=yCONFIG_CPU_FREQ_STAT=yCONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=yCONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE=yCONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=yCONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=yCONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE=yCONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=yCONFIG_CPUFREQ_DT=yCONFIG_CPUFREQ_DT_PLATDEV=ycpufreq的實現(xiàn)主要在如下文件中:drivers/cpufreq/cpufreq.c、cpufreq-dt.c、cpufreq-dt-platdev.c、cpufreq_governor.c、cpufreq_ondemand.c、cpufreq_stats.c、freq_table.c、cpufreq_governor_attr_set.c等13.1.4主要數(shù)據(jù)類型Linuxcpufreq和內(nèi)核絕大多數(shù)框架一樣,提供了通用機制,便于驅(qū)動開發(fā)人員專注驅(qū)動開發(fā),但我們主要了解其核心思路,便于在非Linux系統(tǒng)中實現(xiàn)并應(yīng)用自己的CPU調(diào)頻模塊。1)cpufreq框架的core主要完成sysfs接口封裝、driver/governor/policy邏輯串聯(lián)及driver驅(qū)動接口封裝。2)governor模塊主要封裝governor統(tǒng)一接口,提供governor注冊。3)policy模塊,具體也不能說是個模塊,但cpufreqdriver與governor的關(guān)聯(lián)、管理都離不開policy模塊,閱讀源碼時會感覺policy有點混亂哪里都有它的身影,又有點語焉不詳,其實不妨礙實現(xiàn)自己的cpufreq。4)driver主要功能就是完成最終的頻率調(diào)整(電壓調(diào)整,如果支持的話)。其他模塊這就不細(xì)述了,下面我們結(jié)合源碼了解各模塊功能及cpufreq是如何工作的。1cpufreq_policy結(jié)構(gòu)體structcpufreq_policy是cpufreqcore提供的非常重要的結(jié)構(gòu)體,下面講解主要成員含義:cpus及related_cpus表示當(dāng)前policy管理的cpu,cpus是當(dāng)前處于online狀態(tài)的,related_cpus表示所有的的包含online/offline的。CPU表示當(dāng)前管理policy的cpuid,若多個CPU共用一個policy,只需要一個CPU進行管理即可,在該CPU下線時,還需要更新管理CPU。clk表示當(dāng)前policy使用的clk句柄。cpuinfo表示CPU設(shè)計的最大最小頻率。min/max/cur表示當(dāng)前policy支持的最大最小及當(dāng)前頻率。Governor/governor_data表示當(dāng)前policy使用的governor及其私有數(shù)據(jù)。freq_table當(dāng)前CPU支持的頻率表。driver_data表示driver的私有數(shù)據(jù)。結(jié)構(gòu)體定義如下:structcpufreq_policy{cpumask_var_tcpus;/*只有Online的CPUs才使用*/cpumask_var_trelated_cpus;/*Online+OfflineCPUs*/unsignedintcpu;/*使用這個策略的cpu,必須是online的*/structclk*clk;structcpufreq_cpuinfocpuinfo;/*seeabove*/unsignedintmin;/*inkHz*/unsignedintmax;/*inkHz*/unsignedintcur;/*inkHz,只有在cpufreqgovernors被使用時踩需要*/unsignedintpolicy;/*seeabove*/structcpufreq_governor*governor;/*seebelow*/void*governor_data;structcpufreq_frequency_table*freq_table;void*driver_data;};通過對policy結(jié)構(gòu)體主要成員的介紹,我們知道policy主要用于配置CPU的調(diào)頻約束以及governor的管理。2governor相關(guān)數(shù)據(jù)結(jié)構(gòu)governor鏈表,用于存放所有注冊的governor節(jié)點。staticLIST_HEAD(cpufreq_governor_list);接下來介紹下governor的主要結(jié)構(gòu)體structcpufreq_governor,主要給出governor唯一名字及API回調(diào)。#defineCPUFREQ_DBS_GOVERNOR_INITIALIZER(_name_){.name=_name_,.flags=CPUFREQ_GOV_DYNAMIC_SWITCHING,.owner=THIS_MODULE,.init=cpufreq_dbs_governor_init,.exit=cpufreq_dbs_governor_exit,.start=cpufreq_dbs_governor_start,.stop=cpufreq_dbs_governor_stop,.limits=cpufreq_dbs_governor_limits,}structcpufreq_governor{charname[CPUFREQ_NAME_LEN];int(*init)(structcpufreq_policy*policy);void(*exit)(structcpufreq_policy*policy);int(*start)(structcpufreq_policy*policy);void(*stop)(structcpufreq_policy*policy);void(*limits)(structcpufreq_policy*policy);ssize_t(*show_setspeed)(structcpufreq_policy*policy,char*buf);int(*store_setspeed)(structcpufreq_policy*policy,unsignedintfreq);structlist_headgovernor_list;structmodule*owner;u8flags;};/*Governorflags*//*Forgovernorswhichchangefrequencydynamicallybythemselves*/#defineCPUFREQ_GOV_DYNAMIC_SWITCHINGBIT(0)/*Forgovernorswantingthetargetfrequencytobesetexactly*/#defineCPUFREQ_GOV_STRICT_TARGETBIT(1)governor模塊提供了一個統(tǒng)一初始化宏用于對其變量進行初始化,如宏CPUFREQ_DBS_GOVERNOR_INITIALIZE的定義實現(xiàn),實際使用的結(jié)構(gòu)體為structcpufreq_governor,governor模塊是為了屏蔽各種governor和cpufreq關(guān)聯(lián)而實現(xiàn)的。結(jié)構(gòu)體相關(guān)成員變量含義如下所示:name:當(dāng)前初始化governor的名字,如“ondemand”、“conservative”等。init/exit等:governor初始化、注銷或切換時cpufreqcore調(diào)用的流程。governor_list:各種governor注冊時掛接鏈表,現(xiàn)在已不怎么使用了。flags:當(dāng)前governor策略,見上述注釋。governor模塊還有一個核心結(jié)構(gòu)體structdbs_governor,其定義如下:structdbs_governor{structcpufreq_governorgov;structkobj_typekobj_type;structdbs_data*gdbs_data;unsignedint(*gov_dbs_update)(structcpufreq_policy*policy);structpolicy_dbs_info*(*alloc)(void);void(*free)(structpolicy_dbs_info*policy_dbs);int(*init)(structdbs_data*dbs_data);void(*exit)(structdbs_data*dbs_data);void(*start)(structcpufreq_policy*policy);};gov:上文中CPUFREQ_DBS_GOVERNOR_INITIALIZER部分。gdbs_data:當(dāng)前governor調(diào)頻約束,如負(fù)載閾值,采樣周期配置等。gov_dbs_update:governor更新負(fù)載及觸發(fā)頻率配置的回調(diào),governor的精髓在這里,后續(xù)講解。3driver相關(guān)數(shù)據(jù)結(jié)構(gòu)cpufreq_driver類型的變量定義:staticstructcpufreq_driver*cpufreq_driver;core提供的driver結(jié)構(gòu)體,用于core對默認(rèn)driver的關(guān)聯(lián)及管理。structcpufreq_driver{charname[CPUFREQ_NAME_LEN];u16flags;void*driver_data;/*所有的驅(qū)動都會使用*/int(*init)(structcpufreq_policy*policy);int(*verify)(structcpufreq_policy_data*policy);int(*setpolicy)(structcpufreq_policy*policy);int(*target)(structcpufreq_policy*policy,unsignedinttarget_freq,unsignedintrelation);/*Deprecated*/int(*target_index)(structcpufreq_policy*policy,unsignedintindex);unsignedint(*fast_switch)(structcpufreq_policy*policy,unsignedinttarget_freq);/*緩存并返回驅(qū)動程序支持的最低頻率大于或等于目標(biāo)頻率。并不設(shè)置頻率,只有target()才會設(shè)置頻率。*/unsignedint(*resolve_freq)(structcpufreq_policy*policy,unsignedinttarget_freq);/*僅適用于未設(shè)置target_index()和CPUFREQ_ASYNC_NOTIFICATION的驅(qū)動程序。Get_intermediate應(yīng)該返回一個穩(wěn)定的中間頻率在跳轉(zhuǎn)到對應(yīng)'index'的頻率之前,target_intermediate()應(yīng)該將CPU設(shè)置為該頻率。core將負(fù)責(zé)發(fā)送通知,而驅(qū)動程序不必在target_intermediate()或者target_index()中處理它們。驅(qū)動程序可以從get_intermediate()返回'0',以防他們不希望切換到某個目標(biāo)頻率的中間頻率。在這種情況下,core將直接調(diào)用->target_index()。*/unsignedint(*get_intermediate)(structcpufreq_policy*policy,unsignedintindex);int(*target_intermediate)(structcpufreq_policy*policy,unsignedintindex);unsignedint(*get)(unsignedintcpu);/*更新策略限值(policylimits).*/void(*update_limits)(unsignedintcpu)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 臨時供應(yīng)合同范本
- 企業(yè)修路合同范本
- 2025年衡水駕駛員貨運從業(yè)資格證模擬考試題
- 中介交易服務(wù)合同范本
- 會展項目服務(wù)合同范例
- 2025年昆明道路貨運從業(yè)資格證模擬考試官方題下載
- 修車配件合同范本
- 出租合同范本版
- 農(nóng)村水源地租賃合同范本
- 與演員合作合同范本
- 倉庫保管工國家職業(yè)標(biāo)準(zhǔn)
- 酒水知識與酒吧管理課件
- 設(shè)立弱電工程公司組建方案
- 織布工廠管理制度
- 初中八年級下學(xué)期班主任工作計劃樣文
- (完整word版)英語四級單詞大全
- 備考期末-六選五-專項練習(xí)-2022-2023學(xué)年人教版英語八年級上冊
- 產(chǎn)品設(shè)計思維 課件 第1章 產(chǎn)品設(shè)計思維概述
- 雙重血漿置換
- 兒童和青少年高尿酸血癥的預(yù)防和管理
- 華為基建項目管理手冊
評論
0/150
提交評論