XC-DSCコンパイラについて

dsPIC33Aシリーズ

概要

はじめに

今回は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 License1ユーザーが指定の 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 LicenseISO 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.内容
1VS Code® 用の MPLAB® Extensions における逆アセンブル(disassembly)機能のサポートが提供
2dsPIC33A デバイス向けには、ramfunc 属性を使用することで RAM からコードを実行する機能が追加
3dsPIC33A デバイス向けには、ramfunc 属性を使用することで RAM からコードを実行する機能が追加
4picolibc が dsPIC デバイスへ移植されました。
このライブラリは、MPLAB X® の「Global Options」ペインで -mchp-stdlibc=picolibc オプションを使用して選択可能
5Thread Local Storage(TLS) は、GNU の __thread キーワード を使って宣言可能
6メモリレポートに、プログラム済み/未プログラムのフューズ定義の詳細が含まれるようになり、フューズ定義漏れによるエラーの特定に役立つようになりました。この機能には更新された DFP が必要
7新しい属性 xcdsc_obfuscate を使用することで、オブジェクトファイル内の名前を難読化し、逆アセンブルしたコードの意図が読み取りにくくなりました

修正内容

V3.30では多くの最適化や機能追加などがなされたようです。

No.内容
XCDSC-94-mreserve がリンカスクリプトの宣言からプログラムメモリセクションを作成できない
XCDSC-126ドキュメントアーカイブツールの -D オプション
XCDSC-133dsPIC33A 向け 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-290XOR.b ZE.bz シーケンスを XOR.bz へ最適化(dsPIC33A)
XCDSC-291-Os-O2-O3 におけるアドレスロード処理の最適化改善(dsPIC33A)
XCDSC-299RAM 上に実行可能コードを配置するためのサポート(dsPIC33A)
XCDSC-304VS Code® 向け逆アセンブル機能の提供
XCDSC-319負の float 値が _Fract へ正しく変換されない
XCDSC-329コンパイラマニュアルのセクション 22.5 を更新
XCDSC-331ocal-stack 機能に関わるドキュメント改善
XCDSC-386アセンブラのリスティングオプション -ai が誤ったコードセクション長を表示(dsPIC33A)
XCDSC-388「未使用セクションの削除」機能に関するドキュメント修正
XCDSC-409xc-dsc-objdump で変数名を難読化
XCDSC-410予備フューズを自動的にミラーリングして一般的なエラー要因を排除
XCDSC-412.pushsection.popsection の不一致を検出し警告を出す
XCDSC-423dsPIC33A において no-data-init スタートアップコードが提供されていない
XCDSC-424dsPIC33A のスタック解析が動作しない
XCDSC-431ビットフィールド型がレジスタ書き込みへ影響(dsPIC33A)
XCDSC-434XC-DSC で picolibc をサポート
XCDSC-437__builtin_fma__builtin_fmaf__builtin_fmal のドキュメント追加
XCDSC-461デバイスサポートファイルをコンパイラインストールから削除
XCDSC-474dsPIC33A のシフト左・シフト右が、入力を完全に使う前に上書きする可能性
XCDSC-478__builtin_flim が内部コンパイラエラーを生成する可能性
XCDSC-480round() が正しく動作しない(dsPIC33A)
XCDSC-484割り込みのリマップ機能に関する説明を明確化(dsPIC33A)
XCDSC-49132-bit デバイス向け libdsp の「vmax」「vmin」関数を更新し、ドキュメントを改善
XCDSC-502dsPIC33CH デバイス向けのエラッタ回避策の実装
XCDSC-510--fillupper オプションのドキュメント修正
XCDSC-513-munified 使用時の snprintf() が正しくない
XCDSC-562XCLM を最新バージョンへ更新
XCDSC-576長さゼロのセクションがリンカによって破棄される
XCDSC-580初期化済みデータセクションを /DISCARD/ すると GLD 機能でセグフォルトが起こる可能性
XCDSC-587dsPIC33A で 32bit 超のアライメントを持つ構造体に対して memset が失敗
XCDSC-59464-bit 値との比較が正しくない
XCDSC-601switch 文が最適化不良で誤った動作を引き起こす可能性
XCDSC-602-Os-g の組み合わせで Internal Compiler Error

記事についての注意点

本記事は慎重に内容を検討し正確さに努めておりますが、内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。

コメント

タイトルとURLをコピーしました