MSP430デバイスエラッタ対処のためののワークアラウンド
テクニカル・ノート 170627
アーキテクチャ:
MSP430
コンポーネント:
compiler
更新日:
2018/09/04 6:35
はじめに
このテクニカルノートでは、IAR Embedded Workbench for MSP430に実装されているMSP430のハードウェアの問題(デバイスエラッタ)に対するワークアラウンドを紹介します。
解説
コンパイラのワークアラウンド
コンパイラに関しては、次のハードウェアの問題について検討しました。
CPU4
--core=430を追加すると、コンパイラはPUSH #4/#8に対して安全な代替エンコードを使用します。
CPU6
--hw_workaround=CPU6を追加すると、コンパイラは、RnがPCでなければ @Rn オペランドを0(Rn)と入れ替えます。ランタイムライブラリは--hw_workaround=CPU6を有効化してビルドされます。ただし、IDEは、影響を受けるデバイスに対してこのワークアラウンドを自動的に有効化することはありません。
CPU8
コンパイラは、SPレジスタに奇数を設定するようなコードを生成しません。SPレジスタ内の値は常に偶数とみなします。
CPU11、CPU12、CPU13、CPU45
IAR Embedded Workbench for MSP430ツールチェーンでは対応していません。
CPU15
CPU15の影響を受けるデバイスが、影響を受けないデバイスとは別の場所にブランチを作成するような状況では、コンパイラはシンボル値?CPU15_OFFSETをブランチオフセットに追加します。この値は、リンカコマンドファイルで0(影響を受けないデバイス)または2(影響を受けるデバイス)のどちらかに指定されています。
CPU16
コンパイラは、影響を受けるデバイスまたは影響を受けないデバイスのどちらでも動作するコードを生成します。
CPU18、CPU19、CPU24、 CPU25、CPU27、CPU29
--hw_workaround=nop_after_lpmオプションを追加すると、コンパイラは、ステータスレジスタSRのLPMビットを変化させる可能性のある全ての命令の後ろにNOPを自動的に発行します。ランタイムライブラリは、--hw_workaround=nop_after_lpmを有効化してビルドされます。IDEは、影響を受ける全てのデバイスに対してこの有効化を自動的に行います。
CPU20
影響を受けるデバイスのリンカコマンドファイルでは、メモリ領域が有効なメモリを伴わない場合、その領域の最後の4バイトにはデフォルトセグメントのコードを置くことができません。リンカコマンドファイル内でアドレス範囲を変更する場合やカスタムセグメントを追加する場合は、必ずこの制限事項を守ってください。
CPU21
コンパイラは、POPM #1, SRを生成しません。
CPU22
@PCオペランドは実際のアプリケーションでは役に立たないため、コンパイラが生成することはありません。
CPU23、CPU34
PCレジスタを循環させる命令は実際のアプリケーションでは役に立たないため、コンパイラが生成することはありません。
CPU26
コンパイラは、CALL SP命令を生成しません。
CPU28
コンパイラは、この問題を引き起こすような命令シーケンスを生成しません。
CPU30
CPU30の影響を受けるデバイスが、影響を受けないデバイスとは別の場所にブランチを作成するような状況では、コンパイラはシンボル値?CPU30_OFFSETをブランチオフセットに追加します。この値は、リンカコマンドファイルで0(影響を受けないデバイス)または2(影響を受けるデバイス)のどちらかに指定されています。
CPU31
コンパイラは、プッシュ命令で自動インクリメントモードを使用するコードは生成しません。
CPU32
コンパイラは、CALLA PC命令を生成しません。
CPU33
コンパイラは、負のスタックオフセット値は使用しません。使用中のスタック外の未配置メモリにアクセスすることになるためです。そのようなメモリは、割込み発生により破壊される可能性があります。
CPU35
コンパイラは、BIT.B @Rx, PC 命令を生成しません。
CPU39
コンパイラは--core=430Xを追加すると、割込みを無効化する可能性のある全ての命令の後ろにNOPを設定します。
CPU40
コンパイラは--hw_workaround=CPU40を追加すると、セグメント部の最後の命令がジャンプ命令だった場合、常にNOPを省略します。IDEは、影響を受ける全てのデバイスに対してこの省略を自動的に行います。
アセンブラでのワークアラウンド
アセンブラに関しては、次のハードウェアの問題について検討しました。
CPU4
MSP430アーキテクチャ(-v0)の場合、アセンブラはPUSH #4/#8命令に対して安全な代替エンコードを使用します。
CPU6
-hを追加すると、アセンブラは、RnがPCでなければ @Rn オペランドに対してエラーを発生します。ランタイムライブラリは-hを有効化してビルドされます。ただし、IDEは影響を受けるデバイスに対して、このワークアラウンドを自動的に有効化することはありません。
CPU8
SPレジスタに対しては、決して奇数を設定しないでください。また、コンパイラは、SPレジスタ内の値は常に偶数とみなします。ランタイムライブラリ内のアセンブラファイルはSPレジスタに奇数を設定することはありません。
CPU11, CPU12, CPU13, CPU45
IAR Embedded Workbench for MSP430ツールチェーンでは対応していません。
CPU15
CPU15の影響を受けるデバイスが、影響を受けないデバイスとは別の場所のブランチを作成するような状況では、シンボル値?CPU15_OFFSETをブランチオフセットに追加できます。この値は、リンカコマンドファイルで0(影響を受けないデバイス)または2(影響を受けるデバイス)のどちらかに指定されています。ランタイムライブラリのアセンブラファイルでは、影響を受けるデバイスと影響を受けないデバイスの両方で動作させる必要がある場合、?CPU15_OFFSETを使用します。
CPU16
コードは、選択したターゲットデバイスで動くように書く必要があります。ランタイムライブラリでは、アセンブラファイルは影響を受けるデバイスでも影響を受けないデバイスでも動くように書き込まれています。
CPU18、CPU19、CPU24、CPU25、CPU27、CPU29
--hw_workaround=nop_after_lpmオプションを追加すると、アセンブラは、ステータスレジスタSRのLPMビットを変化させる可能性のある命令を検出した場合、その直後にNOPがなければ、警告を発します。その命令がLPMビットを変化させないことが確かな場合、警告発生のトリガとなる行の直前の行にアセンブラ指示文SUPPRESS_NOP_AFTER_LPM_WARNINGを置くことで、この警告の発出を抑制できます。ランタイムライブラリは--hw_workaround=nop_after_lpmを有効化してビルドされます。IDEは、影響を受ける全てのデバイスに対してこの有効化を自動的に行います。
CPU20
影響を受けるデバイスのリンカコマンドファイルでは、メモリ領域が有効なメモリを伴わない場合、その領域の最後の4バイトにはデフォルトセグメントのコードを置くことができません。リンカコマンドファイル内でアドレス範囲を変更する場合やカスタムセグメントにコードを設定する場合は、必ずこの制限事項を守ってください。
CPU21
POPM #1, SR 命令はアセンブラでエラーになります。
CPU22
@PCオペランドは実際のアプリケーションでは役に立ちません。アセンブラコードでは@PC オペランドは書かないよう注意してください。ランタイムライブラリでは、アセンブラファイルは@PC オペランドを使いません。
CPU23、CPU34
PCレジスタを循環させる命令は実際のアプリケーションでは役に立ちません。アセンブラコードではPCレジスタを循環させる命令は書かないよう注意してください。ランタイムライブラリでは、アセンブラファイルはPCレジスタを循環させることはありません。
CPU26
アセンブラコードではCALL SP 命令は書かないよう注意してください。ランタイムライブラリでは、アセンブラファイルはCALL SP命令を使用しません。
CPU28
この問題を引き起こすような命令シーケンスは書かないように注意してください。ランタイムライブラリでは、アセンブラファイルはこの問題を起こす命令シーケンスを使用しません。
CPU30
CPU30の影響を受けるデバイスが、影響を受けないデバイスとは別の場所のブランチを作成するような状況では、シンボル値?CPU30_OFFSETをブランチオフセットに追加できます。この値は、リンカコマンドファイルで0(影響を受けないデバイス)または2(影響を受けるデバイス)のどちらかに指定されています。ランタイムライブラリのアセンブラファイルでは、影響を受けるデバイスと影響を受けないデバイスの両方で動作させる必要がある場合、?CPU30_OFFSETを使用します。
CPU31
アセンプラコードでは、プッシュ命令で自動インクリメントモードを使用しないよう注意してください。ランタイムライブラリでは、アセンブラファイルは、プッシュ命令で自動インクリメントモードを使用しません。
CPU32
アセンプラコードでは、CALLA PC命令は書かないよう注意してください。ランタイムライブラリでは、アセンブラファイルはCALLA PC命令を使用しません。
CPU33
実際のアプリケーションでは、負のスタックオフセット値を使用することは許可されていません。使用中のスタック外にある未割当てのメモリにアクセスすることになるためです。そのようなメモリは、割込みの発生によっていつでも破壊される可能性があります。アセンプラコードでは、負のスタックオフセット値を使用しないように注意してください。ランタイムライブラリでは、アセンブラファイルは負のスタックオフセット値を使用しません。
CPU35
アセンプラコードではBIT.B @Rx, PC命令は書かないように注意してください。ランタイムライブラリでは、アセンブラファイルはBIT.B @Rx, PC命令を使用しません。
CPU39
MSP430Xアーキテクチャ(-v1)の場合、アセンブラは、割込みを無効化する可能性のある命令の後ろにNOPがない場合、常に警告を発します。この警告の発出は、警告発生のトリガとなる命令の前の行に指示文SUPPRESS_NOP_AFTER_ DINT_WARNINGを置くことで抑制できます。
CPU40
MSP430Xアーキテクチャ(-v1)の場合、アセンブラは、セグメント部の最後の命令がジャンプ命令だった場合、常に警告を発します。同じセグメント部内でジャンプ命令の直後にデータを置く際には、ジャンプ直後のデータワードがCPU40をトリガしないようにする必要があります。同じセグメント部内で、ジャンプの後にデータ指示文がある場合には、ジャンプの後にNOPを挿入することを推奨します。
まとめ
各ハードウェアエラッタ番号についての詳細は、お使いのデバイスのエラッタシートをご覧ください(www.ti.com/msp430)。
全ての製品名は、それぞれの所有者の商標または登録商標です。