Renesas Rulz - Japan
Renesas Rulz - Japan
  • User
    Join or sign in
  • Site
  • Search Japan.RenesasRulz.com
  • User
  • Renesas Rulz
  • FAQ
  • パートナー
  • 半導体セミナ
  • eラーニング
  • ヘルプ
  • More
  • Cancel
  • かふぇルネ
  • がじぇるね
  • English Community
  • More
  • Cancel
がじぇっとるねさすコミュニティ
がじぇっとるねさすコミュニティ
GR-PEACH ソフトウェアスタンバイモード復帰直後にwait関数を実行するとプログラムが停止する問題
  • Forums
  • Blog
  • Files
  • がじぇっとるねさす ゆーざー会 - Wiki
  • Tags
  • More
  • Cancel
  • New

 

 GR-SAKURA

 GR-KURUMI

 GR-COTTON

 GR-CITRUS

 GR-PEACH

 GR-KAEDE

 GR-ADZUKI

 GR-LYCHEE

 GR-ROSE

 GR-MANGO(*)

 SNShield

 Web Compiler

 IDE for GR

 TOPPERS関連

 女子美コラボ

 その他

 ※プロデューサミーティング中

 作り方使い方資料

 イベント関連

 作品記事

 体験記事

 その他

 

 ライブラリ

 ツール

 その他・過去ファイル

  • State Not Answered
  • Replies 7 replies
  • Subscribers 447 subscribers
  • Views 3865 views
  • Users 0 members are here
  • SoftwareStandbyMode
  • GR-PEACH
  • mbed
  • RZA1H
Options
  • Share
  • More
  • Cancel
Related Tags
  • AUDIO CAMERA Shield
  • CAMERA
  • define
  • GR-PEACH
  • GR-PEACH RZ/A1 Linux
  • mbed
  • MTU2
  • NTSC
  • OpenCV
  • RZA1H
  • SoftwareStandbyMode
  • TOPPERS
  • uart
  • Webカメラ
  • マルチタスク
  • 位相計数モード
Related

ソフトウェアスタンバイモード復帰直後にwait関数を実行するとプログラムが停止する問題

a
a over 1 year ago

お世話になっております.

Daiki Kato様のソースコードを参考に,GR-peachのソフトウェアスタンバイモードを使ったプログラムを作成しております.

https://os.mbed.com/users/dkato/code/SoftwareStanby_test_use_OS/file/29fa0989ec31/main.cpp/

 

このソースコードのソフトウェアスタンバイ復帰直後(SoftwareStandby関数直後)にwait関数を呼びだしました.

void test_task(void) {
    int test_cnt = 0;

    button.fall(&interrupt_button);
    button.rise(&interrupt_button);

    while (true) {
        SoftwareStandby();
        wait_ms(100);  //ここにwaitを追加
#if(0)  // It may or may not be present.
        // It becomes sleep during idle task.
        Thread::signal_wait(1);
#endif
        led1 = !led1;
        printf("%d\n", test_cnt++);
        wait_ms(2);  // Wait for output completion of printf().
    }
}



mbedのオンライン環境でコンパイルすると動作するのですが,e2studioでコンパイルすると,wait_ms(100)の部分でプログラムが停止してしまいました.
解決方法をご存じでしたらご教授願います.

  • Reply
  • Cancel
  • Cancel
  • dkato
    0 dkato over 1 year ago
    おそらく、mbed-osのバージョンの違いだと思います。
    私のサンプルはかなり古いmbed-osを使用していたので、現行のmbed-osでは動作しないようです。

    サンプルをアップデートし、現行のmbed-osでも動作するようにしてみました。
    os.mbed.com/.../

    サンプル中のsleep_manager_sleep_auto()は現行のmbed-osで用意されているオフィシャルの関数で、ソフトウェアスタンバイモード相当の動きとなります。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • a
    0 a over 1 year ago in reply to dkato
    いつもありがとうございます.
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • dkato
    0 dkato over 1 year ago in reply to a
    sleep_manager_sleep_auto()はソフトウェアスタンバイではなく、モジュールスタンバイでした。
    ソフトウェアスタンバイはNMI、IRQ割り込み、パワーオンリセットからしか解除できないため(OSタイマでは解除できない)、Mbed環境ではモジュールスタンバイまでしか実装されていません。

    現行のmbed-osでは、OSのidle時に「__WFI()」を実行するのですが、SoftwareStandby実行後は、この処理がうまく動作していないようです。旧OSでは「__WFI()」を実行していなかったため、動いていたようです。

    「__WFI()」の代わりに「__SEV(); __WFE(); __WFE();」に置き換えて試してみたのですが、うまく動作しなかったので、暫定ですが以前公開していたサンプル相当に戻しました。(現行のmbed-osで「__WFI()」を実行しないようにしました。)
    os.mbed.com/.../
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • dkato
    0 dkato over 1 year ago in reply to dkato

    idle_hook()内で「__SEV(); __WFE(); __WFE();」を実行するとうまく動きました。Mbedドライバ内ではsleep時に割り込み禁止に設定されているので動かなかったようです。以下をお試しください。

    https://os.mbed.com/users/dkato/code/SoftwareStanby_test_use_OS/file/70870890e359/main.cpp/

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • a
    0 a over 1 year ago

    返信が大変遅くなり、申し訳ございません。
    自分のプログラムでもidle_hookを付け加えることで、wait関数でプログラムが停止せずに動くようになりました。ありがとうございます。

    自分はプログラム初心者でわからないことがあるので、このプログラムでうまく動作する仕組みについて伺いたいです。
    まず、idle_hookはRTOSのバックグラウンドで常に実行されている関数ということでしょうか?
    また、この関数内でSEV、WFE命令を実行してスリープモードに入るということでしょうか?なぜこのような方法でうまくいくのでしょうか?

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • dkato
    0 dkato over 1 year ago in reply to a
    idle_hookはOSがidle(sleep)になるときにコールされる関数です。idle_hookを登録しない場合はmbed-os内で用意されている「__WFI()」がコールされます。

    GR-PEACHに搭載されているRZ/A1Hのスリープモード遷移は、ソフトウェアスタンバイを併用する際「__WFI()」ではなく「__SEV(); __WFE(); __WFE();」をコールする必要があります。詳しくはハードウェアマニュアルP2653の「55.3.1 スリープモード」を参照ください。
    www.renesas.com/.../r01uh0403jj0400_rz_a1h.pdf
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • a
    0 a over 1 year ago

    理解いたしました.ありがとうございました.

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
サイト使用条件
プライバシーポリシー
お問い合わせ
© 2010-2020 Renesas Electronics Corporation. All rights reserved.