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

 
 
> Прерывания в 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
Ответов (1 - 19)
Xenia
сообщение Mar 11 2015, 07:20
Сообщение #2


Гуру
******

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



Цитата(zuuuuk @ Mar 11 2015, 10:16) *
Подскажите, a где хранятся вектора прерываний
для ATmega?


Во flash, начиная с нулевого адреса.
Go to the top of the page
 
+Quote Post
zuuuuk
сообщение Mar 11 2015, 07:26
Сообщение #3


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

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



То есть программа стартует с этих таблиц?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 11 2015, 07:30
Сообщение #4


Гуру
******

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



Цитата(zuuuuk @ Mar 11 2015, 10:26) *
То есть программа стартует с этих таблиц?


Да. Нулевой вектор как раз RESET и представляет собой JMP/переход на начало кода.
Поэтому нулевой адрес годится как для аппаратного сброса, так и теплого (например, от watchdog).
Go to the top of the page
 
+Quote Post
zuuuuk
сообщение Mar 11 2015, 07:38
Сообщение #5


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

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



А если я применяю boot загрузчик То эти вектора все равно на
тех же местах?
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Mar 11 2015, 07:40
Сообщение #6


Местный
***

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



http://www.gaw.ru/html.cgi/txt/doc/micros/avr/index.htm
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 11 2015, 07:41
Сообщение #7


Гуру
******

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



Цитата(zuuuuk @ Mar 11 2015, 10:38) *
А если я применяю boot загрузчик То эти вектора все равно на
тех же местах?


Я полагаю, что у bootloader'а своя таблица прерываний, начинающаяся с загрузочной области.
Т.е. если МК стартует сверху, то и таблица прерываний тоже там.
Та же самая логика работы прерываний, только сдвинутая вверх по адресам.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Mar 11 2015, 09:51
Сообщение #8


Местный
***

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



Цитата
Я полагаю, что у bootloader'а своя таблица прерываний, начинающаяся с загрузочной области.
Т.е. если МК стартует сверху, то и таблица прерываний тоже там.

не совсем так - всего четыре варианта

BOOTRST IVSEL Адрес сброса Начальный адрес векторов прерываний
1 0 $0000 $0002
1 1 $0000 Адрес сброса в загрузочном секторе + $0002
0 0 Адрес сброса в загрузочном секторе $0002
0 1 Адрес сброса в загрузочном секторе Адрес сброса в загрузочном секторе + $0002

Сообщение отредактировал alexeyv - Mar 11 2015, 09:54
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Mar 12 2015, 08:54
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716



AT90CAN Boot...

CODE
.cseg
.org THIRDBOOTSTART ; boot size 2048words 4096 bytes 0xF800 (Dump 0x1F000)

