реклама на сайте
подробности

 
 
> Указатели на функции
ArtemKAD
сообщение Jun 26 2006, 10:18
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Может кто подскажет как бороться с зависанием полученного кода если в нем использованы указатели на функцию. help.gif
Бо шаманить с лишними nop-ами уже порядком надоело... angry.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ArtemKAD
сообщение Jun 26 2006, 16:37
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Примерно так:
// Структура таблицы ключевых слов
struct token
{
const char __flash *str;
void (*fun)(void);
};

// Таблица ключевых слов и их обработчиков
__root __flash const struct token token_table[] =
{CR_LF,fun_VOID,
OK, fun_OK,

..............................................................

}

void fun_VOID(void)
{
asm("nop"); // Лекарство от зависания sad.gif !!!
return;
}

/* Обработчик "OK" */
void fun_OK(void)
{
if(error_cnt)

error_cnt --;
(*fun_OK_addr)(); // Запуск обработчика по указателю
asm("nop"); // Лекарство от зависания sad.gif !!!
return;
}


..........................................
// а вот так вызывается в коде из таблицы....
void (*p)(void);
Response--;
p = token_table[Response].fun;
(*p)();
// token_table[Response].fun(); - тоже самое, но так вроде стабильнее ;(


.............................................

К сожалению с кодом проблемы - надо перекомпилировать и много кода сюда писать....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 27 2006, 12:25
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ArtemKAD @ Jun 26 2006, 19:37) *
Примерно так:
// Структура таблицы ключевых слов
Проблема явно где-то в другом месте, потому что у меня следующий код работает во множестве процессоров без всяких выравниваний уже лет пять:
Код
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;
        }


Сообщение отредактировал Сергей Борщ - Jun 27 2006, 12:26


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ArtemKAD   Указатели на функции   Jun 26 2006, 10:18
- - _Bill   Цитата(ArtemKAD @ Jun 26 2006, 13:18) Мож...   Jun 26 2006, 10:26
- - vet   ...и при чём тут nop'ы ?   Jun 26 2006, 11:25
|- - ArtemKAD   Цитата(vet @ Jun 26 2006, 14:25) ...и при...   Jun 26 2006, 14:27
- - GetSmart   Крутой наверное компилятор. У меня-то неопытного в...   Jun 26 2006, 15:28
- - ArtemKAD   А шут его знает, вроде АВР :-) ... Адрес естествен...   Jun 26 2006, 16:03
- - vet   Вы случаем не абсолютные ли адреса присваиваете ук...   Jun 26 2006, 16:05
- - GetSmart   А на самом деле, дайте зыркнуть на кусок кода, кот...   Jun 26 2006, 16:15
|- - _Bill   Цитата(ArtemKAD @ Jun 26 2006, 19:37) /* ...   Jun 27 2006, 10:41
- - GetSmart   1. Попробуйте перед созданием таблицы костант опис...   Jun 26 2006, 17:01
- - vet   Скомпилировал код версией 4.11А. NOP'ы повыкид...   Jun 26 2006, 17:15
|- - ArtemKAD   Цитата(vet @ Jun 26 2006, 20:15) Скомпили...   Jun 26 2006, 17:59
- - ArtemKAD   Естественно есть прототипы описаные до констант - ...   Jun 26 2006, 17:29
- - GetSmart   Кого будем бить за дезинформацию? {"\r...   Jun 26 2006, 17:33
- - vet   Ну, не придирайтесь в условии задачи эти строки н...   Jun 26 2006, 17:34
- - vet   Вероятно, дело в чем-то другом.   Jun 26 2006, 18:12
- - ArtemKAD   ЦитатаИ напоследок вопрос, который интересует меня...   Jun 26 2006, 18:19
- - GetSmart   Я вот тоже думаю, что дело в чём-то другом. А чтоб...   Jun 26 2006, 18:26
- - ArtemKAD   Точно - в другом месте . А вставка лишнего nop-а ...   Jun 27 2006, 20:29


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 01:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016