2

特定のメモリアドレス (0x1228A432) でレジスタにバイトを書き込みたい

ただし、このレジスタには次の構造があります。

 Bits  |   Access   |   Name   | Reset  | Description |
[31:8] | Read only  | -------- | ------ |  Reserved   |
[7:0]  | Read-write | REG[7:0] | 0xXX   | ----------- |

予約済みビットに「触れる」ことなく、このレジスタにバイトを書き込む方法を教えてください。

EDIT1: 私のターゲットは Cortex A9 です。256 ビット値 (0xFF など) を使用して、オンボード DDR2 メモリの読み取り/書き込みに成功しました。

EDIT2:私は次の方法でDDR2メモリを使用していました:

// First stage
static unsigned char *p = 0;
char * argv1="0x60000000";
unsigned long address=strtoul(argv1, 0, 0);
p = (unsigned char *) argv1;

// Second stage
char * argv4="FF";
int value=strtol(argv4,0,16);

// Third stage
int offset = 9;
p[offset]=value;

EDIT3:次の情報を見つけました:

すべてのレジスタは 32 ビット幅で、バイト書き込みはサポートしていません。書き込み操作はワード幅である必要があり、予約済みとしてマークされたビットは、読み取り-変更-書き込みを使用して保持する必要があります。

4

3 に答える 3

2

アセンブラ命令ハンドブックで 8 ビット書き込み命令を調べてください (存在するかどうかはわかりません)。存在する場合は、そのメモリ位置への割り当てに uint8_t を使用します ( uint8_t volatile * const reg = (uint8_t volatile * const) 0x1228a432;)。

そうでなければ、オムカントが言ったことをしなさい。ビットは上書きされる前に「ゼロ」にされないため、同じ番号でビットを上書きしても、望ましくない結果が生じることはありません。

C での彼のコード (これは読みやすくするための冗長バージョンです):

uint8_t your_8_bit_value = 0x42;
uint32_t volatile * const mem_map_register = (uint32_t volatile *) 0x1228a432;
*mem_map_register = (*mem_map_register & 0xFFFFFF00) | your_8_bit_value;
于 2012-10-22T07:41:19.417 に答える
2

32 ビット幅のアクセスを想定して、ビット [31:8] を保持する 1 つの方法は、値を読み取り、ビット [7:0] をゼロにして、必要な値でビットごとに読み取り、それをレジスタに書き戻すことです。 .

のようなもの (RedX から少し盗む ;) ):

uint8_t your_8_bit_value = 0x42;
uint32_t volatile * const mem_map_register = (uint32_t volatile *) 0x1228a432;
*mem_map_register = (*mem_map_register & 0xFFFFFF00) | your_8_bit_value;

それでも、ハードウェアに関するより多くの情報が利用可能であるべきだと思います。たとえば、予約済みビットにすべて 1 を書き込む必要がある (つまり、予約済みビットは将来の使用のために予約されており、1 は安全なデフォルトであることを意味します) など、いくつかのデータシートを見てきました。手付かずは正しいことです。

ハードウェアに関する詳細を見つける必要があります-バイト幅の書き込みがサポートされているか、予約済みビットへの書き込みがおそらく無視されているか、またはすべて0/1である必要があります.

于 2012-10-22T08:17:21.530 に答える
0
[register value] = ([register value] | [00 00 00 FF]) & [FF FF FF XX]

ここで、xxは、指定されたアドレスから読み取られた1バイトであり、24ビットのマスクを設定します。そして、ビット単位で実行し、上記の値でこれが機能するはずだと思います

于 2012-10-22T07:22:51.073 に答える