jmp BOOTRESET ; Bootloader Reset Handler
.org 0xF802 ; External Interrupt Request 0
reti
.org 0xF804 ; External Interrupt Request 1
reti
.org 0xF806 ; External Interrupt Request 2
reti
.org 0xF808 ; External Interrupt Request 3
reti
.org 0xF80A ; External Interrupt Request 4
reti
.org 0xF80C ; External Interrupt Request 5
reti
.org 0xF80E ; External Interrupt Request 6
reti
.org 0xF810 ; External Interrupt Request 7
reti
.org 0xF812 ; Timer/Counter2 Compare Match
reti
.org 0xF814 ; Timer/Counter2 Overflow
reti
.org 0xF816 ; Timer/Counter1 Capture Event
reti
.org 0xF818 ; Timer/Counter1 Compare Match A
reti
.org 0xF81A ; Timer/Counter Compare Match B
reti
.org 0xF81C ; Timer/Counter1 Compare Match C
reti
.org 0xF81E ; Timer/Counter1 Overflow
reti
.org 0xF820 ; Timer/Counter0 Compare Match
reti
.org 0xF822 ; Timer/Counter0 Overflow
jmp boot_T0_ovf ;
.org 0xF824 ; CAN Transfer Complete or Error
reti
.org 0xF826 ; CAN Timer Overrun
reti
.org 0xF828 ; SPI Serial Transfer Complete
reti
.org 0xF82A ; USART0, Rx Complete
reti
.org 0xF82C ; USART0 Data Register Empty
reti
.org 0xF82E ; USART0, Tx Complete
reti
.org 0xF830 ; Analog Comparator
reti
.org 0xF832 ; ADC Conversion Complete
reti
.org 0xF834 ; EEPROM Ready
reti
.org 0xF836 ; Timer/Counter3 Capture Event
reti
.org 0xF838 ; Timer/Counter3 Compare Match A
reti
.org 0xF83A ; Timer/Counter3 Compare Match B
reti
.org 0xF83C ; Timer/Counter3 Compare Match C
reti
.org 0xF83E ; Timer/Counter3 Overflow
jmp boot_T3_ovf ;
.org 0xF840 ; USART1, Rx Complete
jmp _b_rxd1 ; Get byte via USART!
.org 0xF842 ; USART1, Data Register Empty
reti
.org 0xF844 ; USART1, Tx Complete
reti
.org 0xF846 ; 2-wire Serial Interface
reti
.org 0xF848 ; Store Program Memory Read
reti


BOOTRESET: ; Bootloader reset point!
;---- STACK INIT --------;
ldi tmp, low(ramend) ;
out SPL,tmp ;
ldi tmp,high(ramend) ;
out SPH,tmp ;
cli
;---- Move_interrupts ---;
in tmp,MCUCR ; Get MCUCR
mov tmp1,tmp ;
ori tmp,(1<<IVCE) ; Enable change of Interrupt Vectors
out MCUCR,tmp ;
ori tmp1,(1<<IVSEL) ; Move interrupts to Boot Flash section
out MCUCR,tmp1 ; Переключили вектора прерываний на секцию BOOT!


bla-bla-bla

jmp RESET ; переходим на основную программу!




Main

CODE
jmp RESET ; Reset Handler
.org INT0addr ; External Interrupt Request 0
reti
.org INT1addr ; External Interrupt Request 1
reti
.org INT2addr ; External Interrupt Request 2
reti
.org INT3addr ; External Interrupt Request 3
reti
.org INT4addr ; External Interrupt Request 4
reti
.org INT5addr ; External Interrupt Request 5
reti
.org INT6addr ; External Interrupt Request 6
reti
.org INT7addr ; External Interrupt Request 7
reti
.org OC2addr ; Timer/Counter2 Compare Match
reti
.org OVF2addr ; Timer/Counter2 Overflow
reti
.org ICP1addr ; Timer/Counter1 Capture Event
reti
.org OC1Aaddr ; Timer/Counter1 Compare Match A
reti
.org OC1Baddr ; Timer/Counter Compare Match B
reti
.org OC1Caddr ; Timer/Counter1 Compare Match C
reti
.org OVF1addr ; Timer/Counter1 Overflow
reti
.org OC0addr ; Timer/Counter0 Compare Match
reti
.org OVF0addr ; Timer/Counter0 Overflow
jmp T0_ovf ;
;-----------------------;
.org CANITaddr ; CAN Transfer Complete or Error
;jmp can_int
reti ;
.org OVRITaddr ; CAN Timer Overrun
;jmp can_ovf
reti
;-----------------------;
.org SPIaddr ; SPI Serial Transfer Complete
reti
.org URXC0addr ; USART0, Rx Complete
reti
.org UDRE0addr ; USART0 Data Register Empty
reti
.org UTXC0addr ; USART0, Tx Complete
reti
.org ACIaddr ; Analog Comparator
reti
.org ADCCaddr ; ADC Conversion Complete
reti
.org ERDYaddr ; EEPROM Ready
reti
.org ICP3addr ; Timer/Counter3 Capture Event
reti
.org OC3Aaddr ; Timer/Counter3 Compare Match A
reti
.org OC3Baddr ; Timer/Counter3 Compare Match B
reti
.org OC3Caddr ; Timer/Counter3 Compare Match C
reti
.org OVF3addr ; Timer/Counter3 Overflow
jmp T3_ovf ;
.org URXC1addr ; USART1, Rx Complete
jmp _rxd1 ; Get byte vis USART!
.org UDRE1addr ; USART1, Data Register Empty
reti
.org UTXC1addr ; USART1, Tx Complete
reti
.org TWIaddr ; 2-wire Serial Interface
reti
.org SPMRaddr ; Store Program Memory Read
reti


