Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Имхо, для поиска ошибок, т.е. для облегчения отладки, все-таки лучше реагировать на прерывание каким-то "нехорошим" образом, чтобы как минимум можно было понять, что происходит нечто непредусмотренное. в случае с reti понять, что что-то не так, будет гораздо сложнее...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Demiurg писал(а):Пусть даже и случилось прерывание, но и ничего не произойдет.
Не понимаю как такое прерывание может произойти и как могут помочь RETI. Незапланированных прерываний быть не должно. Но в крайнем случае лучше сделать прерывание по умолчанию и например завешивать там программу или как то семафорить об этом. И то это может быть полезным только на этапе отладки.

А установка RETI - это всего лишь некая традиция. С таким же успехом можно заполнить другими командами или даже директивами. Очень многие считают, что данное заполнение таблицы векторов неудачный метод. Лучше применять директиву .ORG с метками, которым присвоено значения разработчиком.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Самый правильный способ заполнения таблицы векторов следующий:

Код: Выделить всё

.cseg

.org	0x0000
		rjmp	Reset

;====== INTERRUPT VECTORS ============
.org	INT0addr				; External Interrupt 0
		reti

.org	INT1addr				; External Interrupt 1
		reti

.org	OC2addr					; Timer/Counter2 Compare Match
		reti // rjmp	Proc_Int_BAM // 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/Counter1 Compare Match B
		reti

.org	OVF1addr				; Timer/Counter1 Overflow
		reti

.org	OVF0addr				; Timer/Counter0 Overflow
		reti

.org	SPIaddr					; SPI Serial Transfer Complete
		reti					; rjmp	SPI_Transfer_Int

.org	URXCaddr				; USART, RX Complete
		reti

.org	UDREaddr				; USART Data Register Empty
		reti

.org	UTXCaddr				; USART, TX Complete
		reti

.org	ADCCaddr				; ADC Conversion Complete
		reti // rjmp	ADC_Complete

.org	ERDYaddr				; EEPROM Ready
		reti

.org	ACIaddr					; Analog Comparator
		reti

.org	TWIaddr					; Two-wire Serial Interface
		reti

.org	INT2addr				; External Interrupt Request 2
		reti

.org	OC0addr					; TimerCounter0 Compare Match
		rjmp	Sys_Timer_Comp

.org	SPMRaddr				; Store Program Memory Read
		reti
;-------------------------------------------------------------------------
.org	INT_VECTORS_SIZE		; size in words
;===================
Это таблица для ATMEGA8535. Этот же способ работает и для МК с объемом памяти выше 8 кБ. У этих МК векторы двухсловные. Если мы тупо забьем командами reti, то вляпаемся в смещение адресов. Применяя ORG, мы впаковываемся в таблицу.
Создается такая таблица просто. Берем заголовочный файл на конкретный МК. Копируем таблицу векторов. И заменяем EQU на ORG. Шаблон я вам дал.

Применяя такую таблицу, мы страхуемся от незапланированных прерываний. Но не избавляемся от них. А это уже другая история.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Demiurg писал(а):мы страхуемся от незапланированных прерываний
в чем страховка-то? я не понимаю желания уберечь неверно работающую программу от еще более неверной работы... reti никак не поможет при отладке, даже затруднит её, имхо. а в отлаженной программе никаких внеплановых прерываний быть не должно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Я полностью согласен с ARV.
Реклама
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ARV писал(а):reti никак не поможет при отладке, даже затруднит её, имхо. а в отлаженной программе никаких внеплановых прерываний быть не должно.
reti как заглушка незапланированных прерываний ничего не делает. Просто происходит переход по вектору и выход из прерывания без каких-либо действий.
Затычка nop-ами, к примеру, как некоторые делают, или, если вообще вектор не указан как-либо, 0xFF приведет к последовательному перебору до ближайшего вектора или куска программы. А это гораздо опаснее. Смоделируйте в симуляторе для интереса.

Код: Выделить всё

.cseg

.org	0x0000
		rjmp	Reset

;====== INTERRUPT VECTORS ============
.org	INT0addr				; External Interrupt 0
//		reti // В этом месте будет 0xFFFF

.org	INT1addr				; External Interrupt 1
//		reti // В этом месте будет 0xFFFF
Изображение

Можно и нужно симулировать различные ситуации при разработке устройств. Разработчик должен учитывать любые ситуации. И методы борьбы с ними. Не стесняйтесь пользоваться симулятором AVR-Studio. Это единственный инструмент, который показывает реальную работу МК. Протеус и иже с ними даже рядом не стоял в сравнении со студией. Так как студия - продукт производителя микроконтроллеров AVR/
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Demiurg писал(а): Не стесняйтесь пользоваться симулятором AVR-Studio. Это единственный инструмент, который показывает реальную работу МК.
Никакой симулятор никогда не покажет реальную работу. И может хватит уже общаться в тоне просветленного учителя? Можете не верить, но про разные методы отладки программ знаете не только Вы.

