vet 0 26 июня, 2006 Опубликовано 26 июня, 2006 · Жалоба Вероятно, дело в чем-то другом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 26 июня, 2006 Опубликовано 26 июня, 2006 · Жалоба И напоследок вопрос, который интересует меня: __root __flash const struct token token_table[] зачем в этой строке стоит "struct" ? Дык описываю массив структур типа token Там выше описана структура struct token { const char __flash *str; void (*fun)(void); }; Иначе это было-бы описание простого типа (например через typedef) с именем token. По крайней мере так IAR не ругается :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 26 июня, 2006 Опубликовано 26 июня, 2006 · Жалоба Я вот тоже думаю, что дело в чём-то другом. А чтобы точно определиться нужно всего-лишь скомпилить прогу (желательно без nop'ов), заархивировать все листинги и дать посмотреть. То бишь прикрепить к посту. Тогда станет ясно, кто виноват. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 27 июня, 2006 Опубликовано 27 июня, 2006 · Жалоба /* Обработчик "OK" */ void fun_OK(void) { if(error_cnt) error_cnt --; (*fun_OK_addr)(); // Запуск обработчика по указателю ???????? asm("nop"); // Лекарство от зависания :( !!! return; } Странно все это. Почему не просто вызвать функцию? Для чего такой наворот? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 27 июня, 2006 Опубликовано 27 июня, 2006 (изменено) · Жалоба Примерно так: // Структура таблицы ключевых слов Проблема явно где-то в другом месте, потому что у меня следующий код работает во множестве процессоров без всяких выравниваний уже лет пять: 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; } Изменено 27 июня, 2006 пользователем Сергей Борщ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 27 июня, 2006 Опубликовано 27 июня, 2006 · Жалоба Точно - в другом месте ;) . А вставка лишнего nop-а перед вызываемой функцией благотворно влияет на карму Меги168 (она видать очень любит четные CALL-ы) поэтому она благополучно не замечает того другого ошибочного места. IAR-овцы тоже ошиблись когда патч на релиз выкладывали - у них всегда константные исполнимые вектора везде великолепно работали... "Доктор, не делайте из меня эйдиота" :) . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться