RTOSでのemWin(RX65N)

RTOSでのemWinについて

はじめまして。Tanigawaと申します。

RX65N envision kitを用いて、RenesasのGithubにある「GLCDC RW2D emWin(Segger GUIミドルウェア)」を参考に、RTOSでGUIアプリケーションを作成しようとしています。

emWinのイベント処理(スイッチのオンオフなど)からシリアルに送信キューを送りたいとき、どう書いてよいかわかりません。

以下のようにApplication.cに記述すると動作はするのですが、いかにもまずい書き方な気がして自信がありません。

emWinの処理ととRTOSのタスクの兼ね合いがわからないので、良い方法を教えていただきたいです。

#include "Application.h"

char string[32];

extern QueueHandle_t queue_handle_1;

void process_switch_on(WM_HWIN hDisplayedText)

{

TEXT_SetText(hDisplayedText, "ON");

TEXT_SetBkColor(hDisplayedText, GUI_WHITE);

TEXT_SetTextColor(hDisplayedText, GUI_BLUE);

led_on();

sprintf(string, "ON\r");

xQueueSend(queue_handle_1, string, portMAX_DELAY);

}

シリアル通信のほうは「queueの活用 printデバッグのシリアライズ」を参考に、キューによるシリアル送信タスクを実装しています。

よろしくお願いします。

Parents
  • tanigawaさん、こんにちは。NoMaYと申します。

    RTOSのAPIの具体的な使用方法に詳しいわけではないのですけれども、そのあたりは追々調べてみますけれども、まずはBing先生に聞いてみました。

    以下、Microsoft BingのAI回答の取り掛かりの画面コピーです。



    [追記]

    Bing先生の回答の出だしはルネサスさんのウェブページと同じですね。

    以下、ルネサスさんのウェブページの画面コピーです。

    www.renesas.com/jp/ja/products/gadget-renesas/reference/gr-rose/rtos-queue

     

  • NoMaYさん、こんにちは。tanigawaです。

    返信ありがとうございます。

    現状、FreeRTOSでのキューによるシリアル送信の方法自体はわかっているのですが、通常はタスク関数内でキューに送信するところを、emWinのルーチン内で行うことに疑問を感じています。

    「RX72N Envision kit を用いた 音声認識・発話および LCD 表示ソリューション」のアプリケーションノートを読んだところ(残念ながらソースは提供されていないようです)、emWinのメインルーチンをRTOSのタスクで実装しているみたいです。

    具体的な方法はまだよくわかっていませんが、その方針でやってみようと考えています。

Reply
  • NoMaYさん、こんにちは。tanigawaです。

    返信ありがとうございます。

    現状、FreeRTOSでのキューによるシリアル送信の方法自体はわかっているのですが、通常はタスク関数内でキューに送信するところを、emWinのルーチン内で行うことに疑問を感じています。

    「RX72N Envision kit を用いた 音声認識・発話および LCD 表示ソリューション」のアプリケーションノートを読んだところ(残念ながらソースは提供されていないようです)、emWinのメインルーチンをRTOSのタスクで実装しているみたいです。

    具体的な方法はまだよくわかっていませんが、その方針でやってみようと考えています。

Children
  • tanigawaさん、こんにちは。NoMaYです。

    > 現状、FreeRTOSでのキューによるシリアル送信の方法自体はわかっているのですが、通常はタスク関数内でキューに送信するところを、emWinのルーチン内で行うことに疑問を感じています。

    そういうことだったのですね。こういうことでは無かったのですね。私は大昔にWindowsアプリケーションを作っていたこともちょっとだけありましたけれども、ボタンのいわゆるメッセージハンドラ関数内でデバッグメッセージをデバッグコンソールに表示させることには抵抗は無かったです。(大昔のことなので、過去の記憶を勝手に思い込んでいるだけだったりする可能性もありすけれども。) (もちろん、Windowsアプリケーションはノンリアルタイムアプリケーションです。)

    私が思った今の方法の問題点:

    sprintf()で動的に生成した文字列を格納した素朴なただひとつのバッファのアドレスをQUEUEに入れているので、QUEUEからの読み出しが間に合わなくなると、その素朴なひとつのバッファに新しくsprintf()で動的に生成した文字列が格納されてしまうけれども、そうなってから、その前の文字列をQUEUEから読み出そうてしても、既に新しい文字列に書き変わってしまっている

  • NoMaYさん、こんにちは。

    返信ありがとうございます。

    そうですね。試しに一秒ごとに固定文字列をQUEUEに送信するタスクを加え、画面上のスイッチをトグルすると「ON」「OFF」とQUEUEに送信するプログラムをかいてみたところ、高確率でフリーズしてしまいます。

    やはりRTOSの処理はタスクの管理内で行わないと不具合が生じるようです。

    QUEUE内の文字列の上書きについては、renesas githubの

    queueの活用 printデバッグのシリアライズ

    にて複数タスクによるシリアル送信の動作を確認しているので、今のところ問題はないと考えています。

  • tanigawaさん、こんにちは。NoMaYです。

    > 「RX72N Envision kit を用いた 音声認識・発話および LCD 表示ソリューション」のアプリケーションノートを読んだところ(残念ながらソースは提供されていないようです)、emWinのメインルーチンをRTOSのタスクで実装しているみたいです。

    ということは、以下で検索するような案件のようですね。Qiitaには充分な情報が無いみたいでしたので、Segger社のウェブサイトもしくはエンビテックさんのウェブサイトで探すことになりそうな気がします。

    Google検索: emWin タスク site:qiita.com
    www.google.com/search?q=emWin+タスク+site:qiita.com

    エンビテックさんのウェブサイトのURLに関しては以前に以下のスレッドで探しがことがあります。

    RX65N/RX72N emWin+AppWizardでJapanese Language Displayが出来るか調べてみることにしました(Is it available?)
    community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/8320/rx65n-rx72n-emwin-appwizard-japanese-language-display-is-it-available