RL78/G1xテンプレートの移植(その2)

RL78/G1xテンプレートの移植手順一覧を示します。今回は、1~2まで解説します。

移植手順一覧

  1. CubeSuite+で、マイクロコントローラ変更(M)… 実行
  2. コード生成(設計ツール)再設定
  3. コード生成出力に使用レジスタ・バンク追記(デフォルトは、全てRB0のため)
  4. フラッシュライブラリ使用時は、リンク・ディレクティブ変更(コンパイラ領域を連続して広く取るため)
  5. userdfine.h修正
  6. 移植ボードの動作処理追加

G13Stick(サブプロジェクト)のテンプレートが移植ボードに最も近いので、これを使い移植します。

マイクロコントローラ変更:R5F100LE からR5F100ADへ

移植ボードのマイコンは、R5F100AD(30pin):RL78/G13 (ROM:48KB)_30pinで、テンプレートのR5F100LE:RL78/G13(ROM:64KB)_64pinと異なるので、マイクロコントローラ変更を行います。R5F100LE上で右クリックすると、マイクロコントローラ変更(M)…メニューが現れますので、R5F100AD(30pin)へ変えます。変更後は、サブプロジェクトのコード生成(設計ツール)が初期化され、「先に端子割り当てを設定してください。」のメッセージが出力ウインドに表示されます。

マイコン変更
マイコン変更

コード生成(設計ツール)の再設定

クロック発生回路の「箱アイコンが開いている」のは使用中を、「閉じている」のは未使用を示します。マイコン変更直後は、箱アイコン横の!マークで端子割当てが必要であることが判ります。また、ウオッチドック・タイマの箱アイコンも開いているので、WDTがデフォルトで使用されることも判ります。

コード生成の再設定
コード生成の再設定

コード生成のパラメタは、全てGUIで設定するのが本来の使い方です。設定箇所が多く、間違いなく設定するのは大変ですが、GUIで変更や修正が簡単にできるのがメリットです。しかし、多くのパラメタをプロジェクト作成毎に設定するのは面倒なので、既成ファイル(xyz.mtudあたり)から必要部分のコピー&ペーストで作成すべくいろいろ試行しましたが、失敗でした。別の方法として、(サブ)プロジェクト毎コピーしてプロジェクト名を変更する方法を以前に示しました。今回は、仮想開発ボード付属プロジェクトのコード生成GUIを横目で見ながら、真面目(?)にこのパラメタを設定します。

※A/Dコンバータは、移植基板付属のコード生成では未使用です。しかし、初期設定などメインプログラムで設定しており実際は使用しています。私は、コード生成を使って設定しました。

コード生成レポート

設定した多くのパラメタがオリジナルプロジェクトと同じかを確認する方法に「コード生成レポート」が使えます。このレポートは、コード生成タブの表示中にのみファイル(F)メニューに表示されるコマンドで、全パラメタがHTML形式で出力されます。オリジナルと両方出力して、エディタで比較すれば、パラメタの一致確認が容易です。

コード生成レポート
コード生成レポート

移植ボードの付属回路とコード生成

移植ボードの付属回路を示します。UART0はD-Subコネクタが未実装なのでUART1を使います。コード生成(G)をクリックして、移植ボードのAPIを生成します。

BlueBoard Peripheral Schematic label CPU pin CubeSuite+ port
User LED LED 20 P16
Buzzer BUZZER 15 P31
User Switch INTP1 17 P50
Reset Switch NRST 6 RESET
ADC ANI2 29 P22
UART0(コネクタ無し) RXD0 25 P11
TXD0 24 P12
UART1(コネクタ有り) RXD1 2 P01
TXD1 3 P00

RL78/G1xテンプレートの移植(その1)

Version2のRL78/G1xテンプレートは、4種の市販ボードに対応しますので、テンプレートとボード動作の確認がすぐにできます。今回は、この4種対応ボード以外のボードに、テンプレートを移植する例を示します。本テンプレートを、お客様開発のボードへportingする際に参考になることを狙っています。内容が複雑で分量も多いので、3回に分けて解説します。

移植ボード選定

第1回目は、ボード選定です。RL78/G1xの発売以降、典型的な市販ボードは、テンプレートでサポート済みです。そこで、お客様開発ボードの代わりに選んだボードは、インドNGX Technologies社のBlueBoard-RL78/G13_30pin-Hです。格安で、E1インタフェース、UART、LED、ブザーなどの周辺ハードが実装済みです。日本でも秋月電子通販から2400円で購入できます。このボードを「仮想お客様開発ボード」とし、テンプレートを移植します。

BlueBlardRL78G13_30pin-H
BlueBoard-RL78/G13_30pin-H(秋月電子通商HPより抜粋)

RL78/G14ボードへの移植

今回porting対象に選んだボードのマイコンは、RL78/G13:ROM:48KB_30pinです。因みに、RL78/G14:ROM48KB_30pin実装ボードも同じボード回路で、違いはマイコンのみ、ピン割付も同じです(詳しくは、NGX Technologies社のHPを参照)。従って、テンプレートをBlueBoard-RL78/G14_30pin-Hへ移植する場合も、ここで示す方法がそのまま使えます。

ボード付属ソフトやアプリケーションノートソフトの問題点

市販ボードには、ボードをテストするプログラムが付属しますが、あくまでハードテストが主眼です。また、RL78のサンプルプログラムやアプリケーションノートのプログラムは、動作ボードを特定せず、単一機能の実装例が主眼です。これらに対して、実用プログラムは、複数機能で各機能がシステムとして上手く動作する必要があるので、ボード付属ソフトやアプリケーションノートのソフトを、そのまま実用版へ流用したくても、中途半端で役立ちません。RL78/G1xテンプレートは、この両者の隙間を埋めるのが役目です。実用プログラムとしてそのまま使えるひな型を目指しています(テンプレートに対する皆様のご意見、ご要望などが御座いましたらお気軽にinfo@happytech.jpへお寄せ下さい)。

では次回から、RL78/G1xテンプレートの移植方法を示します。

マイコン入力処理ソフト

マイコンは、入力データを基に、データを出力する装置です。今回は、入力データのソフト処理について考えます。

入力データには、「ノイズ」が付き物です。例えば、スイッチ入力であれば、チャタリング、AD変換入力であれば、アナログノイズなどです。これらには、ハード的なノイズ対策が行われます。しかし、マイコンに取込むのは最終的にはソフトなので、ソフトの入力ノイズ対策は必須です。

スイッチ入力のソフトノイズ対策

スイッチのチャタリングは、使用するスイッチハードによってチャタリング時間が変わります。タクトSWやトグルSWの場合は、数ms~10ms程度と言われます。スイッチ入力のソフト処理は、入力データをスキャンして、「High」か「Low」のデータ値が連続したらチャタリングが終わった確定データとします。問題は、データスキャン間隔と連続値の比較回数です。スキャン間隔が広く比較回数が多ければ、確定までの時間が掛ります。と、ここまでは、教科書に記載されています。しかし、肝心のソフト調整の記載は少ないようです。

スイッチ入力は、実際のスイッチハードを人が操作して確定データを調整する必要があります。調整ポイントは、スキャン間隔と比較回数です。これらを簡単に調整/変更できるソフトが優れたソフトです。いろいろ方法があるでしょうが、シンプルな方法は、「スイッチスキャン処理を1つの関数として作成し、この関数の実行タイミングをメイン関数で変更する方法」です。これなら、スイッチハードが無い時はシミュレーションでソフト単体のデバッグができますし、ハードが用意できた後は、単体デバッグ済みソフトとスイッチハードを結合してデバッグします。結合デバッグは、メイン関数のスイッチスキャン処理実行タイミングだけを変えて、スイッチハード操作データが正確に取得できるタイミングを探すだけですので簡単です。

このように、ソフトは、ハード無しの状態で単体デバッグができ、かつ、ハード結合デバッグの調整も簡単にできる作りが望ましいのです。この調整を開発の初期段階でどの程度意識したかにより、可搬性の良いソフトができます。

スイッチスキャン処理ソフトの例(2回スキャンデータ一致で入力データ確定)
スイッチスキャン処理ソフトの例(2回スキャンデータ一致で入力データ確定)

多くの教科書やサンプルソフトは、メイン無限ループからサンプル処理を起動します。これは、サンプル処理の説明に重点を置いているのでしょうがないのです。しかし、ハード結合調整まで考えると、ここで示した方法のように、無限ループからの起動よりも、起動タイミングを変えられるメイン関数の方が良いことが判ります。

