Перейти к содержанию
    

Указатели на функции

И напоследок вопрос, который интересует меня:

__root __flash const struct token token_table[]

зачем в этой строке стоит "struct" ?

 

Дык описываю массив структур типа token

Там выше описана структура

struct token

{

const char __flash *str;

void (*fun)(void);

};

Иначе это было-бы описание простого типа (например через typedef) с именем token.

По крайней мере так IAR не ругается :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я вот тоже думаю, что дело в чём-то другом. А чтобы точно определиться нужно всего-лишь скомпилить прогу (желательно без nop'ов), заархивировать все листинги и дать посмотреть. То бишь прикрепить к посту. Тогда станет ясно, кто виноват.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/* Обработчик "OK" */

void fun_OK(void)

{

if(error_cnt)

 

error_cnt --;

(*fun_OK_addr)(); // Запуск обработчика по указателю ????????

asm("nop"); // Лекарство от зависания :( !!!

return;

}

Странно все это. Почему не просто вызвать функцию? Для чего такой наворот?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Примерно так:

// Структура таблицы ключевых слов

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

void SetHex(void) { // пример функции
    BASE=16;
}


typedef struct {
    char Name[10];
    void (*Action)(void);
} tDictionary;

tDictionary __flash Dictionary[] = {
    { "HEX",    SetHex},
    { "DECIMAL",    DECIMAL },
    { ".",        DOT },
    { "@",        Reference },
    { "!",        Dereference },
    { "SP.",    stackdump },
    {"LOOK",    LOOK },
    {"DUMP",    DUMP },
    {0, 0}    // end of dictionary
};



static tDictionary __flash *LP;

    for ( LP = Dictionary; LP->Action !=NULL; LP++ ) {    // seach word
        if ( strcmp_P(token,LP->Name) == 0 ) break;
    }

    if ( LP->Action != NULL) // execute if token was found
        LP->Action();
    else   // else seach digit
        if (!pushDigit(token)) {                        //  !!! can't interpret
            static __flash char str[] = " is undefined";
            ErrMes(str,token); break;
        }

Изменено пользователем Сергей Борщ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Точно - в другом месте ;) . А вставка лишнего nop-а перед вызываемой функцией благотворно влияет на карму Меги168 (она видать очень любит четные CALL-ы) поэтому она благополучно не замечает того другого ошибочного места.

IAR-овцы тоже ошиблись когда патч на релиз выкладывали - у них всегда константные исполнимые вектора везде великолепно работали...

 

"Доктор, не делайте из меня эйдиота" :) .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...