RESET: ;
;---- STACK INIT ------;
ldi tmp, low(ramend) ;
out SPL,tmp ;
ldi tmp,high(ramend) ;
out SPH,tmp ;
;----------------------;
clr zero ;
clr loop2 ;
;--- Move_interrupts --;
in tmp,MCUCR ; Get MCUCR
ori tmp,(1<<IVCE) ; Enable change of Interrupt Vectors
out MCUCR,tmp ;
out MCUCR,zero ; Вернули прерывания на основную программу!
;----------------------;
sts WDTCR,zero ; disable watchdog Timer
sei ; enable interrupts



Открой апнот на свой проц, количество прерываний и их имя впиши таким же образом, проблемы отпадут.
Дальше уже делать что душа пожелает...
Какой протокол для загрузчика и соответственно сам алгоритм работы и общение с бутом.
Я долго не игрался, взял за основу обмена команды как у загрузчика Renesas, добавил шифрование и проверку CRC каждой посылки. rolleyes.gif
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Mar 12 2015, 09:55
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Цитата(alexeyv @ Mar 11 2015, 15:51) *
не совсем так - всего четыре варианта

BOOTRST IVSEL Адрес сброса Начальный адрес векторов прерываний
1 0 $0000 $0002
1 1 $0000 Адрес сброса в загрузочном секторе + $0002
0 0 Адрес сброса в загрузочном секторе $0002
0 1 Адрес сброса в загрузочном секторе Адрес сброса в загрузочном секторе + $0002

Можно подробнее? Недавно столкнулся с необходимостью использовать прерывания в загрузчике.
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Mar 12 2015, 10:14
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716



Цитата(demiurg1978 @ Mar 12 2015, 11:55) *
Можно подробнее? Недавно столкнулся с необходимостью использовать прерывания в загрузчике.


Чем мой пример не нравится?
В течении 3х тактов меняем значение, если этого не сделать, прерывания будут срабатывать в (main) программе!

Переключили и бут становится как обычная программа в майне со всеми прерываниями.
По большому счету нужны таймеры и один аппаратный протокол.
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Mar 12 2015, 10:19
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Цитата(pavel-pervomaysk @ Mar 12 2015, 16:14) *
Чем мой пример не нравится?
В течении 3х тактов меняем значение, если этого не сделать, прерывания будут срабатывать в (main) программе!

Переключили и бут становится как обычная программа в майне со всеми прерываниями.
По большому счету нужны таймеры и один аппаратный протокол.

Вы не поняли. Подробнее рассказать, как работает каждый режим.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Mar 13 2015, 04:18
Сообщение #13


Местный
***

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



BOOTRST_____IVSEL__Адрес сброса_________________________Начальный адрес векторов прерываний
1______________0____$0000_______________________________$0002
1______________1____$0000_______________________________Адрес сброса в загрузочном секторе + $0002
0______________0____Адрес сброса в загрузочном секторе_____$0002
0______________1____Адрес сброса в загрузочном секторе_____Адрес сброса в загрузочном секторе + $0002

