Цитата(alexeyv @ Mar 13 2015, 11:57)

to Xenia!
Это экзамен?
Нет, это была моя попытка уточнить характер разногласий. Но теперь ваша точка зрения мне в достаточной степени понятна, чтобы я могла приступить к ее опровержению

.
Цитата(alexeyv @ Mar 13 2015, 11:57)

1. 0x00, 0x02, 0x04 и т.п. - это СЛОВАРНЫЕ адреса. AVR хоть и 8-ми разрядный МК, но память программ у него 16-ти битная
Адреса, которые я приводила - БАЙТНЫЕ, а не словные. Об этом комментарий в том файле (iom8.h) очень настойчиво (NB!) предупреждает:
Код
/* NB! vectors are specified as byte addresses */
#define RESET_vect (0x00)
#define INT0_vect (0x02)
#define INT1_vect (0x04)
Однако при переходе с mega8 (8K flash) к mega16 (16K flash) картина меняется:
Код
/* NB! vectors are specified as byte addresses */
#define RESET_vect (0x00)
#define INT0_vect (0x04)
#define INT1_vect (0x08)
- теперь под каждый вектор резервируется 2 слова, а не одно!
И такая разница, в зависимости от превышения границы 8К, характерна для всех MK с архитектурой AVR.
В данном случае я не ставлю вам в укор неверную интерпретацию смещений в хидер-файле iom8.h, поскольку дефиниции компилятора (здесь IAR) являются результатом соглашения его разработчиков. Однако ваше утверждение о 4-байтном смещении в общем случае неверно. А именно, неверно в том случае, когда flash у МК не превышает 8К, т.к. в последнем случае вектора занимают в таблице прерываний меньше места (1 слово вместо 2-х). Причем, это чисто аппаратная особенность МК, независимая от того, в байтах или словах выражается величина смещения.
Цитата(alexeyv @ Mar 13 2015, 11:57)

2. действительно на каждый вектор отводится 4 байта (у ТС это m1281/1280, разговор не идет про m8). Смотрим любой листинг:
[code] 0: 0c 94 6f 03 jmp 0x6de; 0x6de <__ctors_end>
4: 0c 94 8c 03 jmp 0x718; 0x718 <__bad_interrupt>
8: 0c 94 8c 03 jmp 0x718; 0x718 <__bad_interrupt>
...
0c 94 - это команда jmp, вторые два байта - 16-ти разрядный адрес перехода
Вы забываете, что среди AVR-инструкций существует еще короткий RJMP, который занимает всего одно слово:
Cxxx
где: xxx - длина перехода в словах, сюда помещается число до 4К, но длиннее не лезет.
Именно это обстоятельство и разделяет довосьмибайтные МК от свышевосьмибайтных - первые допускают использование более компактной таблицы прерывания за счет использования более короткой команды перехода. К тому же короткий переход выполнятся в тактах быстрее, что для прерываний может быть существенным.
Вы же совершаете очень серьезную ошибку, не учитывая этого обстоятельства. Например, при портировании кода с mega16 на mega8 вы бы нарвались на серьезные осложнения.
Цитата(alexeyv @ Mar 13 2015, 11:57)

3. Про смещение. 0x00 - адрес перехода по ресету (так сказать немаскируемое прерывание у AVR МК), соответственно 0x02 - начало таблицы остальных прерываний.
Какое вы имеете право выделять вектор RESET, не считая его за часть таблицы прерываний? Он вполне полноправен со всеми остальными векторами, поскольку тоже принимает прерывание (от watchdog). Следовательно, у вас не было достаточных оснований, чтобы исключить этот вектор из таблицы прерываний, а саму таблицу считать расположенной с $0002. Кроме того, ваше выделение вектора RESET в отдельную статью лишь запутывает объяснение о местоположении таблицы прерывания, а не облегчает его.