コードジェネレータに /* 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ファイルの選択の仕組みをご存じの方が見えましたら、情報をお願いします。
ka.makiharaさん、こんにちは。ふぐりん さんも、こんにちは。NoMaYです。修正してみました。今回、くだんのソースを参考にして、直接 _v3_ent_int と _v3_ret_int を使用するようにしてみました。以下に修正したNORTi_interrupt.cを添付しました。(ちなみに、M0520007:Unrecognized token は出ないようにしました。) 使い方は前回と同じです。あと、NORTi_interrupt.hですが前回と同じですけれども一緒に添付しました。なお、コードサイズ(割り込みベクタテーブル込み)が、2Kちょっと --> 3Kちょっと、へと増えました。[追記] 9:00 コメントに拙い間違いがありましたので直しました。(他にもちょっとだけコードも。)[ここまで追記]NORTi_interrupt.c
/* * NORTi_interrupt.c * * Created on: Jun 24, 2022 * Last Modified on: Jun 29, 2022 9:00 * Author: NoMaY * License: MIT */ #include "NORTi_interrupt.h" #include <machine.h> static void (* const Int_Hook_Vectors[])(void); void NORTi_INT_HOOK_init(void) { set_intb((void *)Int_Hook_Vectors); } static void dummy_NORTi_INT_HOOK(void) { // To prevent developers from being misled regarding the following inline assemble error. // E0552111:Symbol is undefined for(;;); } #pragma inline_asm INT_COMMON_nonOS static void INT_COMMON_nonOS(void) { XCHG [SP], R15 // the address of hook_entry_XXX --> R15 ADD #(- (__$hook_entry___0 + 7)), R15 // 7 = 4 * size of NOP + size of BSR.W SHLR #1, R15 ADD #TOPOF C$VECT, R15 // i.e. C$VECT + ((hook_entry_XXX - hook_entry___0) / 8) * 4 --> R15 MOV.L [R15], R15 XCHG [SP], R15 RTS // i.e. JMP [SP+] } #pragma inline_asm INT_COMMON_NORTi static void INT_COMMON_NORTi(void) { POP R15 // the address of hook_entry_XXX --> R15 ADD #(- (__$hook_entry___0 + 7)), R15 // 7 = size of BSR.A + size of BSR.W SHLR #1, R15 ADD #TOPOF C$VECT, R15 // i.e. C$VECT + ((hook_entry_XXX - hook_entry___0) / 8) * 4 --> R15 MOV.L [R15], R15 PUSHC PSW MOV.L #?+, R14 PUSH.L R14 JMP R15 // Program will return to the next label from the interrupt service routine by RTE. ?: BRA.A _v3_ret_int // Call NORTi API (in this case, jump to NORTi). } #pragma inline_asm INT_ENTRY_nonOS static void INT_ENTRY_nonOS(void) { NOP NOP NOP NOP BSR.W __$INT_COMMON_nonOS } #pragma inline_asm INT_ENTRY_NORTi static void INT_ENTRY_NORTi(void) { BSR.A _v3_ent_int // Call NORTi API. BSR.W __$INT_COMMON_NORTi } // Documents // https://www.mispo.co.jp/document/no4guid.pdf // https://www.renesas.com/jp/ja/document/mas/rx-family-rxv3-instruction-set-architecture-users-manual-software-rev100 // Labels and functions extern void v3_ent_int(void); extern void v3_ret_int (void); static void INT_COMMON_nonOS(void); static void INT_COMMON_NORTi(void); // To prevent the symbol from being optimized out. void * const dummy_NORTi_INT_enter = (void *)v3_ent_int; void * const dummy_NORTi_INT_return = (void *)v3_ret_int; void * const dummy_INT_COMMON_nonOS = (void *)INT_COMMON_nonOS; void * const dummy_INT_COMMON_NORTi = (void *)INT_COMMON_NORTi; // To prevent the section name symbol `C$VECT` from being optimized out. void * const dummy_VECTTBL = (void *)__sectop("C$VECT"); // To prevent a compile warning. void * const dummy2_NORTi_INT_HOOK = (void *)dummy_NORTi_INT_HOOK; // The code size of the following functions is just 8 bytes. // For nonOS // 00000000 03 NOP // 00000001 03 NOP // 00000002 03 NOP // 00000003 03 NOP // 00000004 39rrrr W BSR.W __$INT_COMMON_nonOS // 00000007 02 RTS // Not used. // For NORTi // 00000000 05rrrrrr A BSR.A _v3_ret_int // 00000004 39rrrr W BSR.W __$INT_COMMON_NORTi // 00000007 02 RTS // Not used. #define _INT_ENTRY(sel) INT_ENTRY_##sel() #define INT_ENTRY(sel) _INT_ENTRY(sel) static void hook_entry___0(void) { INT_ENTRY(INTERRUPT___0); } static void hook_entry___1(void) { INT_ENTRY(INTERRUPT___1); } static void hook_entry___2(void) { INT_ENTRY(INTERRUPT___2); } static void hook_entry___3(void) { INT_ENTRY(INTERRUPT___3); } static void hook_entry___4(void) { INT_ENTRY(INTERRUPT___4); } static void hook_entry___5(void) { INT_ENTRY(INTERRUPT___5); } static void hook_entry___6(void) { INT_ENTRY(INTERRUPT___6); } static void hook_entry___7(void) { INT_ENTRY(INTERRUPT___7); } static void hook_entry___8(void) { INT_ENTRY(INTERRUPT___8); } static void hook_entry___9(void) { INT_ENTRY(INTERRUPT___9); } static void hook_entry__10(void) { INT_ENTRY(INTERRUPT__10); } static void hook_entry__11(void) { INT_ENTRY(INTERRUPT__11); } static void hook_entry__12(void) { INT_ENTRY(INTERRUPT__12); } static void hook_entry__13(void) { INT_ENTRY(INTERRUPT__13); } static void hook_entry__14(void) { INT_ENTRY(INTERRUPT__14); } static void hook_entry__15(void) { INT_ENTRY(INTERRUPT__15); } static void hook_entry__16(void) { INT_ENTRY(INTERRUPT__16); } static void hook_entry__17(void) { INT_ENTRY(INTERRUPT__17); } static void hook_entry__18(void) { INT_ENTRY(INTERRUPT__18); } static void hook_entry__19(void) { INT_ENTRY(INTERRUPT__19); } static void hook_entry__20(void) { INT_ENTRY(INTERRUPT__20); } static void hook_entry__21(void) { INT_ENTRY(INTERRUPT__21); } static void hook_entry__22(void) { INT_ENTRY(INTERRUPT__22); } static void hook_entry__23(void) { INT_ENTRY(INTERRUPT__23); } static void hook_entry__24(void) { INT_ENTRY(INTERRUPT__24); } static void hook_entry__25(void) { INT_ENTRY(INTERRUPT__25); } static void hook_entry__26(void) { INT_ENTRY(INTERRUPT__26); } static void hook_entry__27(void) { INT_ENTRY(INTERRUPT__27); } static void hook_entry__28(void) { INT_ENTRY(INTERRUPT__28); } static void hook_entry__29(void) { INT_ENTRY(INTERRUPT__29); } static void hook_entry__30(void) { INT_ENTRY(INTERRUPT__30); } static void hook_entry__31(void) { INT_ENTRY(INTERRUPT__31); } static void hook_entry__32(void) { INT_ENTRY(INTERRUPT__32); } static void hook_entry__33(void) { INT_ENTRY(INTERRUPT__33); } static void hook_entry__34(void) { INT_ENTRY(INTERRUPT__34); } static void hook_entry__35(void) { INT_ENTRY(INTERRUPT__35); } static void hook_entry__36(void) { INT_ENTRY(INTERRUPT__36); } static void hook_entry__37(void) { INT_ENTRY(INTERRUPT__37); } static void hook_entry__38(void) { INT_ENTRY(INTERRUPT__38); } static void hook_entry__39(void) { INT_ENTRY(INTERRUPT__39); } static void hook_entry__40(void) { INT_ENTRY(INTERRUPT__40); } static void hook_entry__41(void) { INT_ENTRY(INTERRUPT__41); } static void hook_entry__42(void) { INT_ENTRY(INTERRUPT__42); } static void hook_entry__43(void) { INT_ENTRY(INTERRUPT__43); } static void hook_entry__44(void) { INT_ENTRY(INTERRUPT__44); } static void hook_entry__45(void) { INT_ENTRY(INTERRUPT__45); } static void hook_entry__46(void) { INT_ENTRY(INTERRUPT__46); } static void hook_entry__47(void) { INT_ENTRY(INTERRUPT__47); } static void hook_entry__48(void) { INT_ENTRY(INTERRUPT__48); } static void hook_entry__49(void) { INT_ENTRY(INTERRUPT__49); } static void hook_entry__50(void) { INT_ENTRY(INTERRUPT__50); } static void hook_entry__51(void) { INT_ENTRY(INTERRUPT__51); } static void hook_entry__52(void) { INT_ENTRY(INTERRUPT__52); } static void hook_entry__53(void) { INT_ENTRY(INTERRUPT__53); } static void hook_entry__54(void) { INT_ENTRY(INTERRUPT__54); } static void hook_entry__55(void) { INT_ENTRY(INTERRUPT__55); } static void hook_entry__56(void) { INT_ENTRY(INTERRUPT__56); } static void hook_entry__57(void) { INT_ENTRY(INTERRUPT__57); } static void hook_entry__58(void) { INT_ENTRY(INTERRUPT__58); } static void hook_entry__59(void) { INT_ENTRY(INTERRUPT__59); } static void hook_entry__60(void) { INT_ENTRY(INTERRUPT__60); } static void hook_entry__61(void) { INT_ENTRY(INTERRUPT__61); } static void hook_entry__62(void) { INT_ENTRY(INTERRUPT__62); } static void hook_entry__63(void) { INT_ENTRY(INTERRUPT__63); } static void hook_entry__64(void) { INT_ENTRY(INTERRUPT__64); } static void hook_entry__65(void) { INT_ENTRY(INTERRUPT__65); } static void hook_entry__66(void) { INT_ENTRY(INTERRUPT__66); } static void hook_entry__67(void) { INT_ENTRY(INTERRUPT__67); } static void hook_entry__68(void) { INT_ENTRY(INTERRUPT__68); } static void hook_entry__69(void) { INT_ENTRY(INTERRUPT__69); } static void hook_entry__70(void) { INT_ENTRY(INTERRUPT__70); } static void hook_entry__71(void) { INT_ENTRY(INTERRUPT__71); } static void hook_entry__72(void) { INT_ENTRY(INTERRUPT__72); } static void hook_entry__73(void) { INT_ENTRY(INTERRUPT__73); } static void hook_entry__74(void) { INT_ENTRY(INTERRUPT__74); } static void hook_entry__75(void) { INT_ENTRY(INTERRUPT__75); } static void hook_entry__76(void) { INT_ENTRY(INTERRUPT__76); } static void hook_entry__77(void) { INT_ENTRY(INTERRUPT__77); } static void hook_entry__78(void) { INT_ENTRY(INTERRUPT__78); } static void hook_entry__79(void) { INT_ENTRY(INTERRUPT__79); } static void hook_entry__80(void) { INT_ENTRY(INTERRUPT__80); } static void hook_entry__81(void) { INT_ENTRY(INTERRUPT__81); } static void hook_entry__82(void) { INT_ENTRY(INTERRUPT__82); } static void hook_entry__83(void) { INT_ENTRY(INTERRUPT__83); } static void hook_entry__84(void) { INT_ENTRY(INTERRUPT__84); } static void hook_entry__85(void) { INT_ENTRY(INTERRUPT__85); } static void hook_entry__86(void) { INT_ENTRY(INTERRUPT__86); } static void hook_entry__87(void) { INT_ENTRY(INTERRUPT__87); } static void hook_entry__88(void) { INT_ENTRY(INTERRUPT__88); } static void hook_entry__89(void) { INT_ENTRY(INTERRUPT__89); } static void hook_entry__90(void) { INT_ENTRY(INTERRUPT__90); } static void hook_entry__91(void) { INT_ENTRY(INTERRUPT__91); } static void hook_entry__92(void) { INT_ENTRY(INTERRUPT__92); } static void hook_entry__93(void) { INT_ENTRY(INTERRUPT__93); } static void hook_entry__94(void) { INT_ENTRY(INTERRUPT__94); } static void hook_entry__95(void) { INT_ENTRY(INTERRUPT__95); } static void hook_entry__96(void) { INT_ENTRY(INTERRUPT__96); } static void hook_entry__97(void) { INT_ENTRY(INTERRUPT__97); } static void hook_entry__98(void) { INT_ENTRY(INTERRUPT__98); } static void hook_entry__99(void) { INT_ENTRY(INTERRUPT__99); } static void hook_entry_100(void) { INT_ENTRY(INTERRUPT_100); } static void hook_entry_101(void) { INT_ENTRY(INTERRUPT_101); } static void hook_entry_102(void) { INT_ENTRY(INTERRUPT_102); } static void hook_entry_103(void) { INT_ENTRY(INTERRUPT_103); } static void hook_entry_104(void) { INT_ENTRY(INTERRUPT_104); } static void hook_entry_105(void) { INT_ENTRY(INTERRUPT_105); } static void hook_entry_106(void) { INT_ENTRY(INTERRUPT_106); } static void hook_entry_107(void) { INT_ENTRY(INTERRUPT_107); } static void hook_entry_108(void) { INT_ENTRY(INTERRUPT_108); } static void hook_entry_109(void) { INT_ENTRY(INTERRUPT_109); } static void hook_entry_110(void) { INT_ENTRY(INTERRUPT_110); } static void hook_entry_111(void) { INT_ENTRY(INTERRUPT_111); } static void hook_entry_112(void) { INT_ENTRY(INTERRUPT_112); } static void hook_entry_113(void) { INT_ENTRY(INTERRUPT_113); } static void hook_entry_114(void) { INT_ENTRY(INTERRUPT_114); } static void hook_entry_115(void) { INT_ENTRY(INTERRUPT_115); } static void hook_entry_116(void) { INT_ENTRY(INTERRUPT_116); } static void hook_entry_117(void) { INT_ENTRY(INTERRUPT_117); } static void hook_entry_118(void) { INT_ENTRY(INTERRUPT_118); } static void hook_entry_119(void) { INT_ENTRY(INTERRUPT_119); } static void hook_entry_120(void) { INT_ENTRY(INTERRUPT_120); } static void hook_entry_121(void) { INT_ENTRY(INTERRUPT_121); } static void hook_entry_122(void) { INT_ENTRY(INTERRUPT_122); } static void hook_entry_123(void) { INT_ENTRY(INTERRUPT_123); } static void hook_entry_124(void) { INT_ENTRY(INTERRUPT_124); } static void hook_entry_125(void) { INT_ENTRY(INTERRUPT_125); } static void hook_entry_126(void) { INT_ENTRY(INTERRUPT_126); } static void hook_entry_127(void) { INT_ENTRY(INTERRUPT_127); } static void hook_entry_128(void) { INT_ENTRY(INTERRUPT_128); } static void hook_entry_129(void) { INT_ENTRY(INTERRUPT_129); } static void hook_entry_130(void) { INT_ENTRY(INTERRUPT_130); } static void hook_entry_131(void) { INT_ENTRY(INTERRUPT_131); } static void hook_entry_132(void) { INT_ENTRY(INTERRUPT_132); } static void hook_entry_133(void) { INT_ENTRY(INTERRUPT_133); } static void hook_entry_134(void) { INT_ENTRY(INTERRUPT_134); } static void hook_entry_135(void) { INT_ENTRY(INTERRUPT_135); } static void hook_entry_136(void) { INT_ENTRY(INTERRUPT_136); } static void hook_entry_137(void) { INT_ENTRY(INTERRUPT_137); } static void hook_entry_138(void) { INT_ENTRY(INTERRUPT_138); } static void hook_entry_139(void) { INT_ENTRY(INTERRUPT_139); } static void hook_entry_140(void) { INT_ENTRY(INTERRUPT_140); } static void hook_entry_141(void) { INT_ENTRY(INTERRUPT_141); } static void hook_entry_142(void) { INT_ENTRY(INTERRUPT_142); } static void hook_entry_143(void) { INT_ENTRY(INTERRUPT_143); } static void hook_entry_144(void) { INT_ENTRY(INTERRUPT_144); } static void hook_entry_145(void) { INT_ENTRY(INTERRUPT_145); } static void hook_entry_146(void) { INT_ENTRY(INTERRUPT_146); } static void hook_entry_147(void) { INT_ENTRY(INTERRUPT_147); } static void hook_entry_148(void) { INT_ENTRY(INTERRUPT_148); } static void hook_entry_149(void) { INT_ENTRY(INTERRUPT_149); } static void hook_entry_150(void) { INT_ENTRY(INTERRUPT_150); } static void hook_entry_151(void) { INT_ENTRY(INTERRUPT_151); } static void hook_entry_152(void) { INT_ENTRY(INTERRUPT_152); } static void hook_entry_153(void) { INT_ENTRY(INTERRUPT_153); } static void hook_entry_154(void) { INT_ENTRY(INTERRUPT_154); } static void hook_entry_155(void) { INT_ENTRY(INTERRUPT_155); } static void hook_entry_156(void) { INT_ENTRY(INTERRUPT_156); } static void hook_entry_157(void) { INT_ENTRY(INTERRUPT_157); } static void hook_entry_158(void) { INT_ENTRY(INTERRUPT_158); } static void hook_entry_159(void) { INT_ENTRY(INTERRUPT_159); } static void hook_entry_160(void) { INT_ENTRY(INTERRUPT_160); } static void hook_entry_161(void) { INT_ENTRY(INTERRUPT_161); } static void hook_entry_162(void) { INT_ENTRY(INTERRUPT_162); } static void hook_entry_163(void) { INT_ENTRY(INTERRUPT_163); } static void hook_entry_164(void) { INT_ENTRY(INTERRUPT_164); } static void hook_entry_165(void) { INT_ENTRY(INTERRUPT_165); } static void hook_entry_166(void) { INT_ENTRY(INTERRUPT_166); } static void hook_entry_167(void) { INT_ENTRY(INTERRUPT_167); } static void hook_entry_168(void) { INT_ENTRY(INTERRUPT_168); } static void hook_entry_169(void) { INT_ENTRY(INTERRUPT_169); } static void hook_entry_170(void) { INT_ENTRY(INTERRUPT_170); } static void hook_entry_171(void) { INT_ENTRY(INTERRUPT_171); } static void hook_entry_172(void) { INT_ENTRY(INTERRUPT_172); } static void hook_entry_173(void) { INT_ENTRY(INTERRUPT_173); } static void hook_entry_174(void) { INT_ENTRY(INTERRUPT_174); } static void hook_entry_175(void) { INT_ENTRY(INTERRUPT_175); } static void hook_entry_176(void) { INT_ENTRY(INTERRUPT_176); } static void hook_entry_177(void) { INT_ENTRY(INTERRUPT_177); } static void hook_entry_178(void) { INT_ENTRY(INTERRUPT_178); } static void hook_entry_179(void) { INT_ENTRY(INTERRUPT_179); } static void hook_entry_180(void) { INT_ENTRY(INTERRUPT_180); } static void hook_entry_181(void) { INT_ENTRY(INTERRUPT_181); } static void hook_entry_182(void) { INT_ENTRY(INTERRUPT_182); } static void hook_entry_183(void) { INT_ENTRY(INTERRUPT_183); } static void hook_entry_184(void) { INT_ENTRY(INTERRUPT_184); } static void hook_entry_185(void) { INT_ENTRY(INTERRUPT_185); } static void hook_entry_186(void) { INT_ENTRY(INTERRUPT_186); } static void hook_entry_187(void) { INT_ENTRY(INTERRUPT_187); } static void hook_entry_188(void) { INT_ENTRY(INTERRUPT_188); } static void hook_entry_189(void) { INT_ENTRY(INTERRUPT_189); } static void hook_entry_190(void) { INT_ENTRY(INTERRUPT_190); } static void hook_entry_191(void) { INT_ENTRY(INTERRUPT_191); } static void hook_entry_192(void) { INT_ENTRY(INTERRUPT_192); } static void hook_entry_193(void) { INT_ENTRY(INTERRUPT_193); } static void hook_entry_194(void) { INT_ENTRY(INTERRUPT_194); } static void hook_entry_195(void) { INT_ENTRY(INTERRUPT_195); } static void hook_entry_196(void) { INT_ENTRY(INTERRUPT_196); } static void hook_entry_197(void) { INT_ENTRY(INTERRUPT_197); } static void hook_entry_198(void) { INT_ENTRY(INTERRUPT_198); } static void hook_entry_199(void) { INT_ENTRY(INTERRUPT_199); } static void hook_entry_200(void) { INT_ENTRY(INTERRUPT_200); } static void hook_entry_201(void) { INT_ENTRY(INTERRUPT_201); } static void hook_entry_202(void) { INT_ENTRY(INTERRUPT_202); } static void hook_entry_203(void) { INT_ENTRY(INTERRUPT_203); } static void hook_entry_204(void) { INT_ENTRY(INTERRUPT_204); } static void hook_entry_205(void) { INT_ENTRY(INTERRUPT_205); } static void hook_entry_206(void) { INT_ENTRY(INTERRUPT_206); } static void hook_entry_207(void) { INT_ENTRY(INTERRUPT_207); } static void hook_entry_208(void) { INT_ENTRY(INTERRUPT_208); } static void hook_entry_209(void) { INT_ENTRY(INTERRUPT_209); } static void hook_entry_210(void) { INT_ENTRY(INTERRUPT_210); } static void hook_entry_211(void) { INT_ENTRY(INTERRUPT_211); } static void hook_entry_212(void) { INT_ENTRY(INTERRUPT_212); } static void hook_entry_213(void) { INT_ENTRY(INTERRUPT_213); } static void hook_entry_214(void) { INT_ENTRY(INTERRUPT_214); } static void hook_entry_215(void) { INT_ENTRY(INTERRUPT_215); } static void hook_entry_216(void) { INT_ENTRY(INTERRUPT_216); } static void hook_entry_217(void) { INT_ENTRY(INTERRUPT_217); } static void hook_entry_218(void) { INT_ENTRY(INTERRUPT_218); } static void hook_entry_219(void) { INT_ENTRY(INTERRUPT_219); } static void hook_entry_220(void) { INT_ENTRY(INTERRUPT_220); } static void hook_entry_221(void) { INT_ENTRY(INTERRUPT_221); } static void hook_entry_222(void) { INT_ENTRY(INTERRUPT_222); } static void hook_entry_223(void) { INT_ENTRY(INTERRUPT_223); } static void hook_entry_224(void) { INT_ENTRY(INTERRUPT_224); } static void hook_entry_225(void) { INT_ENTRY(INTERRUPT_225); } static void hook_entry_226(void) { INT_ENTRY(INTERRUPT_226); } static void hook_entry_227(void) { INT_ENTRY(INTERRUPT_227); } static void hook_entry_228(void) { INT_ENTRY(INTERRUPT_228); } static void hook_entry_229(void) { INT_ENTRY(INTERRUPT_229); } static void hook_entry_230(void) { INT_ENTRY(INTERRUPT_230); } static void hook_entry_231(void) { INT_ENTRY(INTERRUPT_231); } static void hook_entry_232(void) { INT_ENTRY(INTERRUPT_232); } static void hook_entry_233(void) { INT_ENTRY(INTERRUPT_233); } static void hook_entry_234(void) { INT_ENTRY(INTERRUPT_234); } static void hook_entry_235(void) { INT_ENTRY(INTERRUPT_235); } static void hook_entry_236(void) { INT_ENTRY(INTERRUPT_236); } static void hook_entry_237(void) { INT_ENTRY(INTERRUPT_237); } static void hook_entry_238(void) { INT_ENTRY(INTERRUPT_238); } static void hook_entry_239(void) { INT_ENTRY(INTERRUPT_239); } static void hook_entry_240(void) { INT_ENTRY(INTERRUPT_240); } static void hook_entry_241(void) { INT_ENTRY(INTERRUPT_241); } static void hook_entry_242(void) { INT_ENTRY(INTERRUPT_242); } static void hook_entry_243(void) { INT_ENTRY(INTERRUPT_243); } static void hook_entry_244(void) { INT_ENTRY(INTERRUPT_244); } static void hook_entry_245(void) { INT_ENTRY(INTERRUPT_245); } static void hook_entry_246(void) { INT_ENTRY(INTERRUPT_246); } static void hook_entry_247(void) { INT_ENTRY(INTERRUPT_247); } static void hook_entry_248(void) { INT_ENTRY(INTERRUPT_248); } static void hook_entry_249(void) { INT_ENTRY(INTERRUPT_249); } static void hook_entry_250(void) { INT_ENTRY(INTERRUPT_250); } static void hook_entry_251(void) { INT_ENTRY(INTERRUPT_251); } static void hook_entry_252(void) { INT_ENTRY(INTERRUPT_252); } static void hook_entry_253(void) { INT_ENTRY(INTERRUPT_253); } static void hook_entry_254(void) { INT_ENTRY(INTERRUPT_254); } static void hook_entry_255(void) { INT_ENTRY(INTERRUPT_255); } static void (* const Int_Hook_Vectors[])(void) = { (void (*)(void))hook_entry___0, (void (*)(void))hook_entry___1, (void (*)(void))hook_entry___2, (void (*)(void))hook_entry___3, (void (*)(void))hook_entry___4, (void (*)(void))hook_entry___5, (void (*)(void))hook_entry___6, (void (*)(void))hook_entry___7, (void (*)(void))hook_entry___8, (void (*)(void))hook_entry___9, (void (*)(void))hook_entry__10, (void (*)(void))hook_entry__11, (void (*)(void))hook_entry__12, (void (*)(void))hook_entry__13, (void (*)(void))hook_entry__14, (void (*)(void))hook_entry__15, (void (*)(void))hook_entry__16, (void (*)(void))hook_entry__17, (void (*)(void))hook_entry__18, (void (*)(void))hook_entry__19, (void (*)(void))hook_entry__20, (void (*)(void))hook_entry__21, (void (*)(void))hook_entry__22, (void (*)(void))hook_entry__23, (void (*)(void))hook_entry__24, (void (*)(void))hook_entry__25, (void (*)(void))hook_entry__26, (void (*)(void))hook_entry__27, (void (*)(void))hook_entry__28, (void (*)(void))hook_entry__29, (void (*)(void))hook_entry__30, (void (*)(void))hook_entry__31, (void (*)(void))hook_entry__32, (void (*)(void))hook_entry__33, (void (*)(void))hook_entry__34, (void (*)(void))hook_entry__35, (void (*)(void))hook_entry__36, (void (*)(void))hook_entry__37, (void (*)(void))hook_entry__38, (void (*)(void))hook_entry__39, (void (*)(void))hook_entry__40, (void (*)(void))hook_entry__41, (void (*)(void))hook_entry__42, (void (*)(void))hook_entry__43, (void (*)(void))hook_entry__44, (void (*)(void))hook_entry__45, (void (*)(void))hook_entry__46, (void (*)(void))hook_entry__47, (void (*)(void))hook_entry__48, (void (*)(void))hook_entry__49, (void (*)(void))hook_entry__50, (void (*)(void))hook_entry__51, (void (*)(void))hook_entry__52, (void (*)(void))hook_entry__53, (void (*)(void))hook_entry__54, (void (*)(void))hook_entry__55, (void (*)(void))hook_entry__56, (void (*)(void))hook_entry__57, (void (*)(void))hook_entry__58, (void (*)(void))hook_entry__59, (void (*)(void))hook_entry__60, (void (*)(void))hook_entry__61, (void (*)(void))hook_entry__62, (void (*)(void))hook_entry__63, (void (*)(void))hook_entry__64, (void (*)(void))hook_entry__65, (void (*)(void))hook_entry__66, (void (*)(void))hook_entry__67, (void (*)(void))hook_entry__68, (void (*)(void))hook_entry__69, (void (*)(void))hook_entry__70, (void (*)(void))hook_entry__71, (void (*)(void))hook_entry__72, (void (*)(void))hook_entry__73, (void (*)(void))hook_entry__74, (void (*)(void))hook_entry__75, (void (*)(void))hook_entry__76, (void (*)(void))hook_entry__77, (void (*)(void))hook_entry__78, (void (*)(void))hook_entry__79, (void (*)(void))hook_entry__80, (void (*)(void))hook_entry__81, (void (*)(void))hook_entry__82, (void (*)(void))hook_entry__83, (void (*)(void))hook_entry__84, (void (*)(void))hook_entry__85, (void (*)(void))hook_entry__86, (void (*)(void))hook_entry__87, (void (*)(void))hook_entry__88, (void (*)(void))hook_entry__89, (void (*)(void))hook_entry__90, (void (*)(void))hook_entry__91, (void (*)(void))hook_entry__92, (void (*)(void))hook_entry__93, (void (*)(void))hook_entry__94, (void (*)(void))hook_entry__95, (void (*)(void))hook_entry__96, (void (*)(void))hook_entry__97, (void (*)(void))hook_entry__98, (void (*)(void))hook_entry__99, (void (*)(void))hook_entry_100, (void (*)(void))hook_entry_101, (void (*)(void))hook_entry_102, (void (*)(void))hook_entry_103, (void (*)(void))hook_entry_104, (void (*)(void))hook_entry_105, (void (*)(void))hook_entry_106, (void (*)(void))hook_entry_107, (void (*)(void))hook_entry_108, (void (*)(void))hook_entry_109, (void (*)(void))hook_entry_110, (void (*)(void))hook_entry_111, (void (*)(void))hook_entry_112, (void (*)(void))hook_entry_113, (void (*)(void))hook_entry_114, (void (*)(void))hook_entry_115, (void (*)(void))hook_entry_116, (void (*)(void))hook_entry_117, (void (*)(void))hook_entry_118, (void (*)(void))hook_entry_119, (void (*)(void))hook_entry_120, (void (*)(void))hook_entry_121, (void (*)(void))hook_entry_122, (void (*)(void))hook_entry_123, (void (*)(void))hook_entry_124, (void (*)(void))hook_entry_125, (void (*)(void))hook_entry_126, (void (*)(void))hook_entry_127, (void (*)(void))hook_entry_128, (void (*)(void))hook_entry_129, (void (*)(void))hook_entry_130, (void (*)(void))hook_entry_131, (void (*)(void))hook_entry_132, (void (*)(void))hook_entry_133, (void (*)(void))hook_entry_134, (void (*)(void))hook_entry_135, (void (*)(void))hook_entry_136, (void (*)(void))hook_entry_137, (void (*)(void))hook_entry_138, (void (*)(void))hook_entry_139, (void (*)(void))hook_entry_140, (void (*)(void))hook_entry_141, (void (*)(void))hook_entry_142, (void (*)(void))hook_entry_143, (void (*)(void))hook_entry_144, (void (*)(void))hook_entry_145, (void (*)(void))hook_entry_146, (void (*)(void))hook_entry_147, (void (*)(void))hook_entry_148, (void (*)(void))hook_entry_149, (void (*)(void))hook_entry_150, (void (*)(void))hook_entry_151, (void (*)(void))hook_entry_152, (void (*)(void))hook_entry_153, (void (*)(void))hook_entry_154, (void (*)(void))hook_entry_155, (void (*)(void))hook_entry_156, (void (*)(void))hook_entry_157, (void (*)(void))hook_entry_158, (void (*)(void))hook_entry_159, (void (*)(void))hook_entry_160, (void (*)(void))hook_entry_161, (void (*)(void))hook_entry_162, (void (*)(void))hook_entry_163, (void (*)(void))hook_entry_164, (void (*)(void))hook_entry_165, (void (*)(void))hook_entry_166, (void (*)(void))hook_entry_167, (void (*)(void))hook_entry_168, (void (*)(void))hook_entry_169, (void (*)(void))hook_entry_170, (void (*)(void))hook_entry_171, (void (*)(void))hook_entry_172, (void (*)(void))hook_entry_173, (void (*)(void))hook_entry_174, (void (*)(void))hook_entry_175, (void (*)(void))hook_entry_176, (void (*)(void))hook_entry_177, (void (*)(void))hook_entry_178, (void (*)(void))hook_entry_179, (void (*)(void))hook_entry_180, (void (*)(void))hook_entry_181, (void (*)(void))hook_entry_182, (void (*)(void))hook_entry_183, (void (*)(void))hook_entry_184, (void (*)(void))hook_entry_185, (void (*)(void))hook_entry_186, (void (*)(void))hook_entry_187, (void (*)(void))hook_entry_188, (void (*)(void))hook_entry_189, (void (*)(void))hook_entry_190, (void (*)(void))hook_entry_191, (void (*)(void))hook_entry_192, (void (*)(void))hook_entry_193, (void (*)(void))hook_entry_194, (void (*)(void))hook_entry_195, (void (*)(void))hook_entry_196, (void (*)(void))hook_entry_197, (void (*)(void))hook_entry_198, (void (*)(void))hook_entry_199, (void (*)(void))hook_entry_200, (void (*)(void))hook_entry_201, (void (*)(void))hook_entry_202, (void (*)(void))hook_entry_203, (void (*)(void))hook_entry_204, (void (*)(void))hook_entry_205, (void (*)(void))hook_entry_206, (void (*)(void))hook_entry_207, (void (*)(void))hook_entry_208, (void (*)(void))hook_entry_209, (void (*)(void))hook_entry_210, (void (*)(void))hook_entry_211, (void (*)(void))hook_entry_212, (void (*)(void))hook_entry_213, (void (*)(void))hook_entry_214, (void (*)(void))hook_entry_215, (void (*)(void))hook_entry_216, (void (*)(void))hook_entry_217, (void (*)(void))hook_entry_218, (void (*)(void))hook_entry_219, (void (*)(void))hook_entry_220, (void (*)(void))hook_entry_221, (void (*)(void))hook_entry_222, (void (*)(void))hook_entry_223, (void (*)(void))hook_entry_224, (void (*)(void))hook_entry_225, (void (*)(void))hook_entry_226, (void (*)(void))hook_entry_227, (void (*)(void))hook_entry_228, (void (*)(void))hook_entry_229, (void (*)(void))hook_entry_230, (void (*)(void))hook_entry_231, (void (*)(void))hook_entry_232, (void (*)(void))hook_entry_233, (void (*)(void))hook_entry_234, (void (*)(void))hook_entry_235, (void (*)(void))hook_entry_236, (void (*)(void))hook_entry_237, (void (*)(void))hook_entry_238, (void (*)(void))hook_entry_239, (void (*)(void))hook_entry_240, (void (*)(void))hook_entry_241, (void (*)(void))hook_entry_242, (void (*)(void))hook_entry_243, (void (*)(void))hook_entry_244, (void (*)(void))hook_entry_245, (void (*)(void))hook_entry_246, (void (*)(void))hook_entry_247, (void (*)(void))hook_entry_248, (void (*)(void))hook_entry_249, (void (*)(void))hook_entry_250, (void (*)(void))hook_entry_251, (void (*)(void))hook_entry_252, (void (*)(void))hook_entry_253, (void (*)(void))hook_entry_254, (void (*)(void))hook_entry_255 };
/* * NORTi_interrupt.h * * Created on: Jun 24, 2022 * Author: NoMaY * License: MIT */ #ifndef NORTI_INTERRUPT_H_ #define NORTI_INTERRUPT_H_ // 28 _r_Config_CMT0_cmi0_interrupt #define INTERRUPT___0 nonOS #define INTERRUPT___1 nonOS #define INTERRUPT___2 nonOS #define INTERRUPT___3 nonOS #define INTERRUPT___4 nonOS #define INTERRUPT___5 nonOS #define INTERRUPT___6 nonOS #define INTERRUPT___7 nonOS #define INTERRUPT___8 nonOS #define INTERRUPT___9 nonOS #define INTERRUPT__10 nonOS #define INTERRUPT__11 nonOS #define INTERRUPT__12 nonOS #define INTERRUPT__13 nonOS #define INTERRUPT__14 nonOS #define INTERRUPT__15 nonOS #define INTERRUPT__16 nonOS #define INTERRUPT__17 nonOS #define INTERRUPT__18 nonOS #define INTERRUPT__19 nonOS #define INTERRUPT__20 nonOS #define INTERRUPT__21 nonOS #define INTERRUPT__22 nonOS #define INTERRUPT__23 nonOS #define INTERRUPT__24 nonOS #define INTERRUPT__25 nonOS #define INTERRUPT__26 nonOS #define INTERRUPT__27 nonOS #define INTERRUPT__28 NORTi // _r_Config_CMT0_cmi0_interrupt #define INTERRUPT__29 nonOS #define INTERRUPT__30 nonOS #define INTERRUPT__31 nonOS #define INTERRUPT__32 nonOS #define INTERRUPT__33 nonOS #define INTERRUPT__34 nonOS #define INTERRUPT__35 nonOS #define INTERRUPT__36 nonOS #define INTERRUPT__37 nonOS #define INTERRUPT__38 nonOS #define INTERRUPT__39 nonOS #define INTERRUPT__40 nonOS #define INTERRUPT__41 nonOS #define INTERRUPT__42 nonOS #define INTERRUPT__43 nonOS #define INTERRUPT__44 nonOS #define INTERRUPT__45 nonOS #define INTERRUPT__46 nonOS #define INTERRUPT__47 nonOS #define INTERRUPT__48 nonOS #define INTERRUPT__49 nonOS #define INTERRUPT__50 nonOS #define INTERRUPT__51 nonOS #define INTERRUPT__52 nonOS #define INTERRUPT__53 nonOS #define INTERRUPT__54 nonOS #define INTERRUPT__55 nonOS #define INTERRUPT__56 nonOS #define INTERRUPT__57 nonOS #define INTERRUPT__58 nonOS #define INTERRUPT__59 nonOS #define INTERRUPT__60 nonOS #define INTERRUPT__61 nonOS #define INTERRUPT__62 nonOS #define INTERRUPT__63 nonOS #define INTERRUPT__64 nonOS #define INTERRUPT__65 nonOS #define INTERRUPT__66 nonOS #define INTERRUPT__67 nonOS #define INTERRUPT__68 nonOS #define INTERRUPT__69 nonOS #define INTERRUPT__70 nonOS #define INTERRUPT__71 nonOS #define INTERRUPT__72 nonOS #define INTERRUPT__73 nonOS #define INTERRUPT__74 nonOS #define INTERRUPT__75 nonOS #define INTERRUPT__76 nonOS #define INTERRUPT__77 nonOS #define INTERRUPT__78 nonOS #define INTERRUPT__79 nonOS #define INTERRUPT__80 nonOS #define INTERRUPT__81 nonOS #define INTERRUPT__82 nonOS #define INTERRUPT__83 nonOS #define INTERRUPT__84 nonOS #define INTERRUPT__85 nonOS #define INTERRUPT__86 nonOS #define INTERRUPT__87 nonOS #define INTERRUPT__88 nonOS #define INTERRUPT__89 nonOS #define INTERRUPT__90 nonOS #define INTERRUPT__91 nonOS #define INTERRUPT__92 nonOS #define INTERRUPT__93 nonOS #define INTERRUPT__94 nonOS #define INTERRUPT__95 nonOS #define INTERRUPT__96 nonOS #define INTERRUPT__97 nonOS #define INTERRUPT__98 nonOS #define INTERRUPT__99 nonOS #define INTERRUPT_100 nonOS #define INTERRUPT_101 nonOS #define INTERRUPT_102 nonOS #define INTERRUPT_103 nonOS #define INTERRUPT_104 nonOS #define INTERRUPT_105 nonOS #define INTERRUPT_106 nonOS #define INTERRUPT_107 nonOS #define INTERRUPT_108 nonOS #define INTERRUPT_109 nonOS #define INTERRUPT_110 nonOS #define INTERRUPT_111 nonOS #define INTERRUPT_112 nonOS #define INTERRUPT_113 nonOS #define INTERRUPT_114 nonOS #define INTERRUPT_115 nonOS #define INTERRUPT_116 nonOS #define INTERRUPT_117 nonOS #define INTERRUPT_118 nonOS #define INTERRUPT_119 nonOS #define INTERRUPT_120 nonOS #define INTERRUPT_121 nonOS #define INTERRUPT_122 nonOS #define INTERRUPT_123 nonOS #define INTERRUPT_124 nonOS #define INTERRUPT_125 nonOS #define INTERRUPT_126 nonOS #define INTERRUPT_127 nonOS #define INTERRUPT_128 nonOS #define INTERRUPT_129 nonOS #define INTERRUPT_130 nonOS #define INTERRUPT_131 nonOS #define INTERRUPT_132 nonOS #define INTERRUPT_133 nonOS #define INTERRUPT_134 nonOS #define INTERRUPT_135 nonOS #define INTERRUPT_136 nonOS #define INTERRUPT_137 nonOS #define INTERRUPT_138 nonOS #define INTERRUPT_139 nonOS #define INTERRUPT_140 nonOS #define INTERRUPT_141 nonOS #define INTERRUPT_142 nonOS #define INTERRUPT_143 nonOS #define INTERRUPT_144 nonOS #define INTERRUPT_145 nonOS #define INTERRUPT_146 nonOS #define INTERRUPT_147 nonOS #define INTERRUPT_148 nonOS #define INTERRUPT_149 nonOS #define INTERRUPT_150 nonOS #define INTERRUPT_151 nonOS #define INTERRUPT_152 nonOS #define INTERRUPT_153 nonOS #define INTERRUPT_154 nonOS #define INTERRUPT_155 nonOS #define INTERRUPT_156 nonOS #define INTERRUPT_157 nonOS #define INTERRUPT_158 nonOS #define INTERRUPT_159 nonOS #define INTERRUPT_160 nonOS #define INTERRUPT_161 nonOS #define INTERRUPT_162 nonOS #define INTERRUPT_163 nonOS #define INTERRUPT_164 nonOS #define INTERRUPT_165 nonOS #define INTERRUPT_166 nonOS #define INTERRUPT_167 nonOS #define INTERRUPT_168 nonOS #define INTERRUPT_169 nonOS #define INTERRUPT_170 nonOS #define INTERRUPT_171 nonOS #define INTERRUPT_172 nonOS #define INTERRUPT_173 nonOS #define INTERRUPT_174 nonOS #define INTERRUPT_175 nonOS #define INTERRUPT_176 nonOS #define INTERRUPT_177 nonOS #define INTERRUPT_178 nonOS #define INTERRUPT_179 nonOS #define INTERRUPT_180 nonOS #define INTERRUPT_181 nonOS #define INTERRUPT_182 nonOS #define INTERRUPT_183 nonOS #define INTERRUPT_184 nonOS #define INTERRUPT_185 nonOS #define INTERRUPT_186 nonOS #define INTERRUPT_187 nonOS #define INTERRUPT_188 nonOS #define INTERRUPT_189 nonOS #define INTERRUPT_190 nonOS #define INTERRUPT_191 nonOS #define INTERRUPT_192 nonOS #define INTERRUPT_193 nonOS #define INTERRUPT_194 nonOS #define INTERRUPT_195 nonOS #define INTERRUPT_196 nonOS #define INTERRUPT_197 nonOS #define INTERRUPT_198 nonOS #define INTERRUPT_199 nonOS #define INTERRUPT_200 nonOS #define INTERRUPT_201 nonOS #define INTERRUPT_202 nonOS #define INTERRUPT_203 nonOS #define INTERRUPT_204 nonOS #define INTERRUPT_205 nonOS #define INTERRUPT_206 nonOS #define INTERRUPT_207 nonOS #define INTERRUPT_208 nonOS #define INTERRUPT_209 nonOS #define INTERRUPT_210 nonOS #define INTERRUPT_211 nonOS #define INTERRUPT_212 nonOS #define INTERRUPT_213 nonOS #define INTERRUPT_214 nonOS #define INTERRUPT_215 nonOS #define INTERRUPT_216 nonOS #define INTERRUPT_217 nonOS #define INTERRUPT_218 nonOS #define INTERRUPT_219 nonOS #define INTERRUPT_220 nonOS #define INTERRUPT_221 nonOS #define INTERRUPT_222 nonOS #define INTERRUPT_223 nonOS #define INTERRUPT_224 nonOS #define INTERRUPT_225 nonOS #define INTERRUPT_226 nonOS #define INTERRUPT_227 nonOS #define INTERRUPT_228 nonOS #define INTERRUPT_229 nonOS #define INTERRUPT_230 nonOS #define INTERRUPT_231 nonOS #define INTERRUPT_232 nonOS #define INTERRUPT_233 nonOS #define INTERRUPT_234 nonOS #define INTERRUPT_235 nonOS #define INTERRUPT_236 nonOS #define INTERRUPT_237 nonOS #define INTERRUPT_238 nonOS #define INTERRUPT_239 nonOS #define INTERRUPT_240 nonOS #define INTERRUPT_241 nonOS #define INTERRUPT_242 nonOS #define INTERRUPT_243 nonOS #define INTERRUPT_244 nonOS #define INTERRUPT_245 nonOS #define INTERRUPT_246 nonOS #define INTERRUPT_247 nonOS #define INTERRUPT_248 nonOS #define INTERRUPT_249 nonOS #define INTERRUPT_250 nonOS #define INTERRUPT_251 nonOS #define INTERRUPT_252 nonOS #define INTERRUPT_253 nonOS #define INTERRUPT_254 nonOS #define INTERRUPT_255 nonOS #endif /* NORTI_INTERRUPT_H_ */
ふぐりんです。
NoMaYさん拝見しました。すばらしい!まだ実機で試してませんが、たぶんこれでFIT側は改変せずにコールバックなどでNORTiが使えますね。ありがとうございます!じつは、昨晩知り合いと電話で雑談しててこの話になったんですが、彼もFITを改変せずにNORTiと同居させてるというではありませんか!(知り合いとは武雄市の古川制御さんです。わたしと違ってFIT推進派w)彼も「簡易的ですけどね」とは言ってるのでNoMaYさんほどがっつり全機能対応できてるわけではないようです。
ここで話して良いってお許しもらったので簡単にご説明すると・・要はFreeRTOSでやってるようなソフト割込みの応用です。割込みの最下位レベルでソフト割込みを定義。その割込みルーチンだけNORTi対応にします。で、FITの割込みから呼ばれたコールバック等でNORTiのiwup_tskとかisig_simとかやりたくなったら、そのことをFIFOバッファに記録してソフト割込みをトリガします。(この時点ではNORTiは呼びません)その後、一連の割込みが済んでタスクレベルに戻る直前にソフト割込みルーチンがNORTi対応モードで呼ばれますから、そこでFIFOバッファにたまってたNORTi処理要求を全部こなします。どうでしょう?いやー昨晩の古川制御さんも今朝のNoMaYさんも興奮しましたw(NoMaYさんの立てた別スレッドに書いたほうがよかったですかね?)
ふぐりん さん、こんにちは。NoMaYです。情報ありがとうございます。それを聞いて、FITのAPIで気になるAPIがあったことを思い出しましたので、ちょっと調べて、後でリプライしようかと思います。あと、修正している時には気付いてなかったのですけれども、ひょっとして、 _v3_ent_int と _v3_ret_int は、先頭に v3_ が付いていますけれども、中身は ent_int() と ret_int() と共通(同じもの)なのでしょうかね、、、そうであれば、hook_entry_XXX() そのままで def_inh() で登録出来てしまいそうな気がしました。また、そうでなくても、ラベルを置き換えるだけで良さそうな気がしました。(もっとも、その前に、実機で動くかな?、というのがありますけれども。)
NoMaYさん、ふぐりんさん、こんにちは。
実機動作確認しました。
FIT、CG両方とも動作しています。
CMT0,CMT1 -> FIT
IRQ15 -> CG でテストしてみました。
ふぐりんです。ka.makiharaさん、NoMaYさんこんにちは。
ka.makiharaさん。実機確認ありがとうございます!あとで私も続きます。が・・ちょっとお時間くださいw
NoMaYさん。def_inh()はRAMのベクタテーブルをいじると思うので・・と考えてたんですが、NoMaYさんの言ってることが今わかりましたwそうですね!いけると思います。たぶん。要するにInt_Hook_Vectors[]の代わりにNORTi管理のRAM上のベクタテーブルを使うってことですよね。
その前の話ですが、ent_int()/ret_int()は #define でいろいろ切り替えてるようですがCC-RXで FIT対応版の「くだんのソース」の利用環境なら _v3_xxx と考えていいと思います。(うーん間違ってたらごめんなさい。でもたぶん大丈夫。ユーザはソースで確認してください)
NoMayさんあれから考えてたんですが、NORTi管理のdef_inh()が使えるとミスポさん提供や自作のドライバとかもそのまま使えるので便利ですね。FITとNORTi系ドライバが共存するなんてすごいですw
「hook_entry_XXX() そのままで def_inh() で登録」というのは、おそらくこんな運用ですか?
(1)NORTiの初期化 NORTi管理のRAM上のベクタテーブルがINTBに登録される(default) (NORTi_INT_HOOK_init()は呼ばない)
(2)FIT/CGの割込みをすべて登録 def_inh()で hook_entry_XXX を登録 NORTi対応/非対応をNORTi_interrupt.hで指定しておく。 #pragma interruptや -vectn で登録してるが def_inh() してない割込み処理は実行されない
(3)NORTi推奨方式の割込みも併用可能 def_inh()で void hdr_XXX(void) を登録 void hdr_XXX(void) にはNORTi推奨方式で ent_int/ret_int を入れて作成。
で、これを頭の中で考えるためにメモしたので置きます。もしかしたら皆さんの参考になるかもしれないので・・まちがってたらすいません。
NoMaYさんのフレームワーク( Int_Hook_Vectors[]方式の場合 )についてのメモ (2022.06.29 ふぐりん) ---------- ベクタテーブルは以下の2つ ---------- 1. C$VECT (ROMエリア) コンパイラが管理する本来のベクタテーブル。 #pragma interrupt や -vetcn により割込みルーチンが登録される。 プログラム開始時にINTBレジスタに登録されるが、NORTi_INT_HOOK_init()によってINTBレジスタの登録は解除される。 その後は、INT_COMMON_xxx()で 本来の割込みルーチンのアドレス一覧として参照される。 2. Int_Hook_Vectors[] (ROMエリア) NoMaYさんのフレームワークが管理するベクタテーブル。 割込みベクタごとにNORTi対応ラッパーか非対応ラッパー(INT_ENTRY_xxx)が登録される。(どちらになるかはNORTi_interrupt.hで定義) プログラム開始直後にNORTi_INT_HOOK_init()によって INTBレジスタに登録される。 その後は、割込みがかかったとき、NORTi対応ラッパーでは v3_ent_int()/v3_ret_int() を使った割込み処理を行い、非対応ラッパーは通常の割込み処理を行う。 ---------- ラッパーが呼ばれたときの割込み番号を検出する方法 ---------- hook_entry___0()から割込み番号の順番にみっちり隙間なく登録された関数の先頭からの相対アドレスから番号を割り出す。 ---------- ケースごとのレジスタ保存/復元(概念) ---------- NORTi対応ラッパー経由(INT_ENTRY_NORTi) #pragma interrupt 定義の割込みルーチン(FIT/CGでNORTi使うときはこっち) 発生時 +PC/PSW ラッパーのv3_ent_int +割込み時レジスタ保存(NORTi) ラッパーがシミュレーション +PC/PSW 割込みルーチンの入口 +割込み時レジスタ保存(CC-RX) 割込みルーチンの出口 -割込み時レジスタ復元(CC-RX) 割込みルーチンのRTE -PC/PSW (ラッパーに戻るだけ) ラッパーのv3_ret_int -割込み時レジスタ復元(NORTi) ラッパーのv3_ret_intのRTE -PC/PSW (割込みから復帰) NORTi非対応ラッパー経由(INT_ENTRY_nonOS) #pragma interrupt 定義の割込みルーチン(この中でNORTi使えません) 発生時 +PC/PSW 割込みルーチンの入口 +割込み時レジスタ保存(CC-RX) 割込みルーチンの出口 -割込み時レジスタ復元(CC-RX) 割込みルーチンのRTE -PC/PSW (割込みから復帰) -vectn 登録の割込みルーチン(void hdr(void)でent_int/ret_int使用) 発生時 +PC/PSW 割込みルーチンのent_int +割込み時レジスタ保存(NORTi) 割込みルーチンのret_int -割込み時レジスタ復元(NORTi) 割込みルーチンのret_intのRTE -PC/PSW (割込みから復帰)
ふぐりん さん、こんにちは。NoMaYです。リプライを貰ってからモヤモヤしていたのですが、どうも以下の赤文字の場合に対するNORTi_interrupt.hでの指定方法が直感に反していましたね。正直、考慮漏れです。割り込みとして指定出来るタイプとして、nonOSとNORTiの2つを用意していたのですけれども、以下のような3つにしておいた方が良かったかなぁ、と思ったりしています。nonOSNORTi_FIT_CGNORTi_NATIVE <-- 処理としてはnonOSと全く一緒あるいは、こういう対処にしてしまうのも、作業はちょっと面倒にはなりますが、発想的には分かり易いかも、と思ったりもしました。(もっとも、hdr()がstatic宣言されていなくてグローバルであれば、ですけれども。)
static void (* const Int_Hook_Vectors[])(void) ={ (void (*)(void))hook_entry___0, (void (*)(void))hook_entry___1, (void (*)(void))hook_entry___2, (void (*)(void))hook_entry___3, 略 (void (*)(void))hook_entry__27, (void (*)(void))hdr, <-- いっそココに書いてしまう (void (*)(void))hook_entry__29, 略 (void (*)(void))hook_entry_255};
以下、添付されていたファイルからの抜粋です。(赤文字の場合に対するNORTi_interrupt.hでの指定方法が直感に反していましたね。)
----------ケースごとのレジスタ保存/復元(概念)----------NORTi対応ラッパー経由(INT_ENTRY_NORTi) #pragma interrupt 定義の割込みルーチン(FIT/CGでNORTi使うときはこっち)略NORTi非対応ラッパー経由(INT_ENTRY_nonOS) #pragma interrupt 定義の割込みルーチン(この中でNORTi使えません)略 -vectn 登録の割込みルーチン(void hdr(void)でent_int/ret_int使用)略
あと、以下については、その通りです。ちょっと注意点は、コンパイラの最適化オプションとして、未使用の変数/関数を削除する最適化を行う、という設定になっていると、リンク後にhook_entry_XXX()が歯抜けになる可能性があるので、少なくともNORTi_interrupt.cには-goptimizeを指定しない、といった対処が必要になるかと思います。> 要するにInt_Hook_Vectors[]の代わりにNORTi管理のRAM上のベクタテーブルを使うってことですよね。> 「hook_entry_XXX() そのままで def_inh() で登録」というのは、おそらくこんな運用ですか?
ふぐりんですNoMaYさんこんにちは。
NoMaY said:NORTi_NATIVE <-- 処理としてはnonOSと全く一緒
モヤモヤさせてすいません。じつは私もあれ書きながら似たようなこと考えてましたw
NoMaY said:(void (*)(void))hdr, <-- いっそココに書いてしまう
この案もよさそうですね。
NoMaY said:あと、以下については、その通りです。ちょっと注意点は、コンパイラの最適化オプションとして、未使用の変数/関数を削除する最適化を行う、という設定になっていると、リンク後にhook_entry_XXX()が歯抜けになる可能性があるので、少なくともNORTi_interrupt.cには-goptimizeを指定しない、といった対処が必要になるかと思います。
そういう罠があるとは・・知りませんでした。なにはともあれ。NoMaYさん本当にありがとうございます。おかげさまでFIT/CGをNORTiと同居させるというテーマについて、かなり見通しが開けてきたと思います。本来はNORTiユーザが頑張らないといけないのですが・・まだまだ力が及ばずすいません。(ka.makiharaさんのスレッドでこんな語りをやってしまって、ka.makiharaさんにも申し訳ありません)ちょっと今多くは動けないのですが、そのうちまとめたり実験したりしてお知らせしたいと思います。
ふぐりん さん、こんにちは。NoMaYです。実験のネタになるかどうか分かりませんけれども、昨日ちょっと書いたFITのAPIで気になるAPIというのは、以下の画面コピーの通りのソフトウェア割り込み制御APIです。(タスクという言葉が用いられていますけれども、RTOSのタスクを対象としているのでは無いみたいです。もうちょっと素朴に、関数ポインタと引数ポインタのペアのことみたいです。) このAPIは、(今回のことで意義は薄れてしまいましたけれども)昨日のお話のような用途にも使えるかも知れないのと、以下の画面コピーの最初のNORTiのマニュアルに書かれている小技に使えるかも知れないです。RXファミリ ボードサポートパッケージモジュール Firmware Integration Technologywww.renesas.com/document/apn/rx-family-board-support-package-module-using-firmware-integration-technology-rev710
5.25 R_BSP_SoftwareInterruptOpen()5.26 R_BSP_SoftwareInterruptClose()5.27 R_BSP_SoftwareInterruptSetTask()5.28 R_BSP_SoftwareInterruptControl()
GitHub上のソースgithub.com/renesas/rx-driver-package/blob/master/source/r_bsp/r_bsp_vx.xx/r_bsp/mcu/all/r_bsp_software_interrupt.cgithub.com/renesas/rx-driver-package/blob/master/source/r_bsp/r_bsp_vx.xx/r_bsp/mcu/all/r_bsp_software_interrupt.hNORTi V4 カーネル編 ユーザーズガイドwww.mispo.co.jp/document/no4guid.pdf画面コピー[追記]ただ、ちょっと大掛かり過ぎかも、みたいな感もあって、CGのAPIで簡素なものを自作した方がやり易いかも、、、スマート・コンフィグレータ ユーザーズマニュアル RX APIリファレンスwww.renesas.com/document/mat/smart-configurator-users-manual-rx-api-reference画面コピー
ふぐりんですNoMaYさんこんばんは。
NoMaY said:実験のネタになるかどうか分かりませんけれども、昨日ちょっと書いたFITのAPIで気になるAPIというのは、以下の画面コピーの通りのソフトウェア割り込み制御APIです。(タスクという言葉が用いられていますけれども、RTOSのタスクを対象としているのでは無いみたいです。もうちょっと素朴に、関数ポインタと引数ポインタのペアのことみたいです。) このAPIは、(今回のことで意義は薄れてしまいましたけれども)昨日のお話のような用途にも使えるかも知れないのと、以下の画面コピーの最初のNORTiのマニュアルに書かれている小技に使えるかも知れないです。
スマートコンフィグレータのBSPにソフトウェア割込みの項目があったのは知ってたんですが、何に使うんだろうぐらいしか思ってませんでした。こういう事だったんですね!じつはRXシリーズ出る前にほぼ同じことをタイマ割込み使ってやってたのを思い出しました。OS無しの運用で、最低割込みレベルの超短いタイマ割込みをおこして多重割込み許可で長い処理させてました。処理内容は固定でしたが。そのとき私も「裏タスク」って命名してました。なので「うんうんわかる!わかるぞー!」と思いながらそのAPI読みましたwあとNORTiの小技的には、あの「ソフト割込み使ったFITとNORTiの同居」(古川制御方式)の場合、
割り込みレベルの高い順に
FIT/CGの割込みレベルNORTiのカーネル割込み禁止レベルNORTi使ったドライバなどの割込みレベルソフトウェア割り込み(最低の割込みレベル)
としたほうが、FIT/CGがNORTiに邪魔されなくて高速に動けるってことでしょうか。要検討ですかね。
NoMaY said:ただ、ちょっと大掛かり過ぎかも、みたいな感もあって、CGのAPIで簡素なものを自作した方がやり易いかも、、、
ですねえ。私もそう思います。