FUSE-бит BOOTRST определяет место, откуда будет стартовать программа, если есть бутлоадер, то устанавливаем этот бит (и не забываем про настройки компилятора!)
Если бутлоадер работает с периферией по прерываниям и Вы не хотите мешать обработчики бутлоадера и основной проги, то для этого существует бит IVSEL, который перемещает указатель на таблицу прерываний в секцию бутлоадера.
Алгоритм работы с бутлоадером:
1. запускается бутлоадер, прерывания запрещены
2. проверяется, например, запрос на обновление ПО или другие действия загрузчика
3. таблица перемещается в секцию бутлоадера, прерывания разрешаются
4. Работа в бутлоадере: ПО перешивается полностью, вместе со своей таблицей прерываний и т.д. и т.п.
5. прерывания запрещаются, таблица переводится в секцию приложения
6. переход на основную прогу.

Что еще хотите узнать?

Сообщение отредактировал alexeyv - Mar 13 2015, 04:20
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 13 2015, 05:25
Сообщение #14


Гуру
******

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



Цитата(alexeyv @ Mar 13 2015, 07:18) *
Что еще хотите узнать?


У меня есть к вам вопрос:
Откуда берется смещение $0002 между стартовым адресом и началом таблицы прерываний?

Скажем, в хидере для ATmega8 (IAR EWAVR: iom8.h) точки входа в таблицу прерываний определены так:
Код
#define    RESET_vect           (0x00)
#define    INT0_vect            (0x02)
#define    INT1_vect            (0x04)
Откуда следует, что таблица прерываний разделяет вектор RESET со стартовым адресом.

Кроме того, у МК архитектуры AVR, имеющих более 8К флеша, каждый вектор прерывания в таблице занимает уже не 2, а 4 байта (соответственно 1 и 2 слова инструкций).
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Mar 13 2015, 08:57
Сообщение #15


Местный
***

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



to Xenia!
Это экзамен?
1. 0x00, 0x02, 0x04 и т.п. - это СЛОВАРНЫЕ адреса. AVR хоть и 8-ми разрядный МК, но память программ у него 16-ти битная

2. действительно на каждый вектор отводится 4 байта (у ТС это m1281/1280, разговор не идет про m8). Смотрим любой листинг:
Код
       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>
       c:    0c 94 8c 03     jmp    0x718; 0x718 <__bad_interrupt>
      10:    0c 94 8c 03     jmp    0x718; 0x718 <__bad_interrupt>
      14:    0c 94 8c 03     jmp    0x718; 0x718 <__bad_interrupt>
      18:    0c 94 75 15     jmp    0x2aea; 0x2aea <__vector_6>
      1c:    0c 94 8a 15     jmp    0x2b14; 0x2b14 <__vector_7>
      20:    0c 94 9f 15     jmp    0x2b3e; 0x2b3e <__vector_8>
      24:    0c 94 8c 03     jmp    0x718; 0x718 <__bad_interrupt>

0c 94 - это команда jmp, вторые два байта - 16-ти разрядный адрес перехода

3. Про смещение. 0x00 - адрес перехода по ресету (так сказать немаскируемое прерывание у AVR МК), соответственно 0x02 - начало таблицы остальных прерываний

4. Условно всю таблицу прерываний можно разделить на две части: область перехода по ресету и область переходов по остальным прерываниям. FUSE-бит BOOTRST отвечает только за размещения области перехода по ресету, а бит IVSEL в MCUCR (относительно m1281/1280) - за размещение остальной таблицы переходов по прерываниям (причем смещение у нее равно 2 слова - для перехода по ресету в случае совпадения области размещения двух частей таблицы). Отсюда и возникают четыре варианта размещения всей таблицы.

5. По всем остальным возникающим вопросам можно почитать даташит (у ТС это m1281/1280): раздел 13 "Interrupts". Я не очень хороший учитель

Сообщение отредактировал alexeyv - Mar 13 2015, 09:09
Go to the top of the page
 
+Quote Post
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 Текстовая версия Сейчас: 27th July 2025 - 19:29
Рейтинг@Mail.ru


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