揮発性のアプリケーションシナリオ

変数揮発性を宣言するために使用すると、予期しない、変数が更新されることがあります1は、それが変数の値が誤って随時更新される可能性が修正することをコンパイラに指示します。

 

2、文法

  揮発性のint fooという。
  揮発性FOOをint型。

  

  揮発性のint * fooという。 
       int型揮発性* fooという。

  

  int型*揮発性のfoo;

 

  int型揮発性*揮発性のfoo;

 

3、シーン

  1)パラレルデバイスのハードウェアレジスタ(例えば、ステータスレジスタ)

  私たちは、アドレス0x1234の上でマッピングされた8ビットのレジスタを持っていると仮定します。私たちは、その値は、これまでゼロでなくなるまで、ステータス・レジスタを必要とするシステムを監視してきました。エラーは、一般的に実施される方法である:

UINT1 * PTR =(UINT1 *)0x1234の; 
//登録は非ZERO待ちゼロ以外を登録待ちになります。
しばらく(* PTR == 0);
他のために//実行(Do)何か。他のもの

アセンブリコード:

    MOV PTR、#0x1234の 

    MOV、@ptr 

    ループコンパイラBZループは、変数の値が常に同じに考えて、無限ループで終わるために、メモリに読み込まする必要はありません

正しいです:

    * PTR =揮発性UINT1 
    (UINT1揮発性*)0x1234の、 

    アセンブリコードである:
    MOV PTR、0x1234の#
    @ptrループMOV A、 
    BZループ 

  2)割り込みハンドラ

頻繁に割り込みハンドラが照会されているメインプログラム内のいくつかの変数の値を更新する責任があります。例えば、シリアル通信割込みをするETXかどうかを受信したすべてのバイト検出信号(メッセージフレーム終了フラグを確認するために)を。1バイトETX場合は、割り込みハンドラは、グローバルフラグを変更することです。この方法は、エラーを実装することができる:

  INT etx_rcvd = FALSE; 
  ボイドメイン()
  {
  ...
  レジスタの一方(Ext_rcvd!)の値がバックアップext_rcvdにアクセスされる
  {
  //待機
  }
  ...
  } 
  rx_isr空隙割り込み(ボイド)
  {
  ...
  IF(== ETXをrx_char)
  {
  etx_rcvd = TRUE;
  }
  ...
  }

 

  3)マルチスレッドアプリケーション

在实时操作系统中,除去队列、管道以及其他调度相关的通讯结构,在两个任务之间采用共享的内存空间(就是全局共享)实现数据的交换仍然是相当常见的方法。当你将一个优先权调度器应用于你的代码时,编译器仍然不知道某一程序段分支选择的实际工作方式以及什么时候某一分支情况会发生。这是因为,另外一个任务修改一个共享的全局变量在概念上通常和前面中断处理程序中提到的情形是一样的。所以,(这种情况下)所有共享的全局变量都要被声明为 volatile。例如:

int cntr; 
void task1(void)
{
cntr = 0;
while (cntr == 0)
{
sleep(1);
}
...

void task2(void)
{
...
cntr++;
sleep(10);
...
}

 

  4)利用for循环去延时的程序

おすすめ

転載: www.cnblogs.com/Yu-Weijie/p/11886549.html