概要
はじめに
今回はXC-DSCコンパイラについてご紹介します。
XC-DSCコンパイラとは
XC-DSC コンパイラは、Microchip(マイクロチップ)社の dsPIC 数値演算コントローラ(Digital Signal Controller:DSC)向け C/C++ コンパイラです。
dsPIC33 シリーズ(dsPIC33A/CH/CK/CX/LV など)専用で、組込み向けの高速デジタル信号処理(DSP)命令を活かせるよう最適化されている点が特徴です
従来、dsPICシリーズ向けのコンパイラといえば XC16 が主流でした。しかし現在は、用途に応じて DSP非搭載デバイス向けの「XC16」 と DSP搭載デバイス向けの「XC-DSC」 に分離されています。
記事変更履歴
| 公開/ 変更日 | 特記 |
| 25/11/14 | 初版公開。 |
ライセンス形態
以下にライセンス形態について記載します。
| ライセンス種別 | 特徴 | リンク |
| Free | 期限なし・誰でも無料で利用可能 全機能が使えるが、以下のような制限あり 最適化が限定的(-O1 相当)で、コードサイズが大きくなりやすい 実行速度も有償版に比べて劣る場合がある | MPLAB® XC DSC Compiler | Microchip Technology |
| Workstation License | 1ユーザーが指定の PC で使用する買い切り(永続)ライセンス 有償の HPA(High Priority Access)更新を行うと最適化レベルや新機能が利用可能 最大 3 台の PC でアクティベート可能(明記あり) | MPLAB XC-DSC PRO Compiler (Workstation License) | Microchip Technology |
| Subscription License | 月額または期間契約で利用できるサブスクリプション 常に最新の最適化・最新機能を利用可能 年間契約より短期利用がしやすい | MPLAB XC-DSC PRO Compiler (Subscription License) | Microchip Technology |
| Network License | 複数ユーザー・チーム向け ライセンスサーバーで管理し、使用者間で共有可能 使用中のユーザーに一定時間ロックされる仕組み | MPLAB XC-DSC PRO Compiler (Network Server License) | Microchip Technology |
| Functional Safety License | ISO 26262(自動車)、IEC 62304(医療)、EN 50128(鉄道)などの安全規格対応向け TÜV SÜD 認証付き 永続ライセンス(買い切り) | MPLAB XC-DSC FUNCTIONAL SAFETY COMPILER LICENSE | Microchip Technology |
コンパイラ最適化レベルについて
コンパイラの最適化レベルとは、C/C++ などのソースコードをコンパイルして生成される機械語(実行可能コード)の 速度やサイズ、デバッグのしやすさを調整する設定 のことです。
組込み開発では、CPU の性能やメモリ容量が限られているため、コンパイラ最適化レベルの選択は非常に重要です。
以下にコンパイラのレベルとライセンスについて記載します。
| 最適化レベル | 説明 | Licence |
| -O0 | -O0(最適化なし) 何もしない最適化レベル(デフォルト) コンパイラはコードをそのまま翻訳する デバッグ優先 ブレークポイントで停止した際に、変数の値を書き換えたり、プログラムカウンタを任意の文に移動しても、ソースコード通りの結果が得られる 各文は独立している コンパイルコスト(時間)も最小化される | Free,Pro |
| -O1 | -O1(または -O) – 軽度最適化 速度とコードサイズの両立を目指す最適化レベル コンパイルにやや時間がかかる 大きな関数ではホストPCのメモリも多く消費 コンパイラの目標: ・コードサイズを削減 ・実行速度を向上 デバッグはまだ比較的可能 ・変数やプログラムフローへの影響は最小限 | Free,Pro |
| -O2 | -O2 – 中程度の最適化(速度重視) -O1 よりもさらに速度を重視した最適化 コンパイル時間は長くなる 生成されるコードの実行性能が向上 デバッグはやや難しくなる ・変数の割り当てやステップ実行がソースコード通りにならない場合がある 大規模な関数やループで特に効果が高い | Free,Pro |
| -O3 | -O3 – 高度な速度最適化 -O2 の最適化をすべて含み、さらに追加の高速化最適化を適用 ループ展開、関数のインライン化、積極的な命令再配置などを行う コンパイル時間はさらに長くなる 生成コードの実行速度は最大化される デバッグは難しくなる ステップ実行や変数ウォッチの挙動がソースコード通りでない場合がある | Pro |
| -Os | -Os – コードサイズ優先の最適化 コードサイズを最小化することに特化した最適化レベル -O2 の最適化のうち、コードサイズを増やさないものを有効化 さらに サイズ削減のための追加最適化 を実施 実行速度もある程度向上する場合があるが、速度優先ではない デバッグはやや難しくなる(-O2 と同様) | Pro |
V3.30の変更点
機能追加
| No. | 内容 |
| 1 | VS Code® 用の MPLAB® Extensions における逆アセンブル(disassembly)機能のサポートが提供 |
| 2 | dsPIC33A デバイス向けには、ramfunc 属性を使用することで RAM からコードを実行する機能が追加 |
| 3 | dsPIC33A デバイス向けには、ramfunc 属性を使用することで RAM からコードを実行する機能が追加 |
| 4 | picolibc が dsPIC デバイスへ移植されました。 このライブラリは、MPLAB X® の「Global Options」ペインで -mchp-stdlibc=picolibc オプションを使用して選択可能 |
| 5 | Thread Local Storage(TLS) は、GNU の __thread キーワード を使って宣言可能 |
| 6 | メモリレポートに、プログラム済み/未プログラムのフューズ定義の詳細が含まれるようになり、フューズ定義漏れによるエラーの特定に役立つようになりました。この機能には更新された DFP が必要 |
| 7 | 新しい属性 xcdsc_obfuscate を使用することで、オブジェクトファイル内の名前を難読化し、逆アセンブルしたコードの意図が読み取りにくくなりました |
修正内容
V3.30では多くの最適化や機能追加などがなされたようです。
| No. | 内容 |
| XCDSC-94 | -mreserve がリンカスクリプトの宣言からプログラムメモリセクションを作成できない |
| XCDSC-126 | ドキュメントアーカイブツールの -D オプション |
| XCDSC-133 | dsPIC33A 向け Fract/Accum 型に関するドキュメント改善 |
| XCDSC-246 | カスタム割り込みベクタテーブルを作成するための -ivt -civt オプションの説明追加 |
| XCDSC-252 | ライブラリマニュアルへ「汎用」ライブラリ作成手順の記載 |
| XCDSC-259 | __builtin_mul の例に関するドキュメント改善 |
| XCDSC-269 | 単一ビットのクリア処理を最適化(dsPIC33A) |
| XCDSC-271 | ゼロ判定の最適化(dsPIC33A) |
| XCDSC-272 | 一部の内部コンパイラエラーをより分かりやすいメッセージへ変更 |
| XCDSC-275 | 浮動小数点リテラル値を直接 FPU レジスタへロードする機能(dsPIC33A) |
| XCDSC-279 | 参考になる “興味深い” シンボルリストの作成とドキュメント化 |
| XCDSC-289 | コンフィグビットがコードで明示設定されていない場合に情報を出力 |
| XCDSC-290 | XOR.b ZE.bz シーケンスを XOR.bz へ最適化(dsPIC33A) |
| XCDSC-291 | -Os、-O2、-O3 におけるアドレスロード処理の最適化改善(dsPIC33A) |
| XCDSC-299 | RAM 上に実行可能コードを配置するためのサポート(dsPIC33A) |
| XCDSC-304 | VS Code® 向け逆アセンブル機能の提供 |
| XCDSC-319 | 負の float 値が _Fract へ正しく変換されない |
| XCDSC-329 | コンパイラマニュアルのセクション 22.5 を更新 |
| XCDSC-331 | ocal-stack 機能に関わるドキュメント改善 |
| XCDSC-386 | アセンブラのリスティングオプション -ai が誤ったコードセクション長を表示(dsPIC33A) |
| XCDSC-388 | 「未使用セクションの削除」機能に関するドキュメント修正 |
| XCDSC-409 | xc-dsc-objdump で変数名を難読化 |
| XCDSC-410 | 予備フューズを自動的にミラーリングして一般的なエラー要因を排除 |
| XCDSC-412 | .pushsection と .popsection の不一致を検出し警告を出す |
| XCDSC-423 | dsPIC33A において no-data-init スタートアップコードが提供されていない |
| XCDSC-424 | dsPIC33A のスタック解析が動作しない |
| XCDSC-431 | ビットフィールド型がレジスタ書き込みへ影響(dsPIC33A) |
| XCDSC-434 | XC-DSC で picolibc をサポート |
| XCDSC-437 | __builtin_fma、__builtin_fmaf、__builtin_fmal のドキュメント追加 |
| XCDSC-461 | デバイスサポートファイルをコンパイラインストールから削除 |
| XCDSC-474 | dsPIC33A のシフト左・シフト右が、入力を完全に使う前に上書きする可能性 |
| XCDSC-478 | __builtin_flim が内部コンパイラエラーを生成する可能性 |
| XCDSC-480 | round() が正しく動作しない(dsPIC33A) |
| XCDSC-484 | 割り込みのリマップ機能に関する説明を明確化(dsPIC33A) |
| XCDSC-491 | 32-bit デバイス向け libdsp の「vmax」「vmin」関数を更新し、ドキュメントを改善 |
| XCDSC-502 | dsPIC33CH デバイス向けのエラッタ回避策の実装 |
| XCDSC-510 | --fillupper オプションのドキュメント修正 |
| XCDSC-513 | -munified 使用時の snprintf() が正しくない |
| XCDSC-562 | XCLM を最新バージョンへ更新 |
| XCDSC-576 | 長さゼロのセクションがリンカによって破棄される |
| XCDSC-580 | 初期化済みデータセクションを /DISCARD/ すると GLD 機能でセグフォルトが起こる可能性 |
| XCDSC-587 | dsPIC33A で 32bit 超のアライメントを持つ構造体に対して memset が失敗 |
| XCDSC-594 | 64-bit 値との比較が正しくない |
| XCDSC-601 | switch 文が最適化不良で誤った動作を引き起こす可能性 |
| XCDSC-602 | -Os と -g の組み合わせで Internal Compiler Error |
記事についての注意点
本記事は慎重に内容を検討し正確さに努めておりますが、内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。


コメント