販売中のRL78/G1xテンプレートは、1ms/10ms/100ms/1s/無限ループの5種類のアプリ起動タイミングを提供します。特に入力ソフト処理には、このタイミングを変えられることが、ノイズ対策やハード依存性を少なくすることに効果的です。タクトSWでは、10ms間隔のスイッチスキャン関数起動と2回スキャンデータ一致により、操作データが正確に取得できました。また、AD変換の例としては、ポテンショメータのAD変換データスキャン関数は、100ms間隔起動と2回スキャンデータ一致によりデータ入力ができました。同じAD変換ソフトで、室温などの変化が緩やかなAD変換入力なら、スキャン間隔を1sにすれば対応できます。

販売中のG1xテンプレートのアプリ起動処理(テンプレートから一部抜粋)
販売中のG1xテンプレートのアプリ起動処理(テンプレートから一部抜粋)

RL78/G1x用テンプレートVersion2販売

RL78/G13とG14ソフト開発や習得に使えるテンプレートをVersion2に改版しました。販売価格は、従来版と同じ1000円(税込)です。

RL78/G1xテンプレートVer2の特徴

従来版は、主として「RL78/G13Stickに対応したプロジェクトのみ」を実装しておりました。従って、動作ボード変更時は、RL78/G13マイコンからG14への変更や、ポートハードの再割付、コード生成パラメタの再設定、など多くの変更が必要でした。 Version2は、「対応評価ボード別のサブプロジェクトでテンプレートを構成」しております。これにより、対応4種評価ボードに、テンプレートをそのままダウンロードし、ボードとテンプレートの動作確認ができます。修正や変更は一切不要です。 対応している市販評価ボードは、

  1. RL78/G13Stick
  2. RL78/G14Stick
  3. QB-R5F100LE-TB
  4. QB-R5F104LE-TB

の4種です。評価ホード名のサブプロジェクトをアクティブプロジェクトに選択すれば、評価ボード実装マイコンとポートハード割付、コード生成パラメタは、設定済みですので、より簡単にボードとテンプレート動作の確認ができます。

テンプレートVer2
テンプレートVer2のサブプロジェクト構成と評価ボード動作

また、本テンプレートをより広い範囲でご活用いただくために、対応外ボードや、マイコン機種変更時の処理一覧と方法をテンプレート解説P9に追加いたしました(P1のみ掲載中ですが、もくじで内容がお判り頂けると思います)。

Template2 Manual Page1
テンプレート解説 P1

本テンプレートが、皆様のRL78マイコンの早期開発、習得のお役にたてば、幸いです。

購入ご希望の方は、メール(宛先:info@happytech.jp)にてお知らせください。銀行振込口座を返信いたしますので、この口座へ代金の1000円(税込)を振込でください。振込確認後、本テンプレートVer2一式(テンプレート解説全ページとテンプレートプロジェクト、ZIP圧縮約3MB)をメールにてお送りします。

RL78/G14 ハードウエア編ユーザーズマニュアル改編

RL78/G14のハードウエア編ユーザーズマニュアルが、Rev. 2.00へ改編されました。

付録Aの改訂履歴をみると、記述が整理されリファインされた感じがします。例えば、P91の未使用端子の処理表などです。出力未使用端子は、オープンのまま、入力未使用端子は、個別に抵抗を接続して、VddかVssへ接続することが判ります。

但し、P60/SCLA0、P61/SDAA0のI2C関連ポートの未使用時は、出力ラッチ設定後、抵抗を接続してVddかVssへの接続が必要です。販売中のRl78/G1xテンプレートは、これらをLED出力ポートとして使用中ですので、安心です。テンプレートご活用中の皆様は、未使用に変更の場合には、上記ユーザーズマニュアルを参照して適切な処理を行ってください。

CubeSuite+ Windows8.1 Pro動作確認(最終報告)

トラブル続きであったWindows8.1 Pro上でのCubeSuite+動作が正常に戻りました。

ウイルス誤検出は、定義ファイルが更新されたお蔭か、または、プログラム自身が更新されたかは不明ですが、問題なく動作しております。やはり、OS更新は、発売後2~3日待ってから更新した方がリスクが少ないようです。

これとは関係しませんが、Windows8 Proマシンで1台のみ8.1更新ができない64ビット自作機があります。調べてみると同じようなマシンが結構あるようです。もちろん、Microsoft記載のトラブルシューティングは全て試しましたが、結果はNGでした。

