4

I have some embedded code that writes commands to a memory address to control a peripherial like so:

void intelStartEraseBlock(uint16_t *wordAddress) {
  *wordAddress =  0x20;  //block erase
  *wordAddress =  0xD0;  //block erase confirm
}

I suspect that the optimizer is skipping the first assignment. Is this a job for volatile? or is there a better solution...

Note: this is legacy api code, so I don't plan of refactoring much. I am looking for a 'local' fix here.

4

3 に答える 3

10

volatile キーワードが作成されたのはまさにそのためです。これは、その使用法の古典的な例です。

于 2012-07-05T22:36:45.323 に答える
6

はい、データwordAddressへのポインタとして宣言するだけです。volatile

void intelStartEraseBlock(volatile uint16_t *wordAddress) {
   ...
}

このvolatileキーワードは、セマンティクスがC言語で指定された抽象仮想マシンと一致する必要があることをコンパイラーに通知します。つまり、volatile変数に書き込むたびに、コードは実際にメモリに書き込む必要があり、読み取るたびに変数からvolatile、コードは実際にメモリから読み取る必要があります。

コンパイラは、冗長であると考えている場合でも、これらの読み取りと書き込みを最適化することはできません。

ポインタ自体ではなく、宣言されているポインテッドデータである必要があることに注意してください。volatileキーワードのようにconst、それは大きな違いを生みます。はそれ自体がスタック上の変数であるためwordAddress、実際にスタックメモリに出て行く読み取り/書き込みは気にしませんが、それが指すメモリ(おそらくある種のメモリマップドI / O)は気にします実際に読み取り/書き込みされます。

于 2012-07-05T22:40:54.303 に答える
2

オペレーティングシステムがこの種のことを行うための他のメカニズムを提供していない限り、そうです、volatileは良い解決策です。

void intelStartEraseBlock(volatile uint16_t *wordAddress) {
  *wordAddress =  0x20;  //block erase
  *wordAddress =  0xD0;  //block erase confirm
}
于 2012-07-05T22:39:42.717 に答える