MISPOさんのNORTiをRX SmartConfiguratorと一緒に使いたい場合の課題と対策を考察してみるスレッド

こんにちは。NoMaYです。

ひとつ立てても良さそうな気がしましたので立ててみました。

もっとも、その前に気になる問い掛け、が無いわけでは無いですけれども、、、

● マイコンベンダ提供のソフトウェア開発フレームワークと共存させることが苦痛な実装のRTOSを今後も新規プロジェクトで使う予定がありますかね

[関連スレッド]

スマートコンフィグレータの自動生成をカスタマイズしたい
japan.renesasrulz.com/cafe_rene/f/forum5/8248/thread

FITの割込みハンドラの実装について
japan.renesasrulz.com/cafe_rene/f/forum5/8212/fit

RX72Nで簡易I2C通信をしたい。DATAは出力されているがCLKが何故か正しく出力されない。。
japan.renesasrulz.com/cafe_rene/f/forum5/7129/rx72n-i2c-data-clk

FITでのSCI使用時に文字を1文字送信すると、プログラムが固まります。
japan.renesasrulz.com/cafe_rene/f/forum5/7071/fit-sci-pc-1
 


RX SmartConfiguratorで気になった点とか改善する案とか報告してみるスレッド
japan.renesasrulz.com/cafe_rene/f/forum5/7536/rx-smartconfigurator/42599#42599
 