クライアントデスクトップ環境は、Windows7で完成の域に達したと感じていますが、8更新以降、環境劣化していると思うのは私だけでしょうか? ハイブリッドOSで二兎を追うのは判りますが、モダンUI環境だけでなく、デスクトップ環境もアップグレードしてくれないと、新OS導入を控える人が多くなること、圧倒的に多いWindowsデスクトップアプリ資産の今後が多少不安です。

コード生成ひな型出力とユーザ追加ソースファイルの分離メリット

CubeSuite+のコード生成は、マイコン周辺機能を制御する「デバイス・ドライバ」と「ひな型ソース」を出力します。ユーザは、このデバイス・ドライバをAPI関数としてコールする処理をひな型へ追加すれば、所望動作プログラムが完成します。今回は、このひな型とユーザが追加する処理を分離すると、マイコン依存性が少なくなり、移植性が高まることを示します。

コード生成の「端子割当て設定」は、はじめに必ず設定する必要があることは、以前示しました。そこで、この端子割当てのみを設定し、後は何もせずにコード生成(G)をクリックすると、10個のファイルが生成されます(「r_」は、ルネサス、「r_cg_」は、コード生成が作成したことを意味すると思います)。

コード生成出力ファイル
コード生成出力ファイル

1~4がひな型、5~10がデバイス・ドライバです。クロック発生回路とウオッチドック・タイマは、デフォルトで利用する周辺回路です。ユーザが使う周辺回路をコード生成のGUIで設定すれば、それに応じてr_cg_周辺回路.c、r_cd_周辺回路_user.c、r_cg_周辺回路.hの3ファイルがこれらに追加されます。

r_systeminit.cは、周辺回路の初期設定が生成されていて、r_main.cの実行前にスタートアップで処理されます。r_cg_macrodrive.hは、システム定義のマクロで、r_cg_userdefine.hは、中身なしのスケルトンです。必要に応じて、ここにユーザ定義を追加すれば、全ファイルに自動的にインクルードされます。

起動処理のr_main.c中身を示します。R_MAIN_UserInit()でメイン無限ループ実行前のユーザ追加処理があれば追記し、なければそのまま割込み許可EI()した後、メイン無限ループに入ります。通常は、この無限ループにユーザが処理を書き加えます。

何らかの都合で、コード再生成した場合にも、/* Start user…*/と/* End user…*/の間に書き加えた処理は、そのままコード再生成出力ファイルにマージされますので、追加分は、保持されます。これが、コード生成の一般的な使い方です。この場合は、ユーザ追加処理は、コード生成ファイル内に入ります。

r_main.cの中身
r_main.cの中身

提案は、このユーザ追加処理とコード生成のひな型を分離し、別ファイルにすることです。メイン無限ループにuser_main()を付け加えた例で説明します。user_main();は、別ファイルmain.c内に作成します(「r_」が無いので自作ファイルであることが判ります)。

このmain.cファイル内のuser_main()でコード生成出力のAPI関数を使うので、使用するr_cg_周辺回路.hをインクルードする必要がありますが、user_main()は、多数のAPI関数のコールを使う単純なプログラムとなります。API関数名は、R_CGC_Set_CRCOn ();などのように長い記述になりますが、その分、ソース可読性は向上します。また、RL78/G13とRL78/G14で周辺回路のハードが異なるものがあっても、API関数名は同じものがコード生成されるので、制御するユーザ側は、同じものが使えます。

このように、コード生成出力のひな型とユーザ追加処理を分離すると、移植性が良くなります。最近のマイコン統合開発環境は、CubeSuite+のようにAPI関数を自動生成するものが増えてきました。この場合も、API関数名は、同じか、または近い意味のものが生成されますので、ユーザが追加した処理ファイルがそのまま使える可能性が高まります。API関数を使う側と、API関数を生成する側を分離すると、マイコンの製品依存性も少なることが判ります。

 

販売中のG1xテンプレートは、この考え方で開発しました。RL78/G13とG14で共通に使えます。他シリーズは試していませんが、使えると思います。また、他社製品、例えばARM Cortex-Mマイコンなどにも適用してみたいと考えています。

CubeSuite+ Windows8.1 Proで動作確認(続報)

先に報告した動作確認の続報です。

