6

アドレス 0x8000000 に 0x00001234 を書き込む必要があるのですが、C では可能ですか?

4

3 に答える 3

17

組み込みシステムでハードウェアレジスタを使用する場合、標準的な方法は次のとおりです。

int volatile * const p_reg = (int *) 0x8000000;
*p_reg = 0x1234;

volatileを省略すると、コンパイラの最適化で多くの問題が発生する可能性があります

于 2013-10-02T09:50:39.813 に答える
8

できますが、プログラムがこのメモリ アドレスにアクセスできないため、99.9999..9% の確率でセグメンテーション違反が発生します。

int *nb = (int *) 0x8000000;
*nb = 0x00001234;
于 2013-10-02T09:37:24.533 に答える
0

これが AC クラスの初心者課題である場合、セグメント オフセット アドレス スキームを使用して 16 ビット環境でプログラミングしているターボまたはボーランド C であると思われます。その場合、int * far ptrを使用し、farが現在のセグメントのアドレスにアクセスするためのポインター型であることが使用されます。0xb8000000 は、テキスト モード ビデオ メモリの開始アドレスでした。

すなわち

int far * p = 0xB8000000;
*p = 'A'; // This would actually print char 'A' on screen
*(p+1) = <some number>; // this would determine the color of char A

これは 16 ビット プログラミングであったことに注意してください。したがって、通常の int * は 16 ビットになるため、メモリの現在のセグメントを超えてアクセスすることはできません。

以前は、ビデオ メモリに直接書き込むことで、独自の printf を実装していました。これは、10 年以上前の C プログラミング コースの授業課題でした。あなたのシナリオと一致するかもしれません。

この説明も参考になるかも

于 2013-10-02T10:03:14.750 に答える