SlideShare uma empresa Scribd logo
1 de 20
20分でわかった事にする
  Power Management
      cpuidle編
@magoroku15 最底辺活動家
Androidzaurusのつぶやき


                     使用未許諾
• われらの恐竜先生、販売日にTegra 3のタブ
  レットをご購入
• 買った、直後の勉強会にてustream送出マ
  シンとして華麗にデビュー
• 独自の視点での解析 -お約束ですね-
Android Zairusの日記




                    使用未許諾
GovernorはInteractive

What dose this mean?

     Governor?
Power management ちょー入門
• 家庭のパワーマネジメント
 – 照明はコマメに消す
 – 冷房は設定温度を高めに
 →住人が決める・操作する
• CPUのパワーマネジメント
 – 不要なものは止める
 – 処理速度と落とす
 →どうやって決めるのか?操作するの
  か?
UNIX/BSD/Mac/Linux


   App

System call



                     動かすプロセスが無いとidleを呼ぶ

                    KERNEL
                               idle

              HDD
BSD 4.3
GENERIC/locore.c
1498      .globl Idle
1499 Idle: idle:
1500      mtpr $0,$IPL     # must allow interrupts here
1501      tstl _whichqs    # look for non-empty queue
1502      bneq sw1
1503      brb idle
Tegraのidle
Kernel_V9_4_2_7/arch/arm/mach-tegra
static int tegra_cpuidle_register_device(unsigned int cpu)     // cpuidleへの登録
{
   :
   state->enter = tegra_idle_enter_lp2;
   :
}
static inline void tegra_idle_lp2(struct cpuidle_device *dev,
                        struct cpuidle_state *state)
{
#ifdef CONFIG_ARCH_TEGRA_2x_SOC                       // tegra2の場合
        tegra2_idle_lp2(dev, state);
#endif
#ifdef CONFIG_ARCH_TEGRA_3x_SOC                       // tegra3の場合
        tegra3_idle_lp2(dev, state);
#endif
}
Tegra3のidle
Kernel_V9_4_2_7/arch/arm/mach-tegra/sleep.S
void tegra3_idle_lp2(struct cpuidle_device *dev,
                           struct cpuidle_state *state)
{
        s64 request = ktime_to_us(tick_nohz_get_sleep_length());
        bool last_cpu = tegra_set_cpu_in_lp2(dev->cpu);

       cpu_pm_enter();

       if (last_cpu && (dev->cpu == 0))              // CPU0だけ別扱い
               tegra3_idle_enter_lp2_cpu_0(dev, state, request);
       else
               tegra3_idle_enter_lp2_cpu_n(dev, state, request);

       cpu_pm_exit();
       tegra_clear_cpu_in_lp2(dev->cpu);
}
Tegra3のidle
Kernel_V9_4_2_7/arch/arm/mach-tegra/sleep.S
ENTRY(tegra_cpu_wfi)
        cpu_id r0
        cpu_to_halt_reg r1, r0
        cpu_to_csr_reg r2, r0
        mov32 r0, TEGRA_FLOW_CTRL_VIRT
        mov     r3, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
        str     r3, [r0, r2]            @ clear event & interrupt status
        mov     r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT | FLOW_CTRL_JTAG_RESUME
        str     r3, [r0, r1]            @ put flow controller in wait irq mode
        dsb
        wfi
        mov     r3, #0
        str     r3, [r0, r1]            @ clear flow controller halt status
        mov     r3, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
        str     r3, [r0, r2]            @ clear event & interrupt status
        dsb
        mov     pc, lr
ENDPROC(tegra_cpu_wfi)
WFI Wait For Interrupt
• ARMの命令
• 割り込が発生するまで、CPUを低電力モード
  で命令の実行を止める
• 眠りの深さ/寝起きの良さ
 – 深く眠ると
  • 電力低減効果大/寝起きは悪い
  • もっさり
 – 浅く眠ると
  • 電力低減効果小/寝起きは良い
  • さくさく
• WFIを呼ぶ前に眠りの深さを指定する
おっと
• この時点でTegraのStateを理解していない
  事に気づく
• Flow controllerって何?
Omap3のidle
int __init omap3_idle_init(void)
{
     :
     state->enter = (state->flags & CPUIDLE_FLAG_CHECK_BM) ?
              omap3_enter_idle_bm : omap3_enter_idle;
     :
}