21日より突然、コンパイラがウイルスに感染しているとして、ウイルス対策プログラム(Avast:2014.9.0.2006)が動作し、ビルドができなくなりました。Avastチェストから削除プログラムを元に戻しても、一度チェストへ入れられたコンパイラは、残念ながら動作しません。

コンパイラ動作停止
コンパイラ動作停止

Windows8.1は、Windows8よりも、余計なセキュリティが強化されていますので、これかと思い、Windows8 Proへリカバリしても、同様です。

仕方がないので、一度、CubeSuite+を全てアンインストールし、再度インストールし、Avastを停止させて起動したところ正常にビルドできました(コンパイラのみの再インストールでは、解決しません)。原因は、Avast側にあると思いますが、同じようなことが他のセキュリティソフトでも起こる可能性がありますので、注意してください。

CubeSuite+ Windows 8.1 Proで動作確認

17日20時より配布されたWindows 8.1 Pro 32/64ビット版でのCubeSuite+の動作、E1によるデバッグ動作を確認しましたので、速報します。

Windows 8 から 8.1への無償アップグレードは、簡単でした。CubeSuite+やE1もあっけないほど問題なく動作します。個人的には、デスクトップ環境は、Windows 7時代で完成の域に達したと思います。チャームやモダンUIなんか、気分転換に使えるぐらいですものね。

RL78コンパイラコーステキスト要旨(3回目)

RL78コンパイラコーステキスト、2013年5月22日Rev.1.06版の要旨、最後の3回目は、コンパイラ設定です。

コンパイラは、ユーザ記述ソースからロードモジュールを作成します。この時、使用するマイコンに応じて、いろいろなコンパイル・オプションの設定が必要になります。このオプション設定がまずいと、「良いモジュール」ができないからです。もう1つ記述時に重要なことは、ソースプログラムの書き方です。

コンパイラ設定の要旨

本対象マイコンでは、コンパイル・オプションのメモリ・モデルを、「スモール・モデルに設定」することが必要です。デフォルトが、ミディアム。モデルになっているからです。

CubeSuite+は、良いモジュールを作るために9個のコンパイル・オプションを組合せて、標準、サイズ優先、速度優先、詳細設定、いいえの5種類の作成方法(最適化)を予め用意しています。オプションと最適化の関係は、以下になります(テキストの抜粋表に追記)。

コンパイル・オプション設定

最適化の種類

標準 サイズ優先 速度優先 詳細設定 いいえ
1 演算式の実行順序入替え

×

2 自動変数をレジスタまたはsaddr領域に割当

×

3 レジスタ変数をレジスタに加えsaddr領域に割当

×

×

×

×

4 char演算の符号拡張なし

×

5 char型をunsigned charとみなす

×

×

×

×

6 分岐命令を最適化

×

7 定型コードをライブラリに置換え

×

×

8 相対分岐でswitch分岐テーブル生成

×

×

×

×

9 デバックに適した最適化

×

×

×

×

◎:強力に実施、○:実施、×:実施なし、△:カスタム(自由設定)

最も標準的なオプション設定の組合せが「標準」で、デフォルトになっています。サイズと速度ともに効果がある1、2、4、6オプションなどは、○:実施に設定です。「標準」、「サイズ優先」と「速度優先」の差は、オプション7の定型コードをライブラリに置換えるか否かのみです。つまり、「標準」でかなり最適なモジュール作成ができていて、さらにモジュールサイズを圧縮するなら「サイズ優先」、速度を上げるなら「速度優先」に変更すれば良いことが判ります。

「詳細設定」は、全オプションを自由に設定するモードで、この時のみ9個のコンパイル・オプションが画面表示されます。他の最適化の時は、個々のコンパイル・オプションは表示されません。「詳細設定」ではオプション設定が自由ですので、各オプションの差分評価などの用途と思われますが、サイズ大で速度も遅いモジュールが生成されたりもしますので、使うことはないでしょう。また、「いいえ」は、全オプションを設定しないモードで、これも使わないでしょう。

結局、最適化は、デフォルトの「標準」のままで良く、どうしてもサイズや速度を改善したい時は、「サイズ優先」か「速度優先」を選択します。但し、差分は、定型コードのライブラリ化のみで、記述ソースにもよりますが、効果は期待できないかもしれません。

