BoostCの組み込み関数は、boostc.hファイル内にて定義されている。どのような関数が使えるのか調べてみました。
- BoostCでは通常、ソース先頭でsystem.hをインクルードします。
#include <system.h>
- system.hファイルの中にはBoostC固有のヘッダが読み込まれます。
#ifdef _BOOSTC #include <BoostCPic18.h> #include <BoostCPic16.h> #include <boostc.h> #else
- BoostCPic16.hやBoostCPic18.hファイルでは、ターゲットデバイスに対応する定義ファイルが読み込まれるようにしています。
#ifdef _PIC12F683 #include <PIC12F683.h> #endif // _PIC12F683 #ifdef _PIC12CE674 #include <PIC12CE674.h> #endif // _PIC12CE674 #ifdef _PIC12CE673 #include <PIC12CE673.h> #endif // _PIC12CE673
- boostc.hファイルには組み込み関数について記述されています。
//////////////////////////////////////////////////////////// //Helper macros #define clear_bit( reg, bitNumb ) ((reg) &= ~(1 << (bitNumb))) #define set_bit( reg, bitNumb ) ((reg) |= (1 << (bitNumb))) #define test_bit( reg, bitNumb ) ((reg) & (1 << (bitNumb)))
ビット処理用のマクロです。clear_bit()は、指定のビットを0にする。set_bit()は指定のビットを1にする関数。C2Cから引き継がれた関数です。C2Cではこういった定義はなく、そのまま使用できました。そういった意味でBoostCが汎用性のあるCになっていると言えるのではないでしょうか。test_bit()は指定のビットの状態を調べる関数とみなせます。演算結果はゼロかそれ以外で判断する必要があります。
if (test_bit(portb, 1)) { // ポートBのbit1がONです }
test_bit()を使ってポートBの状態を調べる例
//////////////////////////////////////////////////////////// //Delay functions generated by linker extern void delay_us( unsigned char t ); extern void delay_10us( unsigned char t ); extern void delay_100us( unsigned char t ); extern void delay_ms( unsigned char t ); extern void delay_s( unsigned char t );
一定時間、消費する関数。引数がunsigned char型なので255までしか指定できない点に注意。また、クロック定義に対してあまりにも短かい場合には関数自体が生成できない旨、ワーニングで出力される。
//////////////////////////////////////////////////////////// //Built-in assembly inline void nop( void ) { asm nop } inline void clear_wdt( void ) { asm clrwdt } inline void sleep( void ) { asm sleep }
アセンブラ命令と直接対応する関数です。見てのとおりインライン関数で、記述場所に直接展開されます。
//////////////////////////////////////////////////////////// //String manipulation routines extern void strcpy( char *dst, char *src ); extern void strcpy( char *dst, rom char *src ); extern void strcat( char *dst, char *src ); extern void strcat( char *dst, rom char *src );
文字列操作用の関数定義です。BoostCでは文字列の操作が容易になりました。一般のCで作られたソースをそのまま移植しやすくなりました。しかし、PIC16系CPUにとって文字列操作が苦手であることは変わりませんので、避けた方がいいと個人的には思います。
//////////////////////////////////////////////////////////// //Character manipulation routines extern char toupper( char ch ); extern char tolower( char ch ); extern char isdigit( char ch ); extern char isalpha( char ch ); extern char isalnum( char ch );
文字操作用の関数定義です。toupper()は英文字の大文字化、tolower()は小文字化。一般のC言語でいうところのctype.hに一部対応した感じです。
//////////////////////////////////////////////////////////// //Functions used internally extern unsigned short _div_16_16( unsigned short a, unsigned short b ); extern unsigned short _rem_16_16( unsigned short a, unsigned short b ); extern unsigned char _div_8_8( unsigned char a, unsigned char b ); extern unsigned char _rem_8_8( unsigned char a, unsigned char b ); #ifdef _PIC16 extern unsigned short _mul_8_8( unsigned char a, unsigned char b ); extern unsigned char _mul_8_8__8( unsigned char a, unsigned char b ); extern unsigned short _mul_16_8( unsigned short a, unsigned char b ); extern unsigned short _mul_8_16( unsigned char a, unsigned short b ); extern unsigned short _mul_16_16( unsigned short a, unsigned short b ); #endif //_PIC16 extern void __rom_get( unsigned char id, unsigned char idx );
ユーザからではなく、内部で使用される関数の定義です。剰余算などを内部で関数として実行しているようです。__romget()については分かりません。
//////////////////////////////////////////////////////////// //Dynamic memory allocation //extern void* alloc( unsigned char size ); //extern void free( void *ptr );
現在は未実装です。動的にメモリ取得を行なう関数が実装予定のようです。PIC16系でも使えるのでしょうか。あまり現実的じゃないような…(^_^;