コードジェネレータに /* Start user code があり、ここでカスタムコードを使用できるのですが、
/*Start user code 部分以外にカスタムコードを挿入したいのです。
/* Start user code 部分以外に挿入しても、「コード生成」で消えてしまうので
生成部分に手をいれて自動で出力するようにできないか?という希望がありました。
e2Studio を調べてみたら、 e2Studioのインストールフォルダ下、eclipse\pluginsに
jarファイルがあり、jarファイルの中に出力するコードのひな形(?)があり、これを修正することでほぼ
目的の出力が得られるようにはなりました。
ただ、このjarファイルはバージョンでファイルが分かれていて、e2Studioが何をもとに
バージョンを選択しているのか分かりません。
ファイルの日付?バージョンの新しいもの?
scfgファイルを見ると、コンポーネントのバージョンが記載されていたので、試しにこれを直接修正してみましたが、
e2StudioのスマートコンフィグレータUIの「概要」に示されるバージョン番号は変わらず。
(これが変更できれぱ、該当のバージョンを使用できるのかも)
jarファイルの中には、plugin.xml ファイルがあり、ここにバージョンがありましたので、こちらもscfgに合わせたバージョンに修正してみました。
このような修正(が出来たとして)は当然サポート外の修正となるのは承知していますが、
CGのコンポーネントバージョン(修正方法)とバージョンに対応するjarファイルの選択の仕組みをご存じの方が見えましたら、情報をお願いします。
ふぐりんです。NoMAYさん、ka.makiharaさん、ほやさん。はじめまして。NORTiは経験あるのでコメント付けさせてください。
NORTiの割込みハンドラ(isr)ですが、いろいろ条件が厳しいですよね。理由は、入口/出口で呼ばれるNORTiの割込み管理関数が、呼ばれたときのスタックの内容を決め打ちしてるからです。(何番目にどのレジスタが保存されているか決まってる前提で処理)限界まで高速化するためだと思います。
ですから、isrでAUTO変数は使っちゃダメなんですがisrから呼ばれるサブルーチンは大丈夫です。私はこんな感じで実装しています。(すいませんコードの貼り付けが分からないw)
static void xxx_interrupt(void){ 入口管理関数(); xxx_subroutine(); // これが処理本体(この中ではAUTO変数が使えます) 出口管理関数();}
NORTiは、iTRON仕様の割り込み登録用API(def_inh)も使えるようになってるため割込みベクタテーブルとその管理も内部で実装されています。これと #pragma interrupt はぶつかります。ですから本当は #pragma interrupt を使わないで def_inh を使ってほしいのですがそこに立ちふさがったのが CG であり FIT であるんじゃなかろうかと。ユーザとしても悩ましいところです。
私もNORTiとCGを共存させるため、NORTiのベクタテーブルに無理やり登録させたり苦労してます。そのとき #pragma interrupt 宣言されたルーチン(非NORTi)をコピーもしてたと思うのでもしかしたらNoMAYさんご提案に近いかたちかもしれません。
じつはNORTiとFITの共存はまだできてません・・疲れましたwFreeRTOSみたいにソフト割込み使えば入口/出口の管理関数は不要じゃないかと思うんですが・・甘いですかねえ
ふぐりんです。
CGの再生成で変更点を壊されないようにする対策について私のは泥縄式でして、恥ずかしかったので書かなかったのですがやっぱり書きますw
CGで自動生成した.cは、だいたいどれも先頭付近と最後尾付近に user code 部分があると思います。そこで先頭付近の user code で #if 0 行を書いて、最後尾の user code に #endif 行を書きます。
この最後尾の #endif 行のあとに、 #if 0 以降の無効化したコード全部そっくりそのままコピーしてコピーした中の /*Start user code 行と /* End user code 行を 削除してしまえばどんなに変更しても再生成で壊されない自動生成コードが手にはいります。
同じ関数名が二重に存在するので、検索でどっちもひっかかるのがちょっとめんどくさいです。また、自動生成コードのバージョンアップなどで変化したかどうか確認しずらいとも思うので管理に重点をおくのであれば、ほやさんの生成用プロジェクトを別に作る方法が良いなと思ってます。(追記:自動生成の出力先フォルダはあとから変更できたと思うので、プロジェクト不参加で比較用に生成できた気もします)
ちなみに、NORTiと同居するときは、コピーした側の #pragma interrupt を def_inh 方式に変更して割込みベクタテーブルはNORTi側で管理してます。
ふぐりん さん、こんにちは。NoMaYと申します。(ka.makiharaさんも、こんにちは。)NORTiですが、RXマイコン向け(かつRXスマートコンフィグレータが対応している品種)の体験版のようなものは存在していないですよね?もし存在しているのであれば、ウェブページのURLを知りたいです。それで、かふぇルネに過去に投稿されていた問合せで、ミスポさんからNORTiとFIT(やCG)を共存させる方法についての回答を直接得たのだろうと思われる人(2名)の話の内容から推測すると、手作業でFIT(やCG)のソースを修正して割り込み管理関数を入れて下さい、といった回答を得ていたようでして、どうやら、def_inhを使用して下さい、といった回答は無かったように見受けられます。私の方では、NORTiを所持していない/購入していないのでちょっと状況がわからないのですけれども、ビルド時の設定に、NORTi側ソースの割り込みベクタテーブルを無効にするオプション等が用意されているのでしょうか?(少なくとも、NORTi側ソースでは#pragma interrupt XXXX(vect=YYYY)等を使わないオプション等が用意されているのでしょうか?)Google検索: NORTi Renesas RX 体験版www.google.com/search?q=NORTi+Renesas+RX+体験版
NoMaYさん、ふぐりんさん、こんにちは。
応答が遅れていて申し訳ありません。
NoMaYさんに作成頂いたフレームワーク、さっそくテストして、使用する方向で話が進んでいます。
NORTi のFIT対応については、ミスポさんに問い合わせを行い、サンプルのダウンロードサイトを教えていただきました。
ユーザーIDとパスワードを入力するとダウンロードできるのですが、
ここに記載するのは、ダメかと思いまして・・・
========================================================================= RX231用FIT対応サンプルプログラム補足説明書 Renesas Starter Kit for RX231 編 2020年12月23日 Copyright (c) 2019-2020, MiSPO Co., Ltd. http://www.mispo.co.jp/ ========================================================================= ■はじめに Renesas Starter Kit for RX231 (R0K505231S900BE)用のNORTiのサンプルプログ ラムに、ルネサス エレクトロニクスのFirmware Integration Technology (FIT) モジュールを組み込む例として、本サンプルプログラムは作成してあります。 ■ファイル構成 r_bsp ------------ ボードサポートパッケージFITモジュールのフォルダ r_config --------- FITのコンフィグレーションファイルのフォルダ r_gpio_rx -------- I/Oポート(GPIO)のFITモジュールのフォルダ r_sci_rx --------- SCIのFITモジュールのフォルダ r_byteq ---------- FITのバイト型キューバッファ(BYTEQ)のフォルダ ent_int.src ------ FITに対応したent_int/ret_intのラッパー関数 rx231.h ---------- 内蔵周辺モジュール定義ヘッダ r0k505231.c ------ ボード依存の内蔵周辺の初期化 n4i231.c --------- 割り込み管理と周期タイマ割り込みのソース smp231_fit.c ----- シリアル入出力を使ったサンプルプログラム smp231_fit.mtpj -- CS+用プロジェクトファイル smp231_fit.rcpe -- Renesas共通プロジェクトファイル(e2studioインポート用) readme.txt ------- RX231用FIT対応サンプルプログラム補足説明書(本書) r_bsp~r_byteqはルネサスのRX Driver Packageのモジュールで、移植のための 変更を下記ソースに「// 201?-??-?? ...... by MiSPO」のコメントと共に施し てあります。 r_bsp\platform.h r_bsp\board\generic_rx231\hwsetup.c r_config\r_bsp_config.h r_config\r_sci_rx_config.h r_sci_rx\src\targets\rx231\r_sci_rx231.c ent_int.srcとsmp231_fit.cは、本サンプルプログラムで新規に作成したソース で、rx231.hとr0k505231.cとn4i231.cは、FIT対応のために改訂したソースです。 ■FITモジュールの組み込み方法 FITに付属のアプリケーションノート「CS+に組み込む方法」に記載の手順どおり に組み込み、次の「FITモジュールに含まれる割り込みハンドラの扱い」に従って、 割り込みハンドラをOS管理下の割り込みとして使えるように修正してください。 これ以外の注意点は特にございません。 ■FITモジュールに含まれる割り込みハンドラの扱い 次の例のように、FITモジュールの割り込みハンドラに、ient_int()/iret_int() の発行を追加してください。 extern void ient_int(void); extern void iret_int(void); static void sci5_eri5_isr(void *cb_args) { ient_int(); // 追加 eri_handler(&ch5_ctrl); iret_int(); // 〃 } NORTiの割り込みハンドラでは、ent_int()/ret_int()でレジスタの待避/復元を 行うと共にタスクの切り替えが実行されますが、FITモジュールの割り込みハン ドラでは、#pragma interruptでレジスタの待避/復元だけが行われます。そのた め、#pragma interruptと共に使えるient_int()/iret_int()を新たに設けました。 あるいは、ient_int()/iret_int()を使わず、FITモジュールの割り込みハンドラ をOSの管理外とすることもできます。具体的には、カーネルコンフィグレーショ ン用のKNL_LEVELマクロでデフォルトでは6に定義されているカーネルの割り込み 禁止レベルより、高優先としてください。ただし、この場合、割り込みハンドラ では一切のNORTiのシステムコールを発行できません。 ■FITモジュール以外の割り込みハンドラの扱い NORTiの方式の割り込みハンドラを、FITモジュールの方式の割り込みハンドラと 混在することができます。ただし、FITモジュールでは割り込みベクタテーブル がROMに固定されていることが前提ですので、def_inh()による割り込みハンドラ の登録ができません。 そこで、CC-RXの「プロジェクト・ツリー」の「CC-RX(ビルド・ツール)」にある 「リンク・オプション」タブで、「その他」の「その他の追加オプション」に、 -vectn=28=_inthdr,??=????, ... というように、割り込み番号と割り込みハン ドラを指定してください。本サンプルプログラムでは、OSが使用する周期タイマ として、コンペアマッチタイマのハンドラを、このように登録してあります。 ■セクション 本サンプルプログラムのセクションは、FITモジュールの方式を取り込んで以下 のように配置されていますが、NORTiで不要なユーザスタックのSUセクションと 割り込みスタックのSIセクションは、最小の4バイトとしてあります。 アドレス | セクション ------------+-------------------------------- 0x00000400 | B_1,R_1,B_2,R_2,B,R,STACK 0x0000FFF8 | SI,SU 0xFFF80000 | C_1,C_2,C,C$*,D*,P*,VECT,W*,L 0xFFFFFF80 | EXCEPTVECT 0xFFFFFFFC | RESETVECT NORTiがスタックとして使用するのはSTACKセクションで、この先頭アドレスから SUセクションの末尾(0x0000FFFF)までがスタック領域として使われます。すなわ ち、SUセクションは、リセットでスタックポインタの初期値を決めるためだけに 使用されます。一方、SIセクションは未使用ですが、FITモジュールでは省くこと ができないため、SUセクションの手前に配置してあります。
参考になりますか、どうか。
こちらの環境でも、ここに記載のRXは使用していませんが、方法は同じなので。
これから、異なる点としては、ベクタテーブルをDRAM上にコピーして使用している亊ぐらいです。
すいません、書き忘れました。
リンクオプションの -vectn= も使用していません。
ふぐりんです。NoMaYさんこんにちは。お返事いただき感激です。いつも拝見しています。なにか困って検索すると、だいたいかふぇルネでNoMaYさんが答えてありましたw
・NORTi体験版NORTiの体験版はないかもしれません。すいません。私はRX版のユーザで保守契約しています。開発情報の交換のためとはいえ、知ってることをどこまで書いて良いかちょっと迷うこともあるので、深い話(私のレベルですので浅い話かもしれませんが)することになるようならミスポさんに聞いてみようと思います。
・NORTiとFIT(CG)の共存方法ミスポさんの同様の対応は、私もよそで1件聞いてます。ミスポさんに共存させる問い合わせが来たときはdef_inhを使わない方法で統一されてるようですね。私は共存の件ではミスポさんに問い合わせてないですが、以前からチップドライバとかいろいろサポートしてもらっていて、誠実な対応に感謝しています。おそらくお客さんにとって最善の方法を考えられた結果だと思います。(でも私はdef_inh使いますがw)
・割込みベクタテーブル(INTBレジスタ設定)普通にNORTiを実装したら2か所でセットされると思います。(1)PowerON_Reset_PC() で C$VECTセクションの先頭(2)NORTiの初期化ルーチンで以下の3種類のうちの一つ(#defineで切替) (2)-1 NORTiが用意するRAMのベクタテーブル <-- default (2)-2 NORTiが用意するROMのベクタテーブル (2)-3 #defineで指定するアドレス(2)が後で実行されるので、何も指定が無ければ(2)-1 NORTiのRAMのテーブルになります。
ミスポさんのサンプルについてka.makiharaさんが添付されてる情報を見ると、コンパイラの-vectnオプションも使ってるので、C$VECTセクション(ROM)をそのまま使うようです。上記(2)全体を無効化する改変をしている(該当するファイル名があるようです)か、(2)-3で C$VECTセクションを再指定してるかのどちらかじゃないでしょうか。
ka.makiharaさんこんにちは。
情報ありがとうございます!FITの場合は#pragma interruptとまた違った対応なんですね。ent_int.srcをぜひ見たくなりました。私もFIT対応の参考にしたいのでミスポさんに問い合わせてみます。
過去のかふぇルネで「ミスポさんがFIT対応した」という話を見たんですが、ka.makiharaさんが入手されたサンプルとは別の話なんでしょうかね?これも問い合わせてみます。https://japan.renesasrulz.com/cafe_rene/f/forum5/7129/rx72n-i2c-data-clk/40810#40810
ふぐりん さん、ka.makiharaさん、こんにちは。NoMaYです。情報ありがとうございました。NORTiでの割り込みベクタテーブルの取り扱い方に何種類か種類があって、それらを使い分けるオプション(というか#define)が実際に存在していることがわかりました。ふぐりんさんへ、思ったのですが、ka.makiharaさんへ紹介した自作のフレームワーク的なものですけれども、中身を修正することで、CC-RX/FIT/CGが生成したC$VECTテーブルを経由させつつ、def_inh()で登録可能な関数を作成する、ということにも利用出来そうな気がしたのです。(アセンブラコードは技巧的で好き/嫌いはあるかも知れませんけれども。それと、実行される命令コードがテーブルを2回(C$VECTとNORTiのテーブルの2つ)介することにも好き/嫌いはあるかも知れませんけれども。)そうすれば、FIT/CGが生成したソースに手を入れなくても、def_inh()方式でやれるようになる?気がしたのです。NORTi V4のユーザーズマニュアルをウェブで探して見てみたのですが、ハンドラ関数はvoid hdr(void)の通常関数で良いのですよね?
5.11 割込み管理機能d e f _ i n h機能 割込みハンドラ定義形式 ER def_inh(INHNO inhno, const T_DINH *pk_dinh);inhno 割込みハンドラ番号pk_dinh 割込みハンドラ定義情報パケットへのポインタ
NoMaYさん、こんにちは。
とりあえず、作成していただいたコードをビルドしてみましたが、
NORTi_interrupt.c(16):E0552111:Symbol is undefined
static void (* const Int_Hook_Vectors[])(void);
void NORTi_INT_HOOK_init(void){ set_intb((void *)Int_Hook_Vectors);}
Int_Hook_Vectors が見つからない??
NoMaYさんの方ではできているので、何かビルド設定が必要ですか?
こちら、e2Studio, CC-RX V3.04 ですが。
ka.makiharaさん、こんにちは。NoMaYです。私もCC-RX V3.04です。(ただ、CS+ですけれども、それは関係無いでしょう。) プロジェクトの原型は、TB-RX140の公式のBlinkyサンプルプログラムにrcpcファイルが入っていたので、それを単にコンバートしてファイルを追加しただけだったのです。16行目は以下なのですが、すみません、ちょっと以下のどちらがエラーになっているのか調べてもらえないでしょうか?
set_intb((void *)Int_Hook_Vectors);
(A) 以下ではどうなりますか?
set_intb((void *)0);
(B) 以下ではどうなりますか?
void *p = (void *)Int_Hook_Vectors;