功率分配器調速器可調引數

跳變點

調速器在以下兩個被動跳變點下工作最佳

  1. “開啟”跳變點:溫度高於此值時,調速器控制迴路開始工作。 這是熱區的第一個被動跳變點。

  2. “期望溫度”跳變點:應高於“開啟”跳變點。 這是調速器控制的目標溫度。 這是熱區的最後一個被動跳變點。

PID 控制器

功率分配器調速器實現了一個比例-積分-微分控制器(PID 控制器),以溫度作為控制輸入,功率作為受控輸出

P_max = k_p * e + k_i * err_integral + k_d * diff_err + sustainable_power

其中
  • e = 期望溫度 - 當前溫度

  • err_integral 是先前誤差的總和

  • diff_err = e - 先前誤差

它類似於下圖所示

                                    k_d
                                     |
current_temp                         |
     |                               v
     |              +----------+   +---+
     |       +----->| diff_err |-->| X |------+
     |       |      +----------+   +---+      |
     |       |                                |      tdp        actor
     |       |                      k_i       |       |  get_requested_power()
     |       |                       |        |       |        |     |
     |       |                       |        |       |        |     | ...
     v       |                       v        v       v        v     v
   +---+     |      +-------+      +---+    +---+   +---+   +----------+
   | S |-----+----->| sum e |----->| X |--->| S |-->| S |-->|power     |
   +---+     |      +-------+      +---+    +---+   +---+   |allocation|
     ^       |                                ^             +----------+
     |       |                                |                |     |
     |       |        +---+                   |                |     |
     |       +------->| X |-------------------+                v     v
     |                +---+                               granted performance
desired_temperature     ^
                        |
                        |
                    k_po/k_pu

可持續功率

註冊熱區時,應提供可持續耗散功率的估計值(以 mW 為單位)。 這估計了在期望控制溫度下可以耗散的持續功率。 這是期望最高溫度下分配的最大持續功率。 實際持續功率可能因多種原因而異。 閉環控制器將處理諸如環境條件之類的變化,以及與矽的速度等級相關的一些因素。 因此,sustainable_power 僅是一個估計值,可以對其進行調整以影響熱斜坡的激程序度。 作為參考,4 英寸手機的可持續功率通常為 2000mW,而 10 英寸平板電腦的可持續功率約為 4500mW(可能因螢幕尺寸而異)。 可以使用抽象比例表示功率值。 持續功率應與相關散熱裝置使用的比例對齊。

如果您使用的是裝置樹,請將其新增為 thermal-zone 的屬性。 例如

