2013-10-09 1 views
2

У меня есть некоторый кодВсегда ли Volatile означает регистр процессора? и отношение к памяти отображается

// Locals to hold pointers to the hardware 

static volatile uint32_t *gpio ; 
static volatile uint32_t *pwm ; 
static volatile uint32_t *clk ; 
static volatile uint32_t *pads ; 

    void setPadDrive (int group, int value) 
{ 
    uint32_t wrVal ; 

    if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) 
    { 
    if ((group < 0) || (group > 2)) 
     return ; 

    wrVal = BCM_PASSWORD | 0x18 | (value & 7) ; 
    *(pads + group + 11) = wrVal ; 

    if (wiringPiDebug) 
    { 
     printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ; 
     printf ("Read : %08X\n", *(pads + group + 11)) ; 
    } 
    } 
} 

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

также, как CPU знает, какое место памяти будет направлять на какой регистр? Мне не хватает таблицы, которая указывает на это?

+0

Я думаю, вы имели в виду [это] (http://stackoverflow.com/questions/578202/register-keyword-in-c). – Mauren

+0

@Mauren Я так не думаю. Это явно встроенное программирование, и 'volatile' используется много для этой конкретной цели. – orlp

ответ

1

Нет, volatile означает, что компилятор C не будет оптимизировать код относительно переменной. Это абсолютно важно, когда речь идет о взаимодействии с аппаратными средствами с помощью указателей.

Как довольно надуманный пример, допустим, у меня есть указатель printer, который настроен таким образом, что машина будет печатать любой сохраненный в нем байт. Затем этот код будет печатать aa:

*printer = 'a'; 
*printer = 'a'; 

Однако компилятор может думает, что второе задание не является необходимым и оптимизировать его - volatile препятствует этому.


В вашем конкретном примере, кажется, машина была создана такой, что определенные функции адреса памяти в качестве регистров (или регистрации прокси-серверов).

Смежные вопросы