Everything
3.7 RTOS割り込みハンドラ

CA78K0Rの#pragma rtos_interruptおよびキーワード__rtos_interruptを,CC-RLの#pragma rtos_interruptに変換します。

 

CA78K0Rの書式は以下の通りです。

#pragma rtos_interrupt [割り込み要求名 関数名]

または

__rtos_interrupt 関数宣言

 

CC-RLの書式は以下の通りです。

#pragma rtos_interrupt [(]関数名[(vect=アドレス)][)]

関数宣言

 

-

割り込み要求名が存在する場合は,#include “iodefine.h”を出力します。

-

__rtos_interruptは#pragma rtos_interruptに変換します。

-

「割り込み要求名」は,アドレスを示すマクロとして「vect=アドレス」に変換します。マクロの値はiodefine.hで定義されます。

-

CA78K0Rの書式では関数名を省略可能であり,RTOS割り込みハンドラが使用するret_int, _kernel_int_entryをユーザが定義できないようにする機能があります。同じ機能はCC-RLには存在しないため,割り込み要求名と関数名が省略された場合はメッセージを出力し,#pragma指令をコメントアウトします。

-

__rtos_interruptキーワードを用いた割り込み関数の宣言や定義にマクロやtypedefを使用した場合,関数名の判断を誤る可能性があります。予めマクロやtypedefを展開してから変換してください。

-

同一関数に対するpragma指令とキーワードによる割り込み関数の記述がある場合,どちらも#pragma指令に変換することで,変換後に#pragma指令が重複してCC-RLではコンパイル・エラーとなります。この場合は,重複する記述を削除してください。

-

__rtos_interruptキーワードを指定した関数宣言の引数を省略した場合,CC-RLではコンパイル・エラーとなります。引数の型としてvoid型を記述してください。

 

[例]

パターン1

変換前

#pragma rtos_interrupt INTP0 func
void func(void) { }

変換後

#pragma rtos_interrupt func (vect=INTP0)
void func(void) { }

パターン2

変換前

__rtos_interrupt void func(void) { }

変換後

#pragma rtos_interrupt func
void func(void) { }

パターン3

変換前

#pragma rtos_interrupt

変換後

// #pragma rtos_interrupt

パターン4

変換前

__rtos_interrupt void func1(void), func2(void);

変換後

#pragma rtos_interrupt func1
void func1(void);
#pragma rtos_interrupt func2
void func2(void);

パターン5

変換前

#pragma rtos_interrupt INTP0 func
__rtos_interrupt func(void);

変換後

#pragma rtos_interrupt func(vect=INTP0)
void func(void);
#pragma rtos_interrupt func
void func(void);

対応

CC-RLでは#pragma指令の重複でエラーとなります。キーワードから変換した#pragma指令を削除してください。

パターン6

変換前

typedef void func_t(void);
__rtos_interrupt func_t f1;

変換後

typedef void func_t(void);
__rtos_interrupt func_t f1;

対応

CC-RLではコンパイル・エラーとなります。予めtypedefやマクロを展開してください。