プロセッサレジスタの概念について誤解があります。アドレスのあるレジスタがあります。たとえば、0x0345678です。このレジスタは32ビット幅/長さです(今は関係ありません。どちらのワードが正しいかは関係ありません)。マニュアルに書かれているように、ある種のテーブル/配列があります。
位置の値 0 111111 ... 10b 1 111111 ... 11b 2 7A ........................。 7 3F7C
位置2の値にアクセスする必要があります。最初に行ったことは次のとおりです。
#define REG 0x0345678
void somereadfunction()
{
volatile unsigned int *pval = (volatile unsigned int *)REG;
printf("%x", *(pval | 0x02));
}
そして、あなたがすでに推測したように、それは間違った仮定でした。
別の試みはこれでした:
for(unsigned int i = 0; i < 3; i++)
{
printf("i: %d, res: 0x%08X", i, *((volatile unsigned int *)REG));
}
そしてそれは動作します。だから、私の質問は、なぜそしてどのように?プロセッサは、別の開発者によって作成された魔法のアルゴリズムを使用してレジスタ値を切り替えるだけですか?私はそれについて少し混乱しています。いくつかの簡単なビット演算を使用してレジスタの3番目のビットにアクセスする方法を知っていますが、レジスタを3回呼び出すだけで、正しい値を取得する方法がわかりません。
よろしくお願いします。
追加:プロセッサはARM7です。i2cデバイスを使用しました。