|
|
≪ファイルバッファのサイズ≫ |
| ファイルバッファはデフォルトで512バイトとなっているため、それよりクラスタサイズが小さいデバイスを扱う場合、大きな無駄になる。 |
|
≪バッファのユーザー設定≫ |
| setvbuf()などのライブラリ関数により、バッファの位置及びサイズが変更可能。 しかしこれは、次の様に使われることが前提。 FILE* fp = fopen(); setvbuf(fp....); fclose(fp); 高水準インターフェースの呼び出し側がsetvbuf()を呼び出す。 組み込みの場合、通常こうゆうデバイスに依存するものは、隠蔽したいもの。 で、内部的なバッファアドレス(_iobuf[]のメンバ)を低水準のopen()内で設定してみるが、open()は高水準のfopen()から呼ばれるので、open()からfopen()内で戻った後、_iobuf[]のメンバは初期化される。 結論的には、低水準内で設定する方法はなし。 |
|
≪charput()、charget()≫ |
| lowlvl.src 内にあるcharput()とcharget()は通常のコーディングでは無視してよい。これはシミュレータで使用されるもののよう。最初これも低水準インターフェースの部品かと思ってた。 |
|
≪read()のデータ数≫ |
| read()のデータ数はバッファリング時にはまとめてバッファサイズ分で呼び出される。そのため、前述したようにクラスタサイズが小さい場合は、ユーザーバッファ定義が必須となる。 |
|
≪___curr_eh_stack_entry≫ |
| L2310 (E) Undefined external symbol "___curr_eh_stack_entry" referenced in...のエラーメッセージは、コンパイラオプションにて、C++とEC++の両方を暗黙で使用するように設定してしまうと、発生する。どちらか片方のみを選ばなくてはならない。といっても、オプションの所では判りにくい。 |
|
≪Internal error≫ |
| C4099 (?) Internal errorが発生する場合あり。筆者の環境では、マクロ定義が複雑になり、マクロがマクロを参照するような状態で中カッコ}を書き忘れた時に発生。 |
|
≪ベクタテーブル≫ |
| 「アプリケーションノート」には、ベクタテーブルファイル、「vecttbl.c」及び「vect.h」が生成されると書いてあるが、実際は生成されず。ベクタ定義は自動で行われるらしく、割り込み関数は、__interrupt(vect=xx) void foo();としてxxの部分にベクタ番号を書いておけば、リンカが解決してくれる模様。マニュアルには、その旨の記述なし。 |
|
≪ビット位置の変更≫ |
| ポートデータ等のビット位置を第0ビット目以外にコピーする場合、受け側の変数を次の様な構造体にすると良い。 struct { unsinged char B7:1; unsinged char B6:1; unsinged char B5:1; unsinged char B4:1; unsinged char B3:1; unsinged char B2:1; unsinged char B1:1; unsinged char B0:1; } FOO; で、実装は bar.FOO.B4 = P_P1.PORT.B6; |
|
≪read()の戻り値≫ |
| 低水準インターフェースのread()の戻り値は読み込んだデータ数だが、これに0を返すと高水準側でEOFとマーキングされ以後呼び出されなくなってしまう。 |
|
≪C++リンケージ≫ |
| CPPファイル内でC++リンケージの関数ポインタを扱う時、extern "C"を行わないと、ヌルポインタとして処理されてしまう。この時、コンパイラ及びリンカはエラーもワーニングも出さない。 |