static int omap3_enter_idle(struct cpuidle_device *dev,
              struct cpuidle_state *state)
{
     :
}
omap3のC-ステート
#define OMAP3_STATE_C1 0      /* C1 - MPU WFI + Core active */

                           IDLE
昼寝
#define OMAP3_STATE_C2 1      /* C2 - MPU WFI + Core inactive */
#define OMAP3_STATE_C3 2      /* C3 - MPU CSWR + Core inactive */
#define OMAP3_STATE_C4 3      /* C4 - MPU OFF + Core iactive */
#define OMAP3_STATE_C5 4      /* C5 - MPU RET + Core RET */
#define OMAP3_STATE_C6 5      /* C6 - MPU OFF + Core RET */
#define OMAP3_STATE_C7 6      /* C7 - MPU OFF + Core OFF */

爆睡
ステートの指定はどうするの?
• CPUIdle Framework
  – CPU依存のCステート
  – Governor(統治者)によるポリシーベースの管理
  – /sys/power/cpuidle_deepest_state
  – /sys/proc/pm_prepwstst
• Governor
  – “ladder”,”menu”
  – drivers/cpuidle/governors
cpuidleの構成

    /sys/devices/syste/cpu/cpuidle                     ユーザレベル
                                                       インターフェース




 menu           ladder                                 Governor

                                                       Cpuidle アーキ無依存
                    Generic cpuidle


omap3-cpuidle       tegra2-cpuidle    tegra3-cpuidle   Cpuidle アーキ依存
cpuidle
• 実行可能なプロセスがない状態を管理
 – 昔は単純な停止orループ
 – ARMでは命令を追加して明にidleを通知 WFI
 – WFIを呼ぶ前に、寝る深さC-Stateを指定
• 標準でLadderとmenuのGovernor
 – ユーザプログラムで統計情報から指定も可
• 他の省電力機能もcpuidleを起点に動作
他のフレームワーク
• cpufreq
  – 動作周波数を変更
  – 電源電圧も合わせて変更
• runtime_pm
  – SoC内部コアを機能単位ごとに停止するヒントを
    管理
  – SoC内の機能毎にusecountを用意し、idleのタイミ
    ング未使用の機能を止める
  – Beagle のpm_branchで実機評価可能
• cpuhotplug
  – cpuidleのC-state変更をCPU単位に拡張
上級者向けの話題
• Runtime_PM
  – http://elinux.org/OMAP_Power_Management
  – http://git.kernel.org/?p=linux/kernel/git/khilman/l
    inux-omap-pm.git
• BeagleboardでSleep時の電流を8mWにした
  話
  – http://groups.google.com/group/beagleboard/bro
    wse_thread/thread/197a8ef6b46cc828
  – 回路を改造して、ボード上のコントローラの
    電源供給を止める
おわり

Mais conteúdo relacionado

Mais procurados

03 第3.6節-第3.8節 ROS2の基本機能(2/2)
03 第3.6節-第3.8節 ROS2の基本機能(2/2)03 第3.6節-第3.8節 ROS2の基本機能(2/2)
03 第3.6節-第3.8節 ROS2の基本機能(2/2)Mori Ken
 
SLAM開発における課題と対策の一例の紹介
SLAM開発における課題と対策の一例の紹介SLAM開発における課題と対策の一例の紹介
SLAM開発における課題と対策の一例の紹介miyanegi
 
ros_whillとROS2対応(ROS勉強会第28回LT大会)
ros_whillとROS2対応(ROS勉強会第28回LT大会)ros_whillとROS2対応(ROS勉強会第28回LT大会)
ros_whillとROS2対応(ROS勉強会第28回LT大会)Seiya Shimizu
 
ROS を用いた自律移動ロボットのシステム構築
ROS を用いた自律移動ロボットのシステム構築ROS を用いた自律移動ロボットのシステム構築
ROS を用いた自律移動ロボットのシステム構築Yoshitaka HARA
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
ROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章PythonクライアントライブラリrclpyROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章PythonクライアントライブラリrclpyAtsuki Yokota
 
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール智啓 出川
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門uchan_nos
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門Fixstars Corporation
 
Use After Free 脆弱性攻撃を試す
Use After Free 脆弱性攻撃を試すUse After Free 脆弱性攻撃を試す
Use After Free 脆弱性攻撃を試すmonochrojazz
 
