title to php.net

menu 総合掲示板 日記 リンク iαppli 開発&Tips C/C++全般 Java全般 Windowsアプリ 組込 i-αppli Webアプリ PHP 組込入門 ロジック
1332132
次の10件→

--RX111--
≪クロックの分周≫

--E10A-USB H8S2212/2218--
≪Frequency error≫

--日立H8S C/C++コンパイラ--
≪HEW 生成ファイル補足説明≫
≪標準ライブラリのソース≫
≪read()とwrite()≫
≪ファイルのバッファリング≫
≪バッファリング解除≫
≪ファイルバッファのサイズ≫
≪バッファのユーザー設定≫
≪charput()、charget()≫

次の10件→

開発日誌っす

組込
次の10件→

RX111
≪クロックの分周≫
RX111のクロック発生回路のレジスタSCKCRによる分周で、指定した分周に設定されない順番がある。
具体的には、PCLD→PCKB→ICK→FCKと順番に2分周に設定して行った場合、PCKDとPCKBが指定どおりに設定されない。

データシートには、

「注2.ICLK:FCLKPCLKBPCLKD=1:N(N は整数)の分周比関係になるように設定してください。」

とある。

要するにICKから設定して行かないと、1:Nの関係が崩れるため、設定が反映されなかったということ。
順番の問題だった。

E10A-USB H8S2212/2218
≪Frequency error≫
E10A-USBでH8S2212とH8S2218のデバッグをすると、
「Frequency error」が出てデバッグできなくなる。
エミュレータソフトウェアV.1.04.00で確認していますが、以降のバージョンでは修正されるはず。
HEW3のフォルダの奥深く、H8S2218のフォルダの中に「Heuh8s.cnf」という名前のファイルがある。
この中に定義されているレジスタアドレス

REGADDR SCKCR=00FFFED6

にミスがある。正しくは、

REGADDR SCKCR=00FFFDE6

となる。定義箇所は、2212の分と2218の分で2箇所。

日立H8S C/C++コンパイラ
≪HEW 生成ファイル補足説明≫
HEW 生成ファイル補足説明(H8S、H8/300)なんての前からあったの?
HEW生成ファイル補足説明(SH-1、SH-2、SH-2E、SH-DSP)ってのも。

≪標準ライブラリのソース≫
マイコン用のコンパイラって普通 標準ライブラリのソース付いてると思ってたのに、日立のって無いんですよ。で、日立に問い合わせたら、「非公開情報です」だって。なんだよそれ。MSよりヒドイぞ!まぁ、MSで何やら判らない物を信じる事にはなれてるけどね。でもマイコンの場合そこから学び取る情報も結構あるですけど。何より標準ライブラリにバグあったらどうしてくれるんでしょう? ファイル操作の実装ってどうなってるの?って訊いたらら、「私は、ファイル実装は推奨しません」との事。あんたの見解を訊いてるんじゃないっての!

≪read()とwrite()≫
高水準インターフェースのfprintf()などから、最終的に呼び出される低水準インターフェース。
バッファリング処理が行われているので、その度必ず呼び出される訳ではない。fflush()、fclose()などによりまとめて呼び出される事もあり。

≪ファイルのバッファリング≫
高水準インターフェースのfputs()などからの呼び出しは原則バッファリングが行われる。

≪バッファリング解除≫
ファイルのバッファリングの解除を行うには、低水準のopen()などで_IOUNBUFのフラグをセットする事で解除できる。
この時、fseek()でSEEK_SETを呼び出しても高水準インターフェース内でSEEK_CURに変換され低水準のseek()に来る。
すなわち、バッファリングなしに設定すると、ファイル先頭や終端からのシーク動作は不可能になる。

≪ファイルバッファのサイズ≫
ファイルバッファはデフォルトで512バイトとなっているため、それよりクラスタサイズが小さいデバイスを扱う場合、大きな無駄になる。

≪バッファのユーザー設定≫
setvbuf()などのライブラリ関数により、バッファの位置及びサイズが変更可能。
しかしこれは、次の様に使われることが前提。
FILE* fp = fopen();
setvbuf(fp....);
fclose(fp);
高水準インターフェースの呼び出し側がsetvbuf()を呼び出す。
組み込みの場合、通常こうゆうデバイスに依存するものは、隠蔽したいもの。
で、内部的なバッファアドレス(_iobuf[]のメンバ)を低水準のopen()内で設定してみるが、open()は高水準のfopen()から呼ばれるので、open()からfopen()内で戻った後、_iobuf[]のメンバは初期化される。
結論的には、低水準内で設定する方法はなし。

≪charput()、charget()≫
lowlvl.src 内にあるcharput()とcharget()は通常のコーディングでは無視してよい。これはシミュレータで使用されるもののよう。最初これも低水準インターフェースの部品かと思ってた。

次の10件→