デバイスドライバまたはレジスタの特定の場所/アドレスに書き込む方法は?
レジスタの内容にアクセスするには、指定されたレジスタのアドレスへの符号なしポインタを作成する必要があると思います。
#define REG *(unsigned int *)&0xABCBBABA
ハードウェアレベルのプログラミングに関する基本/前提条件を教えてもらえますか?
誰かがクアルコムのソフトウェアプロファイルの仕事についてある程度の知識を持っている場合。教えてください
デバイスドライバまたはレジスタの特定の場所/アドレスに書き込む方法は?
レジスタの内容にアクセスするには、指定されたレジスタのアドレスへの符号なしポインタを作成する必要があると思います。
#define REG *(unsigned int *)&0xABCBBABA
ハードウェアレベルのプログラミングに関する基本/前提条件を教えてもらえますか?
誰かがクアルコムのソフトウェアプロファイルの仕事についてある程度の知識を持っている場合。教えてください
&
はい、あなたの例の無関係な演算子を除いて、基本的にはそれだけです。特定のアドレスを指すポインターを作成するだけで、そのポインターを介して読み取りまたは書き込みを行うことができます。
もちろん、移植性はありませんが、埋め込みスペースにいるので、それほど問題にはなりません。
よく目にするのは、次のように指定されたさまざまなアドレスを含むヘッダーファイルです。
// Bit masks for control, and control/data locations.
#define UART_CTRL_READREADY 0x01
#define UART_CTRL_WRITREADY 0x01
#define UART_CTRL (*((unsigned char *)(0xcafebabe)))
#define UART_DATA_READ (*((unsigned char *)(0xdeadbeef)))
#define UART_DATA_WRIT (*((unsigned char *)(0xca11ab1e)))
(そしてvolatile
キーワードはここで役に立つかもしれません)あなたが簡単にコード化できるように:
// Wait for data to become available.
while (!(UART_CTRL & UART_CTRL_READREADY))
;
// Get it then clear flag for next byte
databyte = UART_DATA_READ;
UART_CTRL &= ~UART_CTRL_READREADY;
もちろん、関数内の複雑さを隠して、あまり影響を与えずに変更できるようにすることも検討できます。のようなもの:
int getFlag (char *location, unsigned char mask);
void setFlag (char *location, unsifgned char mask, int setFlag);
unsigned char getData (char *location);
これは遅くなる可能性がありますが、コードを変更する必要がある場合は、タスクが大幅に簡単になります。
このような低レベルのコーディングに関するポインタに関しては、Cの「通常の」コーディングと同じです。一部の低レベルのデバイスではそのレベルの操作が必要になる場合があるため、ビット単位の演算子を確認することをお勧めします。