NEDO講座 MoveIt! チュートリアル 第1部
NEDO講座 MoveIt! チュートリアル 第1部NEDO講座 MoveIt! チュートリアル 第1部
NEDO講座 MoveIt! チュートリアル 第1部openrtm
 
オープンソース SLAM の分類
オープンソース SLAM の分類オープンソース SLAM の分類
オープンソース SLAM の分類Yoshitaka HARA
 
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。ROBOTIS Japan
 
20190307 visualslam summary
20190307 visualslam summary20190307 visualslam summary
20190307 visualslam summaryTakuya Minagawa
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編Fixstars Corporation
 
Sift特徴量について
Sift特徴量についてSift特徴量について
Sift特徴量についてla_flance
 
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日Kitsukawa Yuki
 
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成MobileRoboticsResear
 
ORB-SLAMの手法解説
ORB-SLAMの手法解説ORB-SLAMの手法解説
ORB-SLAMの手法解説Masaya Kaneko
 

Mais procurados (20)

03 第3.6節-第3.8節 ROS2の基本機能(2/2)
03 第3.6節-第3.8節 ROS2の基本機能(2/2)03 第3.6節-第3.8節 ROS2の基本機能(2/2)
03 第3.6節-第3.8節 ROS2の基本機能(2/2)
 
SLAM開発における課題と対策の一例の紹介
SLAM開発における課題と対策の一例の紹介SLAM開発における課題と対策の一例の紹介
SLAM開発における課題と対策の一例の紹介
 
ros_whillとROS2対応(ROS勉強会第28回LT大会)
ros_whillとROS2対応(ROS勉強会第28回LT大会)ros_whillとROS2対応(ROS勉強会第28回LT大会)
ros_whillとROS2対応(ROS勉強会第28回LT大会)
 
ROS を用いた自律移動ロボットのシステム構築
ROS を用いた自律移動ロボットのシステム構築ROS を用いた自律移動ロボットのシステム構築
ROS を用いた自律移動ロボットのシステム構築
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
ROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章PythonクライアントライブラリrclpyROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
 
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
Use After Free 脆弱性攻撃を試す
Use After Free 脆弱性攻撃を試すUse After Free 脆弱性攻撃を試す
Use After Free 脆弱性攻撃を試す
 
NEDO講座 MoveIt! チュートリアル 第1部
NEDO講座 MoveIt! チュートリアル 第1部NEDO講座 MoveIt! チュートリアル 第1部
NEDO講座 MoveIt! チュートリアル 第1部
 
オープンソース SLAM の分類
オープンソース SLAM の分類オープンソース SLAM の分類
オープンソース SLAM の分類
 
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。
3次元SLAMは誰でもできるよ。そう、TX2とTurtleBot3ならね。
 
20190307 visualslam summary
20190307 visualslam summary20190307 visualslam summary
20190307 visualslam summary
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 
Sift特徴量について
Sift特徴量についてSift特徴量について
Sift特徴量について
 
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
 
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
 
ORB-SLAMの手法解説
ORB-SLAMの手法解説ORB-SLAMの手法解説
ORB-SLAMの手法解説
 

Destaque

仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題にmagoroku Yamamoto
 
Oscar compiler for power reduction
Oscar compiler for power reduction Oscar compiler for power reduction
Oscar compiler for power reduction magoroku Yamamoto
 
自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみたmagoroku Yamamoto
 
Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析Tanaka Yuichi
 
PythonでDeepLearningを始めるよ
PythonでDeepLearningを始めるよPythonでDeepLearningを始めるよ
PythonでDeepLearningを始めるよTanaka Yuichi
 
Chainer v1.6からv1.7の新機能
Chainer v1.6からv1.7の新機能Chainer v1.6からv1.7の新機能
Chainer v1.6からv1.7の新機能Ryosuke Okuta
 
Deep Learningを用いたロボット制御
Deep Learningを用いたロボット制御Deep Learningを用いたロボット制御
Deep Learningを用いたロボット制御Ryosuke Okuta
 
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Seiya Tokui
 
Chainerを使って細胞を数えてみた
Chainerを使って細胞を数えてみたChainerを使って細胞を数えてみた
Chainerを使って細胞を数えてみたsamacoba1983
 

Destaque (20)

Poormans sdk
Poormans sdkPoormans sdk
Poormans sdk
 
仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
 
