Цитата(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 мог просто удачно на тот момент перетасовать код.
Лучший критерий - программа в МК это очень ярко показывает....