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

 
 
> Указатели на функции
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
Ответов
vet
сообщение Jun 26 2006, 17:15
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Скомпилировал код версией 4.11А. NOP'ы повыкидывал.
Как и ожидалось, структуры инициализируются правильно, указатели указывают, куда нужно.
Код
void (*fun_OK_addr)();

__root __flash const struct token token_table[] =
{"\r\n",fun_VOID,
"OK", fun_OK
};
  0000000A: 0004
  0000000C: 0009; верно, байтовый адрес fun_VOID - 18
  0000000E: 0007
  00000010: 000A; верно, байтовый адрес fun_OK - 20


fun_OK_addr = fun_VOID;
  00000018: E009                ldi     r16,#9
  0000001A: E010                ldi     r17,#0
  0000001C: EAE0                ldi     r30,#160
  0000001E: E0F0                ldi     r31,#0
  00000020: 8300                st      z,r16
  00000022: 8311                std     z+1,r17
(*fun_OK_addr)();
  00000024: EAA0                ldi     r26,#160
  00000026: E0B0                ldi     r27,#0
  00000028: 91ED                ld      r30,x+
  0000002A: 91FC                ld      r31,x
  0000002C: 9509                icall


fun_OK_addr = token_table[0].fun;
  0000002E: E0EC                ldi     r30,#12
  00000030: E0F0                ldi     r31,#0
  00000032: 9105                lpm     r16,z+
  00000034: 9114                lpm     r17,z
  00000036: EAE0                ldi     r30,#160
  00000038: E0F0                ldi     r31,#0
  0000003A: 8300                st      z,r16
  0000003C: 8311                std     z+1,r17
(*fun_OK_addr)();
  0000003E: EAA0                ldi     r26,#160
  00000040: E0B0                ldi     r27,#0
  00000042: 91ED                ld      r30,x+
  00000044: 91FC                ld      r31,x
  00000046: 9509                icall



(*token_table[0].fun)();
  00000048: E0EC                ldi     r30,#12
  0000004A: E0F0                ldi     r31,#0
  0000004C: 9105                lpm     r16,z+
  0000004E: 9114                lpm     r17,z
  00000050: 01F8                movw    r30,r16
  00000052: 9509                icall


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Jun 26 2006, 17:59
Сообщение #3


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

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



Цитата(vet @ Jun 26 2006, 20:15) *
Скомпилировал код версией 4.11А. NOP'ы повыкидывал.
Как и ожидалось, структуры инициализируются правильно, указатели указывают, куда нужно.


Наблюдая как этот код зависает в МК мне от его правильности как-то не легче sad.gif ...

Цитата
Код
void (*fun_OK_addr)();

__root __flash const struct token token_table[] =
{"\r\n",fun_VOID,
"OK", fun_OK
};
  0000000A: 0004
  0000000C: 0009; верно, байтовый адрес fun_VOID - 18
  0000000E: 0007
  00000010: 000A; верно, байтовый адрес fun_OK - 20


fun_OK_addr = fun_VOID;
  00000018: E009                ldi     r16,#9
  0000001A: E010                ldi     r17,#0
  0000001C: EAE0                ldi     r30,#160
  0000001E: E0F0                ldi     r31,#0
  00000020: 8300                st      z,r16
  00000022: 8311                std     z+1,r17
(*fun_OK_addr)();
  00000024: EAA0                ldi     r26,#160
  00000026: E0B0                ldi     r27,#0
  00000028: 91ED                ld      r30,x+
  0000002A: 91FC                ld      r31,x
  0000002C: 9509                icall


fun_OK_addr = token_table[0].fun;
  0000002E: E0EC                ldi     r30,#12
  00000030: E0F0                ldi     r31,#0
  00000032: 9105                lpm     r16,z+
  00000034: 9114                lpm     r17,z
  00000036: EAE0                ldi     r30,#160
  00000038: E0F0                ldi     r31,#0
  0000003A: 8300                st      z,r16
  0000003C: 8311                std     z+1,r17
(*fun_OK_addr)();
  0000003E: EAA0                ldi     r26,#160
  00000040: E0B0                ldi     r27,#0
  00000042: 91ED                ld      r30,x+
  00000044: 91FC                ld      r31,x
  00000046: 9509                icall



(*token_table[0].fun)();
  00000048: E0EC                ldi     r30,#12
  0000004A: E0F0                ldi     r31,#0
  0000004C: 9105                lpm     r16,z+
  0000004E: 9114                lpm     r17,z
  00000050: 01F8                movw    r30,r16
  00000052: 9509                icall

Ну предположим там был (*token_table[Response].fun)()
Поэтому в настоящем коде вместо
ldi константа
было
Код
ldi r30, 0x02
ldi r31, 0x02
mov r16, r24
ldi r17, 0
lsl r16
rol r17
lsl r16
rol r17
add r30,r16
adc r31,r17
и далее те самые
lpm     r16,z+
lpm     r17,z
movw r26,r16
movw r30,r26
icall


но это дела не меняет - если все адреса функций в таблице четные то программа не висла, если в разнобой - певый же нечетный чаще всего зависал... Причем больше всего бесило, что иногда и не зависал. Хотя сейчас я понимаю, что оптимизатор IARa мог просто удачно на тот момент перетасовать код.

Лучший критерий - программа в МК это очень ярко показывает....
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
- - ArtemKAD   Примерно так: // Структура таблицы ключевых слов s...   Jun 26 2006, 16:37
|- - _Bill   Цитата(ArtemKAD @ Jun 26 2006, 19:37) /* ...   Jun 27 2006, 10:41
|- - Сергей Борщ   Цитата(ArtemKAD @ Jun 26 2006, 19:37) При...   Jun 27 2006, 12:25
- - GetSmart   1. Попробуйте перед созданием таблицы костант опис...   Jun 26 2006, 17:01
- - 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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