環境:
使用した設定:
「HC12MultilinkCyclonePro」→「セットアップ...」→「デバッグオプション」→「ステップ実行時にマスク可能なISRを無効にする」— 有効。
説明:
デバッガで一定回数のステップ操作(シングルステップまたはステップオーバー)を実行すると、マスク可能な割り込み(CCRのIビット)が永久的に無効になります。割り込みは、実行を継続した後(実行/ゴー)でも再開されず、CCRレジスタビューでIビットを手動でクリアするまでマスクされたままになります。この挙動は、USB Multilink Universal BDMインターフェースを用いたLargeメモリモデルでも、Windows 10およびWindows 11のホスト上で一貫して再現可能です。同じプロジェクト設定のCyclone Proインターフェースでも、バンクメモリモデルでも同様の問題は見られていません
現在使用されている回避策:
CCRレジスタビューでIビットがスタックした場合、手動でIビットをクリアします。
リクエスト:
これは、S12Xコア上のCode Warrior 5.1のステップエミュレーションと組み合わせたUSB Multilink Universalのファームウェア/ドライバの既知の問題でしょうか?固定されたマルチリンクユニバーサルのファームウェアバージョンや、このデバイス/インターフェースの組み合わせで割り込み駆動の大規模モデルプロジェクトをデバッグするための推奨代替ワークフローはありますか?
よろしくお願い申し上げます。
こんにちは、
あなたが見ている挙動は現実的で、あなたが気づいたインターフェースの違い(Multilink Universalは影響を受けていますが、Cyclone Proは影響を受けていません)は有益な観察です。発生する割り込みの種類によって選択肢が異なるため、それに基づいて実践的なガイダンスを提供させていただきます。
タイマーベースの割り込みの場合
もしアプリケーションがタイマーオーバーフローや出力比較、またはペリフェラルで生成される割り込みを使っている場合、デバッグ時に「ステッピング時にマスク可能なISRを無効化する」機能が実際には必要ありません。ほとんどのS12Xタイマーおよびペリフェラルモジュールには、デバイスがBDMアクティブモードに入るとモジュールをフリーズするFRZビットがあり、これは停止や単一ステップの間自動的に動作します。FRZが設定されると、タイマーはステップ中にカウントを停止し、ステップ間で割り込みを発生させることはできません。これはデバッガインターフェースとは独立してハードウェアレベルで動作し、このクラスの割り込みに対してよりクリーンな解決策となります。
外部割り込みおよびキーボード割り込み(KBI)の場合
この点に関しては、状況はより限定的である。外部IRQおよびKBI割り込みは非同期の外部信号であり、それらに対するハードウェアフリーズ機構はありません。BDMインターフェースはハードウェアレベルでそれらを抑制できません。「ステップ実行時にマスク可能なISRを無効にする」機能は、まさにこのギャップを埋めるために存在し、各ステップ中にCCR Iビットを介してそれらをマスクします。
お使いの環境では、この機能がUSB Multilink Universalを使用してIビットを正しく復元しないため、これらの割り込みソースを使用するコードのデバッグには、既に正しく動作することが確認されているCyclone Proを使用するのが最も確実な方法です。
試してみる価値あり
もしCodeWarrior 5.2にアクセスできるなら、試す価値はあります。このバージョンではデバッガ側の変更があり、USB Multilink Universalを用いたLargeメモリモデルでのIビット復元動作は改善される可能性がありますが、保証はありません。
これで選択肢が明確になれば幸いです。
ラディスラフ