zuuuuk 0 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба Подскажите, a где хранятся вектора прерываний для ATmega? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба Подскажите, a где хранятся вектора прерываний для ATmega? Во flash, начиная с нулевого адреса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zuuuuk 0 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба То есть программа стартует с этих таблиц? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба То есть программа стартует с этих таблиц? Да. Нулевой вектор как раз RESET и представляет собой JMP/переход на начало кода. Поэтому нулевой адрес годится как для аппаратного сброса, так и теплого (например, от watchdog). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zuuuuk 0 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба А если я применяю boot загрузчик То эти вектора все равно на тех же местах? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба http://www.gaw.ru/html.cgi/txt/doc/micros/avr/index.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 11 марта, 2015 Опубликовано 11 марта, 2015 · Жалоба А если я применяю boot загрузчик То эти вектора все равно на тех же местах? Я полагаю, что у bootloader'а своя таблица прерываний, начинающаяся с загрузочной области. Т.е. если МК стартует сверху, то и таблица прерываний тоже там. Та же самая логика работы прерываний, только сдвинутая вверх по адресам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 11 марта, 2015 Опубликовано 11 марта, 2015 (изменено) · Жалоба Я полагаю, что у bootloader'а своя таблица прерываний, начинающаяся с загрузочной области. Т.е. если МК стартует сверху, то и таблица прерываний тоже там. не совсем так - всего четыре варианта BOOTRST IVSEL Адрес сброса Начальный адрес векторов прерываний 1 0 $0000 $0002 1 1 $0000 Адрес сброса в загрузочном секторе + $0002 0 0 Адрес сброса в загрузочном секторе $0002 0 1 Адрес сброса в загрузочном секторе Адрес сброса в загрузочном секторе + $0002 Изменено 11 марта, 2015 пользователем alexeyv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pavel-pervomaysk 0 12 марта, 2015 Опубликовано 12 марта, 2015 · Жалоба AT90CAN Boot... .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 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 12 марта, 2015 Опубликовано 12 марта, 2015 · Жалоба не совсем так - всего четыре варианта BOOTRST IVSEL Адрес сброса Начальный адрес векторов прерываний 1 0 $0000 $0002 1 1 $0000 Адрес сброса в загрузочном секторе + $0002 0 0 Адрес сброса в загрузочном секторе $0002 0 1 Адрес сброса в загрузочном секторе Адрес сброса в загрузочном секторе + $0002 Можно подробнее? Недавно столкнулся с необходимостью использовать прерывания в загрузчике. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pavel-pervomaysk 0 12 марта, 2015 Опубликовано 12 марта, 2015 · Жалоба Можно подробнее? Недавно столкнулся с необходимостью использовать прерывания в загрузчике. Чем мой пример не нравится? В течении 3х тактов меняем значение, если этого не сделать, прерывания будут срабатывать в (main) программе! Переключили и бут становится как обычная программа в майне со всеми прерываниями. По большому счету нужны таймеры и один аппаратный протокол. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 12 марта, 2015 Опубликовано 12 марта, 2015 · Жалоба Чем мой пример не нравится? В течении 3х тактов меняем значение, если этого не сделать, прерывания будут срабатывать в (main) программе! Переключили и бут становится как обычная программа в майне со всеми прерываниями. По большому счету нужны таймеры и один аппаратный протокол. Вы не поняли. Подробнее рассказать, как работает каждый режим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 13 марта, 2015 Опубликовано 13 марта, 2015 (изменено) · Жалоба 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. переход на основную прогу. Что еще хотите узнать? Изменено 13 марта, 2015 пользователем alexeyv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 13 марта, 2015 Опубликовано 13 марта, 2015 · Жалоба Что еще хотите узнать? У меня есть к вам вопрос: Откуда берется смещение $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 слова инструкций). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 13 марта, 2015 Опубликовано 13 марта, 2015 (изменено) · Жалоба 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". Я не очень хороший учитель Изменено 13 марта, 2015 пользователем alexeyv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться