|
Указатели на функции |
|
|
|
 |
Ответов
|
Jun 26 2006, 17:15
|
Знающий
   
Группа: Свой
Сообщений: 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
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Jun 26 2006, 17:59
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата(vet @ Jun 26 2006, 20:15)  Скомпилировал код версией 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 Ну предположим там был (*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 мог просто удачно на тот момент перетасовать код. Лучший критерий - программа в МК это очень ярко показывает....
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|