ぐだ生って何
ぐだ生って何ぐだ生って何
ぐだ生って何
 
Oscar compiler for power reduction
Oscar compiler for power reduction Oscar compiler for power reduction
Oscar compiler for power reduction
 
Unix v6 セミナー vol. 5
Unix v6 セミナー vol. 5Unix v6 セミナー vol. 5
Unix v6 セミナー vol. 5
 
V6 unix vol.2 in okinawa
V6 unix vol.2 in okinawaV6 unix vol.2 in okinawa
V6 unix vol.2 in okinawa
 
波形で見るBig.little
波形で見るBig.little波形で見るBig.little
波形で見るBig.little
 
V6read#4
V6read#4V6read#4
V6read#4
 
Adk2012
Adk2012Adk2012
Adk2012
 
Ngk2011 b
Ngk2011 bNgk2011 b
Ngk2011 b
 
オレオレ家電
オレオレ家電オレオレ家電
オレオレ家電
 
自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた
 
Android binder-ipc
Android binder-ipcAndroid binder-ipc
Android binder-ipc
 
Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析
 
Deep learning入門
Deep learning入門Deep learning入門
Deep learning入門
 
PythonでDeepLearningを始めるよ
PythonでDeepLearningを始めるよPythonでDeepLearningを始めるよ
PythonでDeepLearningを始めるよ
 
Chainer v1.6からv1.7の新機能
Chainer v1.6からv1.7の新機能Chainer v1.6からv1.7の新機能
Chainer v1.6からv1.7の新機能
 
Deep Learningを用いたロボット制御
Deep Learningを用いたロボット制御Deep Learningを用いたロボット制御
Deep Learningを用いたロボット制御
 
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Deep learning実装の基礎と実践
Deep learning実装の基礎と実践
 
Chainerを使って細胞を数えてみた
Chainerを使って細胞を数えてみたChainerを使って細胞を数えてみた
Chainerを使って細胞を数えてみた
 

Semelhante a 20分でわかった事にするパワーマネジメント

【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 sandai
 
【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 sandai
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLakirahiguchi
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタl_b__
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Hiraku Toyooka
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試したy-uti
 
Read daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisanRead daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisanshinaisan
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズKazuhiro Takahashi
 
マイコンロボット実習
マイコンロボット実習マイコンロボット実習
マイコンロボット実習Takehiko YOSHIDA
 
発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発貴大 山下
 
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutesLinux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutesYohei Azekatsu
 
4章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 24章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 2mao999
 
20200709 fjt7tdmi-blog-appendix
20200709 fjt7tdmi-blog-appendix20200709 fjt7tdmi-blog-appendix
20200709 fjt7tdmi-blog-appendixAkifumi Fujita
 
システムパフォーマンス勉強会#5
システムパフォーマンス勉強会#5システムパフォーマンス勉強会#5
システムパフォーマンス勉強会#5shingo suzuki
 
Tremaで試すFirewall
Tremaで試すFirewallTremaで試すFirewall
Tremaで試すFirewallM Hagiwara
 
as-6. スーパーバイザモード,特権命令,割り込み
as-6. スーパーバイザモード,特権命令,割り込みas-6. スーパーバイザモード,特権命令,割り込み
as-6. スーパーバイザモード,特権命令,割り込みkunihikokaneko1
 

Semelhante a 20分でわかった事にするパワーマネジメント (20)

Gingerbread
GingerbreadGingerbread
Gingerbread
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
 
【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタ
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試した
 
Read daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisanRead daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisan
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズ
 
マイコンロボット実習
マイコンロボット実習マイコンロボット実習
マイコンロボット実習
 
発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発
 
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutesLinux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutes
 
4章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 24章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 2
 
Interrupts on xv6
Interrupts on xv6Interrupts on xv6
Interrupts on xv6
 
20200709 fjt7tdmi-blog-appendix
20200709 fjt7tdmi-blog-appendix20200709 fjt7tdmi-blog-appendix
20200709 fjt7tdmi-blog-appendix
 
システムパフォーマンス勉強会#5
システムパフォーマンス勉強会#5システムパフォーマンス勉強会#5
システムパフォーマンス勉強会#5
 
Tremaで試すFirewall
Tremaで試すFirewallTremaで試すFirewall
Tremaで試すFirewall
 