Parents
  • ふぐりんです
    NoMaYさんこんにちは。


    以下のスレッドでNoMaYさんに作っていただいたプログラムで
    NORTiをRX SmartConfiguratorと一緒に使えるようになったようです。
    NORTiユーザとしてFITとの同居という念願がかないました。(共存させることが苦痛な実装のRTOSじゃなくなった?w
    NoMaYさんありがとうございました!

    スマートコンフィグレータの自動生成をカスタマイズしたい
    japan.renesasrulz.com/.../thread

    ソース追いかけたり実験したりしてたので遅くなりましたが確認が取れました。
    詳しいやりかたなどは私のGitHUB(github.com/mkogax)に上げたいと思っていますが、NoMaYさんのソースを転載してもよろしいでしょうか?許可いただければ、ファイルとしてそのまま収録したいと思います。
    以下簡単なご報告です。

    ----------
    セットアップ
    ----------
    NoMaYさんの NORTi_interrupt.c (20220629_2版) をそのまま改変なしで使用しました。
    ただし、NORTi_interrupt.h で全て NORTiタイプを指定し、INTBにはNORTi管理のベクタテーブル(RAM)を登録します。
    NORTi側は初期化時に呼ばれる intini() (利用者が作るヘルパ関数のようなもの)を改造するだけです。

    ----------
    効果
    ----------
    ・FIT/CGは改変なしでそのままNORTiを利用できます。(コールバックでNORTi利用可)
    ・NORTiの割込みハンドラ(def_inh())をそのまま利用できます。
    ・NORTiの割込みサービスルーチン(cre_isr())をそのまま利用できます。(最初におまじない必要)
    ・FIT/CGの割込み処理はNORTi対応で少しオーバヘッドが増えますが、NORTiを使わないで高速に処理したい場合(nonOS)はdef_inh()で対応できます。

    ----------
    実験(Target Board for RX130,CS+)
    ----------
    ・r_cmt_rx(FIT)の10msec周期コールバックからNORTiのチックタイム通知(isig_tim())
    ・TMR0(CG)で#pragma interrupt の割込みルーチンからタスク起床(wup_tsk())
    ・TMR1(CG)の改造でdef_inh() のNORTi割込みハンドラからタスク起床(wup_tsk())
    ・TMR2(CG)の改造でcre_isr() のNORTi割込みサービスルーチンからタスク起床(wup_tsk())
    ・TMR3(CG)で#pragma interrupt の割込みルーチンを非NORTiとして再登録(def_inh())してカウンタ変数更新を確認

  • ふぐりん さん、こんにちは。NoMaYです。

    どうもありがとうございました。新たな技も開発されたみたいですね。そして、以下の件、もちろん転載して構わないです。

    > 詳しいやりかたなどは私のGitHUB(github.com/mkogax)に上げたいと思っていますが、NoMaYさんのソースを転載してもよろしいでしょうか?許可いただければ、ファイルとしてそのまま収録したいと思います。

  • NoMaYさんこんにちは。今年もよろしくお願いいたします

    それいいですねえ!
    利用者がKNL_LEVELを最高レベルに変更し忘れること(注意3を見落とすこと)はかなり確実に発生するwと思われますから。自動で処理されるのは助かります。

    (KNL_LEVELの参照方法はのちほど確認します)

  • ふぐりん さん、こんにちは。NoMaYです。

    KNL_LEVELは、どのヘッダファイルで定義されているものなのでしょうか?Google検索してみましたが、信じられないことに、それが定義されているであろうヘッダファイル名には辿り着けませんでした。例えば、以下のドキュメントでは、Cソース上で定義されているもののように見受けられます。

    μITRON 仕様リアルタイムOS シミュレータ NORTi Simulator ユーザーズガイド
    www.mispo.co.jp/document/no4sim.pdf#page=28
    28/66 頁

    コンフィグレーションの変更
    NORTi Simulator 版ネットワークでは製品版ネットワークより1つ多くセマフォを使用します。この為、
    カーネル・TCP/IP コンフィグレーションファイルにおいてセマフォID の上限値を1つ増やします。
    ファイル名:nonecfg.c

    /*****************************************************************************
    * カーネルコンフィグレーション
    *
    ******************************************************************************/
    #define TSKID_MAX 11+TCP_TSKID_CNT /* タスクID 上限 */
    #if defined(NORTiSIM)
    #define SEMID_MAX 2+TCP_SEMID_CNT /* セマフォID 上限 */
    #else
    #define SEMID_MAX 1+TCP_SEMID_CNT /* セマフォID 上限 */
    #endif
    #define FLGID_MAX 1 /* イベントフラグID 上限 */
    #define MBXID_MAX 1+TCP_MBXID_CNT /* メイルボックスID 上限 */
    #define MBFID_MAX 4 /* メッセージバッファID 上限 */
    #define PORID_MAX 1 /* ランデブ用ポートID 上限 */
    #define MPLID_MAX 1 /* 可変長メモリプールID 上限 */
    #define MPFID_MAX 1+TCP_MPFID_CNT /* 固定長メモリプールID 上限 */
    #define CYCNO_MAX 1 /* 周期起動ハンドラ番号上限 */
    #define ALMNO_MAX 1 /* アラームハンドラ番号上限 */
    #define SYSMSZ 2048 /* システムメモリサイズ */
    #define ISTKSZ 512 /* 割り込みハンドラのスタックサイズ */
    #define KNL_LEVEL 14 /* カーネルの割り込みレベル *
    #include "nocfg4.h"



  • みなさん、お久しぶりです。

    他の方がどのように使用されているかわかりませんが、こちらでは、

    nocfg4.h を include する前に設定したい値を define しています。

    nocfg4.h 内に

    ```

    #ifndef KNL_LEVEL
    #if (defined(CPU_68K)||defined(CPU_H8S)||defined(CPU_H8SX)||defined(CPU_H85)||defined(CPU_M16C)||defined(CPU_COLDFIRE))
    #define KNL_LEVEL 5
    #elif defined(CPU_RX)
    #define KNL_LEVEL 6
    #elif defined(CPU_SH)
    #define KNL_LEVEL 14

    とあるので、include する前に使用するのが正しいと思っています。

    noccfg4.h 内にはその他グローバル変数も定義されているので、このヘッダーは何処か一箇所だけで

    include する前提かと。

  • ka.makiharaさん、こんにちは。NoMaYです。

    情報ありがとうございます。考えを巡らせてみて思い浮かんだのですけれども、カーネルのソースとしては、Cソースで使用されている箇所が全く無く、アセンブラソースのみで使用されているので、こういうことになっているのかも知れませんね。(KNL_LEVELを変更したい場合には、カーネルのどれかのアセンブラソース/アセンブラヘッダファイルを変更する、Cソース/Cヘッダファイルで変更するものでは無い、ということなのでしょうね。そういうファイル構成ということなのでしょうね。)

    そして、私がある筈だと思い込んでいたような位置付けのCヘッダファイルは、どうやら、そもそも存在しないようですね。そこが分かれば、こちらは後を続けられそうです。どうもありがとうございました。

  • NoMaYさんこんにちは!
    ka.makiharaさんおひさしぶりです!

    出遅れてしまいましたw

    たしかにデフォルトのままで使うとき KNL_LEVEL を知るにはどうしたら良いか?
    難しいんですよねぇ・・
    NORTiのソースを追いかけるとわかるんですが・・使用許諾契約にギリ触れちゃうかもしれないんで・・すいません。(おまえNORTi使用禁止じゃ!って言われると困っちゃうw)
    ka.makiharaさんもおっしゃるようにいろんな定義情報が静的なオブジェクトとして(形を変えて)参照可能になっています。

    もしご興味があれば
    ググるとNORTiのユーザーズガイドが見れるようですので、
    「uITRON 仕様準拠リアルタイムOS NORTi カーネル編 ユーザーズガイド」
    www.mispo.co.jp/.../no4guid.pdf
    ここの "2.2 カーネルコンフィグレーション" が参考になると思います。
    (NoMaYさん既にご存知でしたらご容赦ください)


    でですね。私も考えてみたんですが・・
    CC-RXのコンパイラオプションの「マクロ定義」で、"KNL_LEVEL=14"とか定義してしまうのはどうでしょうね?
    そうすれば、NORTiの コンフィグレーション(nocfg4.h)にも伝わるし、NoMaYさんのソースにも伝わるんじゃないでしょうか?
    もしオプション付け忘れたら、NoMaYさんのソースで未定義エラーになるのでわかりますし。

  • ふぐりん さん、こんにちは。NoMaYです。

    あぁっ~、ka.makiharaさんの書かれた以下のファイル名はタイピングミスですかね、、、

    > noccfg4.h

  • ふぐりん さん、こんにちは。NoMaYです。

    そういうことでしたら、以下のようなグローバル変数を用意しておきますので、KNL_LEVELを代入して貰う手もありますね。

    uint8_t NORTi_INT_HOOK_KNL_LEVEL = KNL_LEVEL;

     
    あるいは、以下の関数の引数にKNL_LEVELを渡して貰うとか。

    void NORTi_INT_HOOK_init(uint8_t knl_level);

     

  • NoMaYさんありがとうございます
    そうそうそんな手もありますね。
    NoMaYさんがやりやすいので参照していただければ。

  • ふぐりん さん、こんにちは。NoMaYです。

    作ってみました。以下のグローバル変数を用意しましたので、以下のようにKNL_LEVELを代入しておいて下さい。

    uint8_t NORTi_INT_HOOK_KNL_LEVEL = KNL_LEVEL;

     
    2388.issue_NORTi_INT_HOOK_20230124.zip

    ルネサスRXシミュレータでしかデバッグしていませんが、以下のようにCS+とe2 studioで開けるプロジェクトになっています。

    以下、CS+とe2 studioでのデバッグ中の画面コピーです。




     

  • NoMaYさんこんにちは
    ありがとうございます!

    とりあえずこちらのテスト環境で簡単にテストしていました。
    動作しているようです。(割込みレベル比較で分岐してます)
    もうすこし確認してからGitHubを更新します。

    ところで・・KNL_LEVELより高い割り込みの処理
    INT_COMMON_nonOS_POPM_R14R15_SETPSW_I()
    で PSWのIをONして多重割込みを許可してるようですが、これはこの方が良いんですかね?
    (いや、そのほうが使いやすいのかな?って純粋に私が知らないだけなんでお聞きしてますw)
    (もしかしてもっと深い意味(こうでないといけない意味)があるんですかね?)

Reply
  • NoMaYさんこんにちは
    ありがとうございます!

    とりあえずこちらのテスト環境で簡単にテストしていました。
    動作しているようです。(割込みレベル比較で分岐してます)
    もうすこし確認してからGitHubを更新します。

    ところで・・KNL_LEVELより高い割り込みの処理
    INT_COMMON_nonOS_POPM_R14R15_SETPSW_I()
    で PSWのIをONして多重割込みを許可してるようですが、これはこの方が良いんですかね?
    (いや、そのほうが使いやすいのかな?って純粋に私が知らないだけなんでお聞きしてますw)
    (もしかしてもっと深い意味(こうでないといけない意味)があるんですかね?)

Children
  • ふぐりん さん、こんにちは。NoMaYです。

    > KNL_LEVELより高い割り込みの処理 INT_COMMON_nonOS_POPM_R14R15_SETPSW_I() で PSWのIをONして多重割込みを許可してるようですが、これはこの方が良いんですかね?

    このところ、実は、別スレッド(複数)で、ずっと多重割り込みをRXスマートコンフィグレータ(FIT/CG)のフレームワーク内で手軽に有効にするにはどうすれば良いのかという話題/ネタが続いていたので、なんといいますか、イキオイ、みたいなものです。

    現状のKNL_LEVEL=6というのは、まだ上に7,8,9,10,11,12,13,14,15とありますけれども、これだけあると、これらの間で多重割り込みを運用したい、という発想は充分に有り得そうに思ったのです。(KNL_LEVEL=14とかで、後は上に15があるだけ、というようなものであれば、そんなことは無いでしょうけれども、これだけあると、、、)

    ところが、多重割り込みをRXスマートコンフィグレータ(FIT/CG)のフレームワーク内で有効にするのは、なかなか厄介です。なので、そのようにしてみたのです。

    [追記]

    あと、KNL_LEVEL=6以下のものでは、ミスポさん側のエントリルーチン内で多重割り込み許可にされていますので、それとの連続性というか継続性というか、そういう点でも、なんとなく、多重割り込み許可が自然かなぁ、とか思ったりしたのです。

    [関連リンク]

    私以外の人が提起したスレッドに以下のスレッドがあります。

    スマート・コンフィグレータ要望 多重割込
    community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/7578/thread

    あと、その転載です。(2回転載しました。)

    RX SmartConfiguratorで気になった点とか改善する案とか報告してみるスレッド
    community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/7536/rx-smartconfigurator/41081#41081

    現状では割り込み設定で多重割込の許可が出来ません。


    RX SmartConfiguratorで気になった点とか改善する案とか報告してみるスレッド
    community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/7536/rx-smartconfigurator/47751#47751

    かふぇルネの話題からですけれども、多重割り込みに関して要望が再度ありました。


  • NoMaYさんこんにちは
    とても詳しく説明いただいてありがとうございます!
    やっぱ聞いて良かったw感謝!

  • NoMaYさんおひさしぶりです!
    あれからGitHubの内容を整理して更新かけました。
    考えていただいた割込みレベル自動判定版も収録しています。ありがとうございました。
    https://github.com/mkogax/How-to-use-NORTi-with-RX-Smartconfigurator

    【主な変更点】
    (1)割り込みレベルの自動判定対応版と旧版の両方を収録
    (2)動作の解説図を修正(図の修正および(1)対応)
    (3)処理ケースごとの応答時間(割込み発生から処理ルーチンに到達するまでの時間)を調べた結果を追加