2

論文の場合、揮発性変数を使用する実際のC関数を探しています。それ自体を見つけるのは難しいことではありませんが、関数の特定のブランチに到達するために、関数の実行中に揮発性変数の値を変更する必要がある関数を探しています。このようなもの:

typedef struct {
    unsigned       :6;
    unsigned FLAG1 :1;
    unsigned FLAG2 :1;
} __attribute__ ((packed)) REGISTER;

volatile REGISTER * io_ = 0x1234;

int write_to_io()
{
    while (io_->FLAG1) {};
    //io_->FLAG1 is now 0

    io_->FLAG2 = 1;

    sleep(10);

    if (io->FLAG1)  
        return 1;  //io->FLAG1 has changed from 0 to 1
    else
        return 0;  //io->FLAG1 has not changed
 }

関数の実行中に構造のさまざまなビットが変更されれば十分ですが、私の主な基準は、特定の分岐に到達するために、関数の実行中に揮発性変数の値が変更されることです。

実際の例に感謝します。Web上でvolatileを使用した多くの例を見つけることができませんでした。

4

4 に答える 4

8

標準的な (そして移植可能な) 例は、非同期シグナルの処理です。(おそらく、Ctrl-C を使用して SIGINT をプログラムに配信できます)。

#include <signal.h>
#include <stdio.h>

volatile sig_atomic_t quit;

void signal_handler(int sig)
{
    signal(sig, signal_handler);
    quit = 1;
}

int main(void)
{
    signal(SIGINT, signal_handler);
    puts("Hit return to poll quit flag");
    while (!quit) getchar();
    return 0;
}
于 2008-12-22T23:37:50.973 に答える
3

お気に入りのオープンソースオペレーティングシステムを選び、古いデバイスドライバーを探すと、他の方法がないものが見つかります。

于 2008-12-22T15:45:01.473 に答える
2

1 つのコンパイラ (lcc) で volatile なしで動作したが、そのプロセッサの gcc ポートで実行すると壊れた私の先生の例。揮発性を入れなければなりませんでした。

static int volatile busTimeoutSeen;

int busTimeoutISR(int irq) {
  busTimeoutSeen = 1;
  return 1;  /* skip offending instruction */
}


int memsize(void) {
  unsigned char volatile *ptr;
  unsigned char b;
  ISR oldService;

  busTimeoutSeen = 0;
  oldService = getISR(16);
  setISR(16, busTimeoutISR);
  ptr = (unsigned char *) 0xC0000000;
  while (1) {
    b = *ptr;
    if (busTimeoutSeen) {
      break;
    }
    ptr += (1 << 12);
  }
  setISR(16, oldService);
  return (ptr - (unsigned char *) 0xC0000000) >> 12;
}

最後のページを通過するまで、すべてのページから継続的に読み取ります。これにより、割り込みが発生し、割り込みが 1 に設定さbusTimeoutSeenれます。これが舞台裏で発生するため、データを常にメモリに読み書きするようにコンパイラに指示します。

于 2008-12-22T18:06:24.637 に答える
0

メモリ マップド IO は、メモリ内の値が実際に COM ポートなどのデバイスからの読み取りを表している例です。私が C を学んだとき、これは volatile キーワードの使用について与えられた例の 1 つです。

于 2008-12-23T00:30:11.023 に答える