開発にあたってのノウハウ
5. Cコンパイラの拡張言語仕様について
組み込み機器用のプログラム記述に対応する為、以下の拡張言語仕様を準備しております。プログラム作成の際には、本拡張仕様を効果的にご使用下さい。Softune C Compilerがサポートしている拡張言語仕様の内容です。
1)__asm文を記述すると、アセンブラ命令として展開します。
例:__asm (" LDI #1 , R0 ");
拡張修飾子
2)__interrupt を指定することにより、割込み関数を記述することができます。
例:__interrupt void 関数名(void){ . . . }
3)__io を指定することにより、I/O領域を走査する変数を定義することができます。
例:#pragma section IO=IOA, attr=IO, locate=0x10
__io int a;
void 関数名(void){ a=1;}
#pragma を使用した拡張機能
4)#pragma asm と#pragma endasm の間 の記述をアセンブラとしてそのまま展開します。
例:#pragma asm
LDI #1, R0
LDI #2, R1
#pragma endasm
5)#pragma inline を指定することにより、インライン展開するユーザ定義関数を指定します。
例:#pragma inline 関数名1[, 関数名2]
6)#pragma section を指定することにより、セクション名やセクション属性を変更し、セクションの配置アドレスを設定することができます。
例:#pragma section CODE=program, attr=CODE, locate=0x80000
void 関数名(void){ ... }
7)#pragma ilmは、この指定以降で定義されている関数の割込みレベルを指定します。
#pragma noilmは、割込みレベルの指定を解除します。
例:#pragma ilm(24)
void 関数名(void){ ... }
#pragma noilm
8)#pragma intvect は、割込み関数を設定した割込みベクタテーブルを生成します。
#pragma defvect は、#pragma intvectで指定されていない割込みベクタに設定するデフォルトの割込み関数を指定します。
例:#pragma intvect 関数名1 21
#pragma intvect 関数名2 20
#pragma defvect 関数名3
割込み関連の割込み関数
9)__DI()を記述することで、割り込みをマスクするコードを展開します。
例:void 関数名(void){ ...
__DI();
... }
10)__EI()を記述することで、割込みマスクを解除するコードを展開します。
例:void 関数名(void){ ...
__EI();
... }
11)__set_il()を記述することで、割込みレベルを変更するコードを展開します。
例:void 関数名(void){ ...
__set_il(20);
... }
その他の組込み関数
12)__wait_nop()を記述することで、NOP命令を展開します。
例:void 関数名(void){ ...
__wait_nop(3);
... }
