こんにちは。NoMaYです。ひとつ立てても良さそうな気がしましたので立ててみました。もっとも、その前に気になる問い掛け、が無いわけでは無いですけれども、、、● マイコンベンダ提供のソフトウェア開発フレームワークと共存させることが苦痛な実装のRTOSを今後も新規プロジェクトで使う予定がありますかね[関連スレッド]スマートコンフィグレータの自動生成をカスタマイズしたいjapan.renesasrulz.com/cafe_rene/f/forum5/8248/threadFITの割込みハンドラの実装についてjapan.renesasrulz.com/cafe_rene/f/forum5/8212/fitRX72Nで簡易I2C通信をしたい。DATAは出力されているがCLKが何故か正しく出力されない。。japan.renesasrulz.com/cafe_rene/f/forum5/7129/rx72n-i2c-data-clkFITでの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
Muraさん解決できてよかったです!(いいねボタンが欲しいw)
ふぐりん さん、こんにちは。NoMaYです。今しがた頭に思い浮かんだのですけれども、ひとまず、そうしてしまっても良い話なのか、そういう話では無いのか、というのは脇へ置いて、NORTi_interrupt.cのコードの中でKNL_LEVELマクロ定義を参照して、PSW.IPLの方が大きい値だった場合には自動的にv3_ent_int()を呼ばないようにスキップしてしまう、というように出来るかも知れないなぁ…
ふぐりんです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さんのソースを転載してもよろしいでしょうか?許可いただければ、ファイルとしてそのまま収録したいと思います。
GitHUBに、KNL_LEVELは15を推奨する注意書きを追加しました。
「NORTi を RX Smartconfigurator と一緒に使う方法」https://github.com/mkogax/How-to-use-NORTi-with-RX-Smartconfigurator
【注意3】NORTiのKNL_LEVELは15を推奨します。(2022.12.28追記)
ふぐりん さん、こんにちは。NoMaYです。今しがた頭に思い浮かんだのですけれども、ひとまず、そうしてしまっても良い話なのか、そういう話では無いのか、というのは脇へ置いて、NORTi_interrupt.cのコードの中でKNL_LEVELマクロ定義を参照して、PSW.IPLの方が大きい値だった場合には自動的にv3_ent_int()を呼ばないようにスキップしてしまう、というように出来るかも知れないなぁ、という気がしました。試しにコードを書いてみようかと思います。[メモ]・ KNL_LEVEL以下であれば多重割り込みされない・ KNL_LEVELより大きければ多重割り込みされてもv3_ent_int()は呼ばない・ ならば、発生したベクタ割り込みのベクタ番号の値はv3_ent_int()の前後で単純素朴に変数に退避しておけば充分、なのでは、、、[追記]・ いっそ、KNL_LEVELより大きいベクタ割り込みはNORTi_interrupt.cのコードの中で自動的にSETPSW Iしてしまうとか、、、
NoMaYさんこんにちは。今年もよろしくお願いいたします
それいいですねえ!利用者がKNL_LEVELを最高レベルに変更し忘れること(注意3を見落とすこと)はかなり確実に発生するwと思われますから。自動で処理されるのは助かります。
(KNL_LEVELの参照方法はのちほど確認します)
ふぐりん さん、こんにちは。NoMaYです。KNL_LEVELは、どのヘッダファイルで定義されているものなのでしょうか?Google検索してみましたが、信じられないことに、それが定義されているであろうヘッダファイル名には辿り着けませんでした。例えば、以下のドキュメントでは、Cソース上で定義されているもののように見受けられます。μITRON 仕様リアルタイムOS シミュレータ NORTi Simulator ユーザーズガイドwww.mispo.co.jp/document/no4sim.pdf#page=2828/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さんがやりやすいので参照していただければ。