オプション3のレジスタ変数をレジスタに加えsaddr領域に割当は、何の効果もないので設定不要、オプション8の相対分岐でswitch分岐テーブル生成は、対象マイコン外なので設定不要、オプション9のデバッグ最適化は、内容不明でした。

ソースプログラムの書き方要旨

オプション5のchar型をunsigned charとみなすは、ソースプログラムの書き方に関連します。RL78マイコンで使う整数型変数は、「符号なしの8ビットまたは16ビットが最も効率的」にコンパイルされます。型宣言にcharやint、shortのみを記述すると、デフォルトでは「符号つきのsigned変数」になります。このオプション設定で、char型変数は符号なしにみなされますが、int、shortはそのままです。対策は、「整数型宣言は、必ずsignedかunsigned を付け、符号の有無を明記する」ことです。

RL78マイコンの汎用レジスタは、16ビットです。従って、32ビットのlong変数は避け、「できる限り8ビットまたは16ビット変数を用いると、効率的」な結果が得られます。

#pragma以降のキーワード(例えば、EI、DI、NOP、HALTなど)は、大文字でも小文字でも記述可能ですが、関数内で使う時は、大文字記述時のみ有効なので、「大文字で統一」した方が混乱は避けられます。

呼出される関数にcalltを付けると、通常よりも短いコードで関数呼出しができます。つまり、サイズ優先の書き方です。但し、速度は遅くなります。calltが使える関数は、最大32個です。対象マイコンは、64KBの大容量ROMですので、この「callt記述を使う可能性は低い」と思います。

saddr領域とコンパイラ固定使用領域

第1回のRAMメモリマップで示したように、saddr領域とは、マイコンRAM内:FFE20~FFEB3の148バイトのことです。コンパイル・オプション2の自動変数をレジスタまたはsaddr領域に割当が、○:実施されていることから、最適化に有効な領域であることが判ります。

saddr:ショート・ダイレクト・アドレッシング領域は、8ビットコードでアクセスできるので、サイズ、速度ともに向上します。レジスタとほぼ同じと考えて良いでしょう。「標準」最適化で、コンパイラにより、関数内の自動変数はこのsaddr領域へ割付けられます。また、コンパイル・オプションのデータ制御項目で、static/外部変数をsaddr領域へ自動的に割付けることもできます。この自動割付けが嫌なら、ソース内でユーザが明示的にsregを付けた外部変数、関数内のstatic変数の割付けも可能です。非常に有用な領域で、RL78マイコンを使いこなす技を生むポイントですが、148バイトしかありません。148バイトを超えて使用すると、コンパイルエラーが発生します。

この少ないsaddr領域の対策として、コンパイラ固定使用領域:FFEB4~FFEDEの44バイトのうち、FFEB4~FFED3の32バイトをsaddr領域へ変更することができます。これで、合計148+32=180バイトがsaddrユーザ領域になります。但し、制限として、標準ライブラリのsetjmp、longjmp、sprintf、sscanf、printf、scanf、vprintf、vsprintf、ldiv関数を使わないことと、コンパイル・オプション3のレジスタ変数をレジスタに加えsaddr領域に割当てを、×:実施しないことが条件です。もちろん、「標準」最適化では、このオプションは、×:実施なしですので、printfなどの標準ライブラリ関数を使わなければ、条件を満たします。

CubeSuite+は強力なデバッグ・ツールを持ちますので、printfを使う機会は少ないと思います。ビルド・ツールの変数/配置オプションタグのROM/RAM使用量を、はい:表示へ変更すると、saddr領域の使用量も表示されますので、148バイトよりも大きくなった時は、コンパイラ固定使用領域をsaddr領域へ変更すれば、32バイトの追加ができます。

 

以上

3回にわたって、RL78コンパイラコーステキスト、2013年5月22日Rev.1.06版の要旨を解説しました。このテキストは、非常に有用な事項を記述していますので、ぜひ、ご自身で精読されることをお勧めします。セミナに参加すれば、記述内容だけでなく、その背景や行間/ページ間の意味、重要度などいろいろなことも把握できるでしょう。残念ながらテキストのみでは、書かれてないことは推測するしかありません。本要旨では、テキストの要旨だけでなく、いろいろ推測を加えた部分もあります。また、解説もコンパイラとリンカに絞り、対象マイコンも絞って説明しました。別側面からテキストを観た結果であり、ご参考になれば幸いです。