thermal-zones {
        soc_thermal {
                polling-delay = <1000>;
                polling-delay-passive = <100>;
                sustainable-power = <2500>;
                ...

相反,如果熱區是從平臺程式碼註冊的,請傳遞一個具有 sustainable_powerthermal_zone_params。 如果未傳遞 thermal_zone_params,則類似下面的內容就足夠了

static const struct thermal_zone_params tz_params = {
        .sustainable_power = 3500,
};

然後將 tz_params 作為第五個引數傳遞給 thermal_zone_device_register()

k_po 和 k_pu

功率分配器散熱調速器中 PID 控制器的實現允許配置兩個比例項常數:k_pok_puk_po 是溫度過沖期間(當前溫度高於“期望溫度”跳變點)的比例項常數。 相反,k_pu 是溫度欠衝期間(當前溫度低於“期望溫度”跳變點)的比例項常數。

這些控制旨在作為配置系統允許的熱“斜坡”的主要機制。 例如,較低的 k_pu 值將提供較慢的斜坡,但代價是在低溫下限制可用容量。 另一方面,較高的 k_pu 值將導致調速器在溫度較低時授予非常高的功率,並可能導致溫度過沖。

k_pu 的預設值為

2 * sustainable_power / (desired_temperature - switch_on_temp)

這意味著在 switch_on_temp 時,控制器比例項的輸出將為 2 * sustainable_powerk_po 的預設值為

sustainable_power / (desired_temperature - switch_on_temp)

專注於 PID 控制器方程的比例和前饋值,我們得到

P_max = k_p * e + sustainable_power

比例項與期望溫度和當前溫度之間的差成正比。 噹噹前溫度為期望溫度時,比例分量為零,P_max = sustainable_power。 也就是說,系統應在恆定負載下以熱平衡狀態執行。 sustainable_power 只是一個估計值,這就是為什麼需要像這樣的閉環控制。

展開 k_pu 我們得到

P_max = 2 * sustainable_power * (T_set - T) / (T_set - T_on) +
    sustainable_power

其中

  • T_set 是期望溫度

  • T 是當前溫度

  • T_on 是開啟溫度

噹噹前溫度為開啟溫度時,上述公式變為

P_max = 2 * sustainable_power * (T_set - T_on) / (T_set - T_on) +
    sustainable_power = 2 * sustainable_power + sustainable_power =
    3 * sustainable_power

因此,隨著溫度從開啟溫度升高到期望溫度,僅比例項會將功率從 3 * sustainable_power 線性降低到 sustainable_power

k_i 和 integral_cutoff

k_i 配置 PID 環路的積分項常數。 此項允許 PID 控制器補償長期漂移和輸出控制的量化性質:散熱裝置無法設定調速器請求的精確功率。 當溫度誤差低於 integral_cutoff 時,誤差會累積在積分項中。 然後將此項乘以 k_i,並將結果新增到控制器的輸出中。 通常 k_i 設定為低值(1 或 2),integral_cutoff 設定為 0。

k_d

k_d 配置 PID 環路的微分項常數。 建議將其保留為預設值:0。

散熱裝置功率 API

由此調速器控制的散熱裝置必須在其 cooling_device_ops 中提供額外的“功率”API。 它由三個操作組成

  1. int get_requested_power(struct thermal_cooling_device *cdev,
                            struct thermal_zone_device *tz, u32 *power);
    
@cdev

struct thermal_cooling_device 指標

@tz

我們當前執行的熱區

@power

用於儲存計算功率的指標

get_requested_power() 以毫瓦為單位計算裝置請求的功率,並將其儲存在 @power 中。 成功時應返回 0,失敗時返回 -E*。 功率分配器調速器當前使用此值來計算要分配給每個散熱裝置的功率。

  1. int state2power(struct thermal_cooling_device *cdev, struct
                    thermal_zone_device *tz, unsigned long state,
                    u32 *power);
    
@cdev

struct thermal_cooling_device 指標

@tz

我們當前執行的熱區

@state

散熱裝置狀態

@power

用於儲存等效功率的指標

將散熱裝置狀態 @state 轉換為以毫瓦為單位的功耗,並將其儲存在 @power 中。 成功時應返回 0,失敗時返回 -E*。 散熱核心當前使用此值來計算執行器可以消耗的最大功率。

  1. int power2state(struct thermal_cooling_device *cdev, u32 power,
                    unsigned long *state);
    
@cdev

struct thermal_cooling_device 指標

@power

以毫瓦為單位的功率

@state

用於儲存結果狀態的指標

計算一個散熱裝置狀態,該狀態將使裝置最多消耗 @power mW,並將其儲存在 @state 中。 成功時應返回 0,失敗時返回 -E*。 散熱核心當前使用此值將功率分配器調速器設定的給定功率轉換為散熱裝置可以設定的狀態。 這是一個函式,因為此轉換可能取決於可能更改的外部因素,因此此函式應在“當前情況”下提供最佳轉換。

散熱裝置權重

權重是一種在散熱裝置之間偏置分配的機制。 它們表示不同散熱裝置的相對功率效率。 可以使用較高的權重來表示較高的功率效率。 加權是相對的,因此如果每個散熱裝置的權重為 1,則認為它們是相等的。 這在異構系統中特別有用,在異構系統中,兩個散熱裝置可以執行相同的計算,但效率不同。 例如,具有兩種不同型別的處理器的系統。

如果使用 thermal_zone_device_register()(即平臺程式碼)註冊熱區,則權重將作為熱區的 thermal_bind_parameters 的一部分傳遞。 如果使用裝置樹註冊平臺,則權重將作為 cooling-maps 節點中每個對映的 contribution 屬性傳遞。

功率分配器調速器的限制

如果存在週期性節拍,則功率分配器調速器的 PID 控制器效果最佳。 如果您有一個重複呼叫 thermal_zone_device_update() 的驅動程式(或最終呼叫調速器的 throttle() 函式的任何內容),則調速器響應不會很好。 請注意,這並非此調速器所特有,如果您呼叫其 throttle() 的速度快於正常散熱框架節拍(例如,由於中斷),則逐步控制也會表現不佳,因為它會過度反應。

能量模型要求

另一個重要的事情是散熱裝置提供的功率值的一致比例。 單個熱區中的所有散熱裝置的功率值都應以毫瓦報告,或縮放到相同的“抽象比例”。