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

 
 
> Прерывания в Atmega128
zuuuuk
сообщение Mar 11 2015, 07:16
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 26-04-07
Пользователь №: 27 334



Подскажите, a где хранятся вектора прерываний
для ATmega?
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 19)
Xenia
сообщение Mar 13 2015, 21:36
Сообщение #16


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(alexeyv @ Mar 13 2015, 11:57) *
to Xenia!
Это экзамен?

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

Цитата(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 в отдельную статью лишь запутывает объяснение о местоположении таблицы прерывания, а не облегчает его.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 14 2015, 06:34
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Xenia @ Mar 14 2015, 01:36) *
Какое вы имеете право выделять вектор RESET, не считая его за часть таблицы прерываний? Он вполне полноправен со всеми остальными векторами, поскольку тоже принимает прерывание (от watchdog).

Ну, что же это Вы, Ксения, так подставляетесь?
Выделяют Reset и не считают его частью таблицы прерываний разработчики AVR (загляните в DS: "Reset and Interrupt Vectors"). И с прерываниями от WDT Вы тоже, мягко говоря, погорячились...
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 14 2015, 07:15
Сообщение #18


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Палыч @ Mar 14 2015, 09:34) *
Ну, что же это Вы, Ксения, так подставляетесь?
Выделяют Reset и не считают его частью таблицы прерываний разработчики AVR (загляните в DS: "Reset and Interrupt Vectors"). И с прерываниями от WDT Вы тоже, мягко говоря, погорячились...


В даташите на Мегу8 тоже написано так, как я сказала:

Код
Interrupt Vectors in ATmega8
Table 18. Reset and Interrupt Vectors
1   0x000   RESET    External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
2   0x001   INT0     External Interrupt Request 0
3   0x002   INT1     External Interrupt Request 1

Т.е. вектор RESET считается частью таблицы, и Watchdog Reset происходит на него.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 14 2015, 08:37
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Xenia @ Mar 14 2015, 11:15) *
вектор RESET считается частью таблицы, и Watchdog Reset происходит на него.

Тогда давайте расставим всё "по полочкам"...
О какой "таблице" Вы ведете речь? Таблице с названием "Reset and Interrupt Vectors" из DS (в Вашем примере из последнего поста - таблице с номером 18), в которой перечислены соответствующие вектора? Тогда - "да", и вектор Reset и вектора прерываний авторы документа разместили в одной "таблице", и все эти вектора - её часть. Есть ли некое подобие таблицы из DS в микроконтроллере? В общем случае - "нет", поскольку (как правильно сказал alexeyv) вектор Reset может размещаться в памяти отдельно от векторов прерываний (ну, или - наоборот).
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Mar 16 2015, 03:46
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



to Xenia.
1. Вы конечно абсолютно правы, но мои рассуждения не были обо свей архитектуре AVR, а только о контроллерах ТС, а это m1281/1280 и m128.
2. И тем более я не спорил о системе команд (jmp, rjmp), а сказал что таблица прерываний занимает 4 байта (или два слова), в которые как раз влазят команда jmp и адрес перехода (неушто это случайно?).
3. Все же RESET и таблица прерываний различаются, раз даже Atmel делает различным управление (размещение, контроль выполнения) этих двух объектов. Хотя сами объекты суть одинаковые - команда jmp и адрес перехода.
4. Да, у Atmel'а (да и не только у него) постоянно возникают какие-то неточности с типом адреса области кода - тут они байтовые, там - словарные. Как-то давно тоже приходилось разбираться, когда писал бутлоадер на асме.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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