Лучше поясните по некие незапланированные прерывания, это как?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Мне не нужен протеус, чтобы понять очевидное.
Просто надо разложить ситуацию на составляющие.
Исходные данные: программист настроил прерывание, но забыл для него сделать соответствующий обработчик. Это безусловно грубая ошибка, в результате которой программа не работает. Итак - программа не работает, как должна.
А теперь варианты развития событий.

1. Программист забил таблицу неиспользуемых векторов reti. Девайс прошивается и включается. Разработчик видит, что девайс ведет себя не так как надо: меню работает, всякие сообщения вводятся-выводятся, но какая-то часть функций не работает. Начинаются ковыряния с отладчиком - оновноной код отрабатывает отлично, имеющиеся в программе обработчики прерываний отрабатывают отлично - а программа не верно работает... Программист в панике.

2. Программист забил таблицу неиспользуемых векторов заглушками rjmp pc+0. Девайс прошивается и включается. Разработчик видит, что девайс не работает вообще. Т.е. что-то мигнуло, что-то выдалось, и после этого зависло. При помощи аппаратного отладчика, если он есть, мгновенно находит место, где программа висит, и это место - четко в таблице векторов. Всё, программист нашел свою плюху - отсутствие обработчика этого вектора. Аналогичное решение в симуляторе.

3. Программист забил таблицу неиспользуемых векторов переходами на единственную заглушку rjmp pc+0. Как и в п.2 всё висит, в отладчике видно только одно - висим в заглушке. Это не говорит ничего о том, откуда мы попали в заглушку, но все равно легко просмотреть таблицу и найти вектор без обработчика. Решение чуть-чуть сложнее, чем в п.2, но все равно элементарно.

4. Таблицу векторов заполнил компилятор avr-gcc, т.е. при необслуживаемом прерывании происходит сброс программы. В отличие от предыдущих двух вариантов программа, в зависимости от того, как часто происходят запросы необрабатываемого прерывания, либо вообще практически не стартует (визуально), либо проходит начальную инициализацию и сбрасывается. В плане диагностики этот вариант хуже, чем предыдущие два, но все равно однозначно говорит программисту о необходимости смотреть в таблицу векторов, не гадая.

В корректно написанной программе абсолютно все равно, что будет в таблице векторов на неиспользуемых местах, согласны?

Итак, вывод: вариант с reti в пустых ячейках таблицы векторов - наихудший при отладке и поиске проблем. Наилучший вариант - заполнение неиспользуемых ячеек заглушками rjmp pc+0. Компромиссные варианты - с единственной заглушкой или со сбросом.

Убедил? ;)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Из всех симуляторов только студия показывает наиболее реальную работу мк.
Незапланированные прерывания могут возникнуть в случае ошибки программиста, сбоя, срыва стека. Программист может копипастом включить прерывание для которого нет обработчика. При сбое или срыве стека программа может прыгнуть на данные, которые могут оказаться командой включения ненужного прерывания. При сбое и при работе со вводом выводом может записаться бит включения прерывания.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Demiurg писал(а):При сбое и при работе со вводом выводом может записаться бит включения прерывания.
При самопроизвольном изменении регистров ничего не поможет.

Добавлено after 2 minutes 6 seconds:
Но если Вам так хочется как-то защищаться от "незапланированного прерывания" только не RETI, делайте переход на обработчик прерывания по умолчанию. Но это разговор по кругу.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Demiurg писал(а):При сбое
сбой - это явление, аналогичное падению метеорита на голову: защититься от него невозможно никакими программными ухищрениями в принципе. единственная более-менее приличная страховка от сбоя - это WDT.
Demiurg писал(а):Протеус и иже с ними даже рядом не стоял в сравнении со студией
ну, вы меня знаете (или должны знать - не первый же год читаем сообщения друг друга на форуме!) - я крайне негативно отношусь к безапелляционным утверждениям!
прошу вас доказать, с какого перепугу симулятор студии лучше протеуса, если студия в принципе не симулирует аналоговую периферию, захват таймера, некоторые режимы работы таймера и вообще с отладкой "as_realtime" у студии боооольшие проблемы?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ARV писал(а):Итак, вывод: вариант с reti в пустых ячейках таблицы векторов - наихудший при отладке и поиске проблем.
Для начала вспомним, что мы в теме ассемблера. Reti наилучший вариант при бездействии. Nop-ы и 0xFFFF (слово) 0xFFFFFFFF - наихудший.
Теперь методы борьбы. К примеру. Асм.

Код: Выделить всё

.cseg

.org	0x0000
		rjmp	Reset

