Передача указателя на отображенный в память интерфейс - PullRequest
2 голосов
/ 11 ноября 2010

У меня есть глобальный указатель на устройство отображения памяти, инициализированный следующим образом:

volatile char *base_address = (char *) 0xa0000000;

Во время выполнения программы у меня есть оператор switch, и в зависимости от входных данных указатель base_address должен быть скорректирован, как вы можетесм. ниже:

    switch (input) {
        case 'S': 
        base_address = (char *) 0xa0001000;
        InitDevice();
    break;
        case 'A': 
        base_address = (char *) 0xa0001000;
        InitDevice();
            break

TBH, мне это кажется грязным хаком, и было бы, вероятно, лучше передать base_address функции InitDevice((char *) 0xa0001000).Будет ли последний способ сделать это лучше или есть лучшие подходы?

Большое спасибо, Алекс

1 Ответ

5 голосов
/ 11 ноября 2010

Да, явная передача обязательного параметра в функцию всегда лучше, чем передача его через глобальную переменную.

Во встроенной среде вам, возможно, придется учитывать, что для вызова функции с параметром может потребоваться, чтобы параметр был помещен в стек и извлечен в противном случае (если компилятор не оптимизирует и не передаст его в регистр).Но я бы не стал оптимизировать, основываясь на этом, если бы не установил (путем измерения), что выигрыш в скорости действительно стоит загрязнять код.
(И так как ваш пример переключает вход, который обычно идет с ледяной скоростью по сравнению сстековые операции, это не должно быть проблемой в любом случае.)

Однако, как сказал Ларс в комментарии, было бы лучше, если бы эти буквальные адреса были заменены символическими константами:

volatile char* const A_base_address = (char *) 0xa0001000;
volatile char* const S_base_address = (char *) 0xa0001000;

switch (input) {
case 'S': 
    InitDevice(S_base_address);
    break;
case 'A': 
    InitDevice(A_base_address);
    break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...