Пример C Функция, использующая переменные переменные - PullRequest
2 голосов
/ 22 декабря 2008

для бумаги Я ищу реальную 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
 }

Было бы достаточно, если во время выполнения функции изменились разные биты структуры, но мой главный критерий состоит в том, что для достижения определенной ветви значение изменчивой переменной изменяется в течение выполнение функции.

Буду очень признателен за любые примеры из жизни. Мне не удалось найти много примеров использования volatile в Интернете.

Ответы [ 4 ]

8 голосов
/ 23 декабря 2008

Канонический (и переносимый) пример обрабатывает асинхронный сигнал. (Возможно, вы можете доставить SIGINT в вашу программу с помощью Ctrl-C).

#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;
}
3 голосов
/ 22 декабря 2008

Выберите вашу любимую операционную систему с открытым исходным кодом и найдите старые драйверы устройств, вы найдете тех, у кого нет другого способа работы.

2 голосов
/ 22 декабря 2008

Пример моего учителя, который работал без volatile с одним компилятором (lcc), но сломался, когда я запустил его с портом 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;
}

Он непрерывно читает со всех страниц, пока мы не пройдем последнюю страницу, что вызывает прерывание, которое установит busTimeoutSeen в 1. Поскольку это происходит за кадром, мы говорим компилятору всегда читать и записывать данные в память.

0 голосов
/ 23 декабря 2008

Введенный в память ввод-вывод является примером, в котором значение в памяти может фактически представлять чтение с устройства, такого как COM-порт. Когда я изучил C, это был один из примеров использования ключевого слова volatile.

...