開発に必要な、H8のハードウェア、ソフトウェアについてのメモH8独自の仕様や記述に関して、自分なりに推察したものを纏めたものなので、全て正しいかどうかは保障出来ない。[top]開発環境H8はいろんなバリエーションがあるが、それぞれのコンパイラでの対応は不明しかし、H8をコアにして周辺を追加しただけの様なので、互換性はあるのではないかと思われる。分割コンパイルに対応しているのは、HEWのみこのメモは特に断りのない限り、HEWのC/C++コンパイラでの記述方法の説明だが、H8で共通な部分もあると思われる。コンパイラパッケージ。HEW上に、いろいろとツールを追加していくような感じ。H8SXファミリC/C++コンパイラパッケージが20万円近くする。H8SX,H8S,H8ファミリC/C++コンパイラパッケージH8コンパイラは評価版で2ヶ月利用可能→それ以降はROMサイズ制限版となる。LiteGNUのgccをベースに作られたフリーの統合環境H8/3664F,H8/3687F,H8/3694F対応、H8/3048F,H8/3664Fフラッシュライタを含むしかし試したところでは、分割コンパイルは出来ない仕様のようだ。#includeでソースを分割出来ると思うが、簡単には移行出来ない。Eclipse(CDT)Cygwinとgccで、クロスコンパイラを構築して、Eclipse/CDTで、開発環境を作ることが出来るらしい。http://hp.vector.co.jp/authors/VA022386/未確認。秋月電子で販売している、H8/3048F,H8/3052F用のコンパイラDOSプロンプトのみで動作。実行ステート1命令の実行には、2〜12ステート程度、最大24ステート1リセット/RES端子が、lowになるとCPUの状態と、内蔵周辺モジュールのレジスタがクリアされる。入出力状態の初期値は要注意!動作中は、最低20ステートの間、lowにする必要がある。24.4.6のパワーオンリセット回路特性で、リセット時間が明確に記述されていない.動作中のリセットの規定から、電源が立ち上がってから20ステート以上必要ではないかと思われる。リセット端子は約100kでプルアップされており、Cの値を調節してリセット時間を決めるらしいが、リセット時間が明確には規定されていないので、適当に決めるしかなさそう。動作モードスリープモードCPUが止まるだけ。システムクロック、周辺モジュールは動作している。スタンバイモード、ウォッチモード2システムクロック、周辺モジュールも停止。sleep();IRQ割込み(I/O端子割込み)IRQ0〜5端子の入力信号で起動される。ISCRで、立上り/立下りのどちらのエッジで起動するか設定IERで、割込みの許可/不許可の設定IPRA7〜4ビットで、プライオリティの設定ISRに、割込みステータスが入る。優先順位は、NMIの次に高いITU割込み(タイマ割込み)16bitのインテグレーテッドタイマを5ch使用可能。内部クロック、φ,φ/2,φ/4,φ/8外部クロック、TCLKA、TCLKB、TCLKC、TCLKDコンペアマッチ、オーバーフローでの割込みTIERで割込みの許可/不許可の設定TSRに、割込みステータスが入るSTR0〜4ビットで、タイマスタート/停止を設定TSNC0〜4ビットで、タイマの同期動作/独立動作を設定A/D1乗除演算が一番時間が掛かるようだ。セクションH8に関しては、セクションの概念を理解しないとプログラム構造が理解出来ないようだ。セクションに関しては、実際のプログラムから推察した部分が多いので、記述内容は正しくない可能性があります。PCプログラムは、基本的にプログラムやデータは全てRAM上に置かれる。H8のようなマイコンは、プログラムや定数はROM上に配置する。H8コンパイラは、メモリの用途別にセクションという単位に分けて、実メモリ上に配置するらしい。H8の場合、セクションに以下のような名前(デフォルト)を付けて、メモリ領域の種類を区別している。RAMD→Rの転送は、標準ライブラリ'_INITSCT()'を呼出せば良いようだ。3048Fの場合、デフォルトは以下のようになっている。Sスタックサイズを指定すると、スタックエリアの最後がスタックポインタとして設定される。→スタックサイズを指定する。HEWの、プロジェクトメニュー→構成の編集でも、スタックの設定が可能。未初期化データ領域(B)初期化データ領域(R)スタック領域(S)ヒープ領域が何処になるのか不明→おそらくはRの領域の最後の方か?と思われる3048Fのモード7の場合のメモリマップ割当ては以下のようになる。FFF1C〜FFFFF[top]動作モードH8の動作モードは、MD2..MD0端子の状態で決まる。1に設定することで、オンボードプログラミングモードとなる。内蔵ROMが有効なモード5〜7で可能。フラッシュROMの書換え回数は100回までなので、注意が必要。ブートモードFWEを1,MD2を0に設定する。SCI1からRAMへデータを書き込むフラッシュROMをクリアするFF300〜のプログラムを実行する。ユーザプログラムモードFWEを1、MD2を1に設定する。以下のように、セクションの配置を指定する。複数のRAMセクションを同一アドレスに割り当てたい時PAとPBを100番地から割当てる。PBはPAの後に続けて割当てられる。_INITSCT();未初期化データ領域も、ゼロに初期化されるので注意。gcc等では初期化された変数は、ROM領域に置かれてしまうらしい。そのため、RAMに置きたい変数は初期化してはいけない。組込み関数Cで直接記述出来ないことについては、組込み関数になっている。なしvolatile宣言についてvolatile宣言した変数については、コンパイラの最適化が行われない。割込み処理で、変更される可能性のある変数は、volatile宣言すべき。メインプログラム中で変更されていない場合、コンパイラの最適化で思ったような動作をしない可能性がある。割込み許可まず個別の割込み要因毎に、割込みフラグを許可する。HEWの場合は、全体の割込み許可を、set_imask_ccr()で行う。gccの場合は、以下のようなマクロをインラインアセンブラで作ると良い。//割込み禁止[top]#pragmaHEWのC/C++コンパイラの独自の記述方法については、多くの場合、#pragmaを使って指定する。H8独自の記述というのもあると思う。最初に実行される関数。実質的なメインルーチンの指定。この中で、main()ルーチンを実行するようにすると分かり易い。}関数名は、PowerON_Resetにする必要はないと思う。vectは常にゼロである必要があると思うので、指定出来るようになっている理由は不明。割込みベクタと、割込み関数を定義する。}ほとんどエントリ関数の指定と同様。いうよりエントリ関数も実質上は割込みベクタなので、その後に続けて定義する。スタックの設定スタックサイズを指定すると、スタックエリアの最後がスタックポインタとして設定される。→スタックサイズを指定する。スタックサイズしか指定しないが、スタートはBセクションの最後になるのか?spの初期値とスタックサイズから、逆算することは出来る。HEWの、プロジェクトメニュー→構成の編集でも、スタックの設定が可能。構造体のメンパにポインタで直接アクセスしたい場合は、ワード境界にあわせる必要がある。→実践的で非常に分かり易い。