<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/ DTD/wml_1.1.xml">

<wml>
<head>
<meta http-equiv="cache-control" content="max-age=180,private" />
</head>
<card title="CM3588的自动CPU调频">
<p>
作者:<a href="index.php?action=showuser&amp;userid=1&amp;hash=">熊茂祥</a><br />时间:2024-12-03 12:16<br />分类:<a href="index.php?action=list&amp;cid=11&amp;hash=">国产ARM</a><br />标签:<a href="index.php?action=tags&amp;item=arm&amp;hash=">arm</a>, <a href="index.php?action=tags&amp;item=3588&amp;hash=">3588</a>, <a href="index.php?action=tags&amp;item=nas&amp;hash=">nas</a>, <a href="index.php?action=tags&amp;item=cpu&amp;hash=">cpu</a>, <a href="index.php?action=tags&amp;item=%E8%B0%83%E9%A2%91&amp;hash=">调频</a><br />内容:
近期购买了CM3588，因为使用的全被动散热，在持续30分钟的CPU满载后会出现温度超过70度的情况。为了保障CPU能应对极端负载环境，特此做了一个自动调整CPU主频的脚本。确保CPU温度持续维持在合理的温度范围内，并且尽可能释放最大性能。


脚本默认在70度会开始降频，60度会开始恢复，每10秒循环一次。


 











 


 


BASH脚本


    #!/bin/bash  

      

    # 温度阈值  

    TEMP_THRESHOLD_HIGH=70  # 超过此温度时降低频率  

    TEMP_THRESHOLD_LOW=60   # 低于此温度时提高频率  

      

    # 0-3核和4-7核的CPU最大频率路径  

    CPU0_3_MAX_FREQ_PATH=&quot;/sys/devices/system/cpu/cpu[0-3]/cpufreq/scaling_max_freq&quot;  

    CPU4_7_MAX_FREQ_PATH=&quot;/sys/devices/system/cpu/cpu[4-7]/cpufreq/scaling_max_freq&quot;  

      

    # 0-3核和4-7核的频率列表  

    AVAILABLE_FREQS_0_3=(408000 600000 816000 1008000 1200000 1416000 1608000 1800000)  

    AVAILABLE_FREQS_4_7=(408000 600000 816000 1008000 1200000 1416000 1608000 1800000 2016000 2208000 2256000)  

      

    # CPU温度文件路径  

    TEMP_PATH=&quot;/sys/class/thermal/thermal_zone0/temp&quot;  

      

    # 获取当前最大频率的索引  

    get_current_freq_index() {  

        local freq_path=$1  

        local freqs=(&quot;${!2}&quot;)  

        current_freq=$(cat $freq_path)  

        for i in &quot;${!freqs[@]}&quot;; do  

            if [ &quot;${freqs[$i]}&quot; -eq &quot;$current_freq&quot; ]; then  

                echo $i  

                return  

            fi  

        done  

        echo -1  

    }  

      

    # 设置CPU的最大频率  

    set_max_freq() {  

        local paths=$1  

        local freq=$2  

        for path in $paths; do  

            echo &quot;$freq&quot; &gt; &quot;$path&quot;  

        done  

    }  

      

    # 主逻辑循环  

    while true; do  

        # 读取当前温度  

        temp=$(cat &quot;$TEMP_PATH&quot;)  

        temp=$((temp / 1000)) # 转换为摄氏度  

      

        # 调整0-3核的频率  

        current_index_0_3=$(get_current_freq_index &quot;/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq&quot; AVAILABLE_FREQS_0_3[@])  

        if [ &quot;$temp&quot; -ge &quot;$TEMP_THRESHOLD_HIGH&quot; ] &amp;&amp; [ &quot;$current_index_0_3&quot; -gt 0 ]; then  

            new_index=$((current_index_0_3 - 1))  

            set_max_freq &quot;$CPU0_3_MAX_FREQ_PATH&quot; &quot;${AVAILABLE_FREQS_0_3[$new_index]}&quot;  

            echo &quot;温度: $temp&deg;C，高于${TEMP_THRESHOLD_HIGH}&deg;C，0-3核降至频率: ${AVAILABLE_FREQS_0_3[$new_index]}&quot;  

        elif [ &quot;$temp&quot; -le &quot;$TEMP_THRESHOLD_LOW&quot; ] &amp;&amp; [ &quot;$current_index_0_3&quot; -lt $((${#AVAILABLE_FREQS_0_3[@]} - 1)) ]; then  

            new_index=$((current_index_0_3 + 1))  

            set_max_freq &quot;$CPU0_3_MAX_FREQ_PATH&quot; &quot;${AVAILABLE_FREQS_0_3[$new_index]}&quot;  

            echo &quot;温度: $temp&deg;C，低于${TEMP_THRESHOLD_LOW}&deg;C，0-3核升至频率: ${AVAILABLE_FREQS_0_3[$new_index]}&quot;  

        else  

            echo &quot;温度: $temp&deg;C，0-3核频率保持不变: ${AVAILABLE_FREQS_0_3[$current_index_0_3]}&quot;  

        fi  

      

        # 调整4-7核的频率  

        current_index_4_7=$(get_current_freq_index &quot;/sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq&quot; AVAILABLE_FREQS_4_7[@])  

        if [ &quot;$temp&quot; -ge &quot;$TEMP_THRESHOLD_HIGH&quot; ] &amp;&amp; [ &quot;$current_index_4_7&quot; -gt 0 ]; then  

            new_index=$((current_index_4_7 - 1))  

            set_max_freq &quot;$CPU4_7_MAX_FREQ_PATH&quot; &quot;${AVAILABLE_FREQS_4_7[$new_index]}&quot;  

            echo &quot;温度: $temp&deg;C，高于${TEMP_THRESHOLD_HIGH}&deg;C，4-7核降至频率: ${AVAILABLE_FREQS_4_7[$new_index]}&quot;  

        elif [ &quot;$temp&quot; -le &quot;$TEMP_THRESHOLD_LOW&quot; ] &amp;&amp; [ &quot;$current_index_4_7&quot; -lt $((${#AVAILABLE_FREQS_4_7[@]} - 1)) ]; then  

            new_index=$((current_index_4_7 + 1))  

            set_max_freq &quot;$CPU4_7_MAX_FREQ_PATH&quot; &quot;${AVAILABLE_FREQS_4_7[$new_index]}&quot;  

            echo &quot;温度: $temp&deg;C，低于${TEMP_THRESHOLD_LOW}&deg;C，4-7核升至频率: ${AVAILABLE_FREQS_4_7[$new_index]}&quot;  

        else  

            echo &quot;温度: $temp&deg;C，4-7核频率保持不变: ${AVAILABLE_FREQS_4_7[$current_index_4_7]}&quot;  

        fi  

      

        sleep 10  

    done  





 
</p><p>
<a href="index.php?action=login&amp;hash=">立即登陆发表评论</a><br />
</p>
<p><a href="index.php?action=list&amp;hash=">返回日志列表</a><br /><a href="index.php?action=index&amp;hash=">返回主页</a></p>
</card>
</wml>