;====== INTERRUPT VECTORS ============
.org	INT0addr				; External Interrupt 0
		rjmp INT_0_Handler ; reti

.org	INT1addr				; External Interrupt 1
		rjmp INT_1_Handler ; reti

.org	OC2addr					; Timer/Counter2 Compare Match
		rjmp OC2_Handler ; reti

INT_0_Handler:
   ldi r16, 1
   rjmp Proc_Errors
INT_1_Handler:
   ldi r16, 2
   rjmp Proc_Errors

OC2_Handler:
   ldi r16, 3
   rjmp Proc_Errors

Proc_Errors:
   cli
   out PORTB, r16
   rjmp PC + 0 // Вместо глухого зацикливания вы можете написать простую мигалку светодиодом.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Demiurg писал(а):Для начала вспомним, что мы в теме ассемблера. Reti наилучший вариант при бездействии.
если вы оспариваете мою классификацию вариантов действий программиста, то прошу вас педантично опровергнуть всю цепочку моих рассуждений.

предлагаемый вами вариант - это не тот вариант, который мы обсуждаем: вы только что предложили обрабатывать ВСЕ прерывания, а говорили до сих пор мы о том, что некоторые обработчики остаются не обработанными из-за невнимательности программиста.
Demiurg писал(а):.org   INT0addr            ; External Interrupt 0
      rjmp INT_0_Handler ; reti

.org   INT1addr            ; External Interrupt 1
      rjmp INT_1_Handler ; reti

.org   OC2addr               ; Timer/Counter2 Compare Match
      rjmp OC2_Handler ; reti
это совсем не то, о чем шла речь ранее!

Добавлено after 1 minute 53 seconds:
да, вот еще что: у вас в Proc_Errors не нужно cli :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ARV писал(а):прошу вас доказать, с какого перепугу симулятор студии лучше протеуса, если студия в принципе не симулирует аналоговую периферию, захват таймера, некоторые режимы работы таймера и вообще с отладкой "as_realtime" у студии боооольшие проблемы?
Только не говорите мне, что я не умею готовить. Сколько раз я пробовал работать в протеусе. И все разы я проклинал все попытки. На простых проектах ногодрыгах еще что-то можно делать. На более сложных, как минимум жуткая тормозня.
Поэтому, модульная отладка программ. Принимаем как факт, что модуль работает, при симуляции, отладке программ выставляем режимы периферии, биты в регистрах. Если периферию невозможно симулировать, выставляем нужные переменные.
К примеру, проект. Ампер-вольметр переменного тока. Клавиатура, дисплей. Весь проект я отлаживал в студии и на железе. Именно так как я описал. Проект на си. На асме ничем бы не отличалось. Но я уже несколько лет не пишу проекты на асме.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

То что Вы где-то что-то успешно отладили и где-то что-то в другом месте не получилось - это не аргумент.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ARV писал(а):...
Я не оспариваю вашу квалификацию. Вы не ассемблерщик. Это всего лишь означает тип мышления.
Proc_Errors общая подпрограмма для обработки ошибок.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Demiurg писал(а):Проект на си. ... Но я уже несколько лет не пишу проекты на асме.
Каким компилятором пользуетесь?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Z_h_e писал(а):Каким компилятором пользуетесь?
IAR. Иногда студию и тулчейн. Отладка всегда в студии. IAR создает файл в формате студии. Прошивка МК только через студию. STK-500 либо AVRISP MKII.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Просто Вы говорили что GCC давно не пользовались или что -то в этом роде. К студии другой подключен чтоли?

Добавлено after 35 seconds:
Ладно. Не важно. А то в оффтоп разговор пойдет.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Z_h_e писал(а):Просто Вы говорили что GCC давно не пользовались или что -то в этом роде. К студии другой подключен чтоли
Именно, что давно не делал проекты в Toolchain. Иногда делаю мелкие проверки. Либо, как в нашем случае, открыл старый проект, чтобы посмотреть на выхлоп компилятора.
ARV писал(а):предлагаемый вами вариант - это не тот вариант, который мы обсуждаем: вы только что предложили обрабатывать ВСЕ прерывания, а говорили до сих пор мы о том, что некоторые обработчики остаются не обработанными из-за невнимательности программиста.
О панике. Когда у тебя непонятки, ты несколько дней не можешь понять, в чем дело. И горят сроки. Нужно успокоиться. Критически взглянуть на свою работу. Составить план действий. Методику проверки.

И в этом случае вы будете забивать всю таблицу прерываний, если потребуется, чтобы понять в чем дело.

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

Иногда стоит внимательно прочитать инструкцию, то бишь даташит... :)

Может быть я написал банальщину. Но это вы написали о панике. :)
Контактная информация:
Ответить

Вернуться в «AVR»