2012-03-13 3 views
3

ARM Cortex M3のレジスタで作業しています。ドキュメントでは、ビットの一部が「予約済み」である可能性があります。レジスタに書き込むときに、これらの予約ビットをどのように扱うべきかは、私には不明です。ARMチップの予約済みレジスタビットの処理

これらの予約ビットも書き込み可能ですか?私はそれらに触れないように慎重にすべきですか?私がそれらに触れると何か悪いことが起こるでしょうか?

+0

正確にどのチップを使用していますか? Cortex-M3は、周辺レジスタのために(おそらく)これを求めているため、コアにすぎません。 – DipSwitch

+0

@DipSwitch:まあ、私はGPIOレジスタについて話しています。 – Randomblue

+0

NXP、Freescale、AtmelのGPIOレジスタは? STMまたはおそらくLPC? – jeb

答えて

5

これは、予約済みビットをどうすればよいかに関する世界的な問題です。まず、コードにランダムに書き込んで、コードがポータブルにならないようにする必要があります。将来、アーキテクチャが予約ビットに新しい意味を割り当てるとどうなりますか?あなたのコードは壊れます。だから予約ビットを持つレジスタを扱うときの最善のマントラはRead-Modify-Writeです。つまり、レジスタの内容を読み取ると、ビットだけを変更して、を書き込んだ後、その値を書き戻して、予約ビットが変更されていないことを確認します(書き換えられないという意味ではありません。例えば、LSBitだけが意味を持ち、他のすべてが予約されているレジスタがあるとします。私はどうなるこの

ldr r0,=memoryAddress 
ldr r1,[r0] 
orr r1,r1,#1 
str r1,[r0] 
+0

これはアトミックではありません。別のプロセス(またはこれらの予約ビットを使用するハードウェアによって駆動される割り込み)は、ロードとストア間でそのレジスタ内の予約ビットを変更する可能性があり、その変更を上書きします。したがって、あなたは原子的なコンテキスト(OSプリエンプションと割り込みが無効)でそれを行うか、アトミックな比較とスワップ命令を使用する必要があります。または、BIOSやOSの原因からPCの温度センサに同時にアクセスする際に問題が発生することがあります。 –

+1

@ Z.T。あなたはここで原子性について正しいです。私は 'read-modify-write'の概念を説明するためだけにそのコードを書いています。編集しても構いません。 –

+1

@ Z.T .:いくつかのハードウェア設計者は、ソフトウェアが何をすることができるかしないかを認識していませんか?私は、レジスタを持ついくつかの部分に "write to clear"フラグと複数の状態設定の両方が含まれているのを見てきました。レジスタが状態設定のみを含む場合、ビットバンド機能を使用して、他の状態に影響を与えることなく1つの状態設定を更新することができる。フラグだけが含まれていれば、クリアしたいフラグに "1"を書き、それ以外のものには "0"を書き込むことができます。しかし、2つを組み合わせると、いずれかを更新するためのきれいな方法はありません。 – supercat

0

ほとんどの場合、このチップでは使用されませんが、フィーチャーデバイス(他の製品ライン)で使用される可能性があります。 (ほとんどのチップメーカが1つの周辺機器ドライバを作成し、すべてのチップに使用しています。これは主に過去の作業をコピーし、エラーのために変更が少なくなっています)ほとんどの場合、周辺レジスタの予約ビットこれは、それに付随するロジックがないためです。

何かを書き込むと、それが記憶されず、次回にレジスタ/ビットを読み込もうとすると、変更されていない可能性があります。

2

ドキュメントに他のヒントがない場合は、ゼロを書きます。 32ビットレジスタに広がったいくつかの予約ビットへの書き込みを避けることはできません。

+1

ドキュメントに何も言及していない場合でも、選択肢から0を書くことはできません。親切に私の答えを見てください。 –

2

リードモディファイライトは、ほとんどの時間を動作するはずしかし予備ビットが読んで定義されていませんが、特定の値が書き込まれなければならない場合がある。 LPC2000グループのthis postを参照してください(全体のスレッドも非常に面白いです)。したがって、常に慎重にドキュメントを確認し、利用可能なエラータも確認してください。不確かなことや文書が不明な場合は、メーカーに書き留めてください。

1

理想的には、読んでください - 変更 - 書き込み、成功のための保証は、新しいビットに変更すると、あなたのコードを変更するととにかく変更する必要があります。私はベンダーが予約ビットにゼロを書くことが失敗したときにチップを改造し、コードに触れなければならないことを見てきました。したがって、保証はありません。最大の手がかりは、ベンダーのコードでは、明らかに読み取り - 変更 - 書き込みまたは明らかに書き込みであるレジスタまたはセットを参照する場合です。これは、例題のさまざまなセクションを書いている異なる開発者や、その周辺機器に機密性があり、文書化されていないビットがあり、読み取り - 変更 - 書き込みが必要なレジスタが存在する可能性があります。

私が働いているチップでは、未使用のビットは何らかの方法で他の未使用ビットから目立つようにマークされていることを確認します。我々は通常、未使用/予約ビットをゼロとしてマークし、これらの他のビットは名前を取得し、この値マーキングを書き込む必要があります。すべてのベンダーがこれを行うわけではありません

保証はありません。すべてのドキュメントとサンプルプログラムにバグがあると仮定し、正しいことと間違っていることを理解するための方法をハックする必要があります。どのようなパスをとっていても(リード・モディファイ・ライト、ゼロ・ライトなど)、時折間違ってしまい、ハードウェアの変更に合わせてコードを再実行する必要があります。ベンダーがある種のチップIDを持っていれば、あなたのソフトウェアはそのIDを読み取って、あなたのコードをテストしていないIDであれば、失敗を宣言し、その部分をプログラムしないことを強くお勧めします。顧客が製品を見るずっと前の製品テストでは、部品交換が検出され、ソフトウェアが部品交換の理由を理解するのに関与し、代替部品が解決されないという解決策は互換性がなくなり、拒否されたりソフトウェアが変更されます。

関連する問題