as-6. スーパーバイザモード,特権命令,割り込み
as-6. スーパーバイザモード,特権命令,割り込みas-6. スーパーバイザモード,特権命令,割り込み
as-6. スーパーバイザモード,特権命令,割り込み
 
Open VZ
Open VZOpen VZ
Open VZ
 

Mais de magoroku Yamamoto (16)

V6 unix in okinawa
V6 unix in okinawaV6 unix in okinawa
V6 unix in okinawa
 
ぐだ生システム#2
ぐだ生システム#2ぐだ生システム#2
ぐだ生システム#2
 
Android builders summit slide tour
Android builders summit slide tourAndroid builders summit slide tour
Android builders summit slide tour
 
第4回名古屋Android勉強会資料
第4回名古屋Android勉強会資料第4回名古屋Android勉強会資料
第4回名古屋Android勉強会資料
 
Poorman’s adk トレーナ
Poorman’s adk トレーナPoorman’s adk トレーナ
Poorman’s adk トレーナ
 
V6read#3
V6read#3V6read#3
V6read#3
 
Unixファイルシステムの歴史
Unixファイルシステムの歴史Unixファイルシステムの歴史
Unixファイルシステムの歴史
 
Pdp11 on-fpga
Pdp11 on-fpgaPdp11 on-fpga
Pdp11 on-fpga
 
V6read#2
V6read#2V6read#2
V6read#2
 
Androidの入力システム
Androidの入力システムAndroidの入力システム
Androidの入力システム
 
ぐだ生システム再構成4
ぐだ生システム再構成4ぐだ生システム再構成4
ぐだ生システム再構成4
 
20分で理解する仮想記憶
20分で理解する仮想記憶20分で理解する仮想記憶
20分で理解する仮想記憶
 
Android のusb support
Android のusb supportAndroid のusb support
Android のusb support
 
Os真髄
Os真髄Os真髄
Os真髄
 
Ustream入門
Ustream入門Ustream入門
Ustream入門
 
仮想記憶の構築法
仮想記憶の構築法仮想記憶の構築法
仮想記憶の構築法
 

20分でわかった事にするパワーマネジメント

  • 1. 20分でわかった事にする Power Management cpuidle編 @magoroku15 最底辺活動家
  • 2. Androidzaurusのつぶやき 使用未許諾 • われらの恐竜先生、販売日にTegra 3のタブ レットをご購入 • 買った、直後の勉強会にてustream送出マ シンとして華麗にデビュー • 独自の視点での解析 -お約束ですね-
  • 3. Android Zairusの日記 使用未許諾
  • 5. Power management ちょー入門 • 家庭のパワーマネジメント – 照明はコマメに消す – 冷房は設定温度を高めに →住人が決める・操作する • CPUのパワーマネジメント – 不要なものは止める – 処理速度と落とす →どうやって決めるのか?操作するの か?
  • 6. UNIX/BSD/Mac/Linux App System call 動かすプロセスが無いとidleを呼ぶ KERNEL idle HDD
  • 7. BSD 4.3 GENERIC/locore.c 1498 .globl Idle 1499 Idle: idle: 1500 mtpr $0,$IPL # must allow interrupts here 1501 tstl _whichqs # look for non-empty queue 1502 bneq sw1 1503 brb idle
  • 8. Tegraのidle Kernel_V9_4_2_7/arch/arm/mach-tegra static int tegra_cpuidle_register_device(unsigned int cpu) // cpuidleへの登録 { : state->enter = tegra_idle_enter_lp2; : } static inline void tegra_idle_lp2(struct cpuidle_device *dev, struct cpuidle_state *state) { #ifdef CONFIG_ARCH_TEGRA_2x_SOC // tegra2の場合 tegra2_idle_lp2(dev, state); #endif #ifdef CONFIG_ARCH_TEGRA_3x_SOC // tegra3の場合 tegra3_idle_lp2(dev, state); #endif }
  • 9. Tegra3のidle Kernel_V9_4_2_7/arch/arm/mach-tegra/sleep.S void tegra3_idle_lp2(struct cpuidle_device *dev, struct cpuidle_state *state) { s64 request = ktime_to_us(tick_nohz_get_sleep_length()); bool last_cpu = tegra_set_cpu_in_lp2(dev->cpu); cpu_pm_enter(); if (last_cpu && (dev->cpu == 0)) // CPU0だけ別扱い tegra3_idle_enter_lp2_cpu_0(dev, state, request); else tegra3_idle_enter_lp2_cpu_n(dev, state, request); cpu_pm_exit(); tegra_clear_cpu_in_lp2(dev->cpu); }
  • 10. Tegra3のidle Kernel_V9_4_2_7/arch/arm/mach-tegra/sleep.S ENTRY(tegra_cpu_wfi) cpu_id r0 cpu_to_halt_reg r1, r0 cpu_to_csr_reg r2, r0 mov32 r0, TEGRA_FLOW_CTRL_VIRT mov r3, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG str r3, [r0, r2] @ clear event & interrupt status mov r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT | FLOW_CTRL_JTAG_RESUME str r3, [r0, r1] @ put flow controller in wait irq mode dsb wfi mov r3, #0 str r3, [r0, r1] @ clear flow controller halt status mov r3, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG str r3, [r0, r2] @ clear event & interrupt status dsb mov pc, lr ENDPROC(tegra_cpu_wfi)
  • 11. WFI Wait For Interrupt • ARMの命令 • 割り込が発生するまで、CPUを低電力モード で命令の実行を止める • 眠りの深さ/寝起きの良さ – 深く眠ると • 電力低減効果大/寝起きは悪い • もっさり – 浅く眠ると • 電力低減効果小/寝起きは良い • さくさく • WFIを呼ぶ前に眠りの深さを指定する
  • 12. おっと • この時点でTegraのStateを理解していない 事に気づく • Flow controllerって何?
  • 13. Omap3のidle int __init omap3_idle_init(void) { : state->enter = (state->flags & CPUIDLE_FLAG_CHECK_BM) ? omap3_enter_idle_bm : omap3_enter_idle; : } static int omap3_enter_idle(struct cpuidle_device *dev, struct cpuidle_state *state) { : }
  • 14. omap3のC-ステート #define OMAP3_STATE_C1 0 /* C1 - MPU WFI + Core active */ IDLE 昼寝 #define OMAP3_STATE_C2 1 /* C2 - MPU WFI + Core inactive */ #define OMAP3_STATE_C3 2 /* C3 - MPU CSWR + Core inactive */ #define OMAP3_STATE_C4 3 /* C4 - MPU OFF + Core iactive */ #define OMAP3_STATE_C5 4 /* C5 - MPU RET + Core RET */ #define OMAP3_STATE_C6 5 /* C6 - MPU OFF + Core RET */ #define OMAP3_STATE_C7 6 /* C7 - MPU OFF + Core OFF */ 爆睡
  • 15. ステートの指定はどうするの? • CPUIdle Framework – CPU依存のCステート – Governor(統治者)によるポリシーベースの管理 – /sys/power/cpuidle_deepest_state – /sys/proc/pm_prepwstst • Governor – “ladder”,”menu” – drivers/cpuidle/governors
  • 16. cpuidleの構成 /sys/devices/syste/cpu/cpuidle ユーザレベル インターフェース menu ladder Governor Cpuidle アーキ無依存 Generic cpuidle omap3-cpuidle tegra2-cpuidle tegra3-cpuidle Cpuidle アーキ依存
  • 17. cpuidle • 実行可能なプロセスがない状態を管理 – 昔は単純な停止orループ – ARMでは命令を追加して明にidleを通知 WFI – WFIを呼ぶ前に、寝る深さC-Stateを指定 • 標準でLadderとmenuのGovernor – ユーザプログラムで統計情報から指定も可 • 他の省電力機能もcpuidleを起点に動作
  • 18. 他のフレームワーク • cpufreq – 動作周波数を変更 – 電源電圧も合わせて変更 • runtime_pm – SoC内部コアを機能単位ごとに停止するヒントを 管理 – SoC内の機能毎にusecountを用意し、idleのタイミ ング未使用の機能を止める – Beagle のpm_branchで実機評価可能 • cpuhotplug – cpuidleのC-state変更をCPU単位に拡張
  • 19. 上級者向けの話題 • Runtime_PM – http://elinux.org/OMAP_Power_Management – http://git.kernel.org/?p=linux/kernel/git/khilman/l inux-omap-pm.git • BeagleboardでSleep時の電流を8mWにした 話 – http://groups.google.com/group/beagleboard/bro wse_thread/thread/197a8ef6b46cc828 – 回路を改造して、ボード上のコントローラの 電源供給を止める