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

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

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

Сообщение Z_h_e »

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

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

Сообщение Demiurg »

Изображение
Это структура скомпилированной программы. Я сейчас занят. Так что пока изучите структуру. В принципе по картинке все понятно. Позже отпишусь.
Последний раз редактировалось Demiurg Чт авг 10, 2017 09:33:10, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Demiurg писал(а):Это структура скомпилированной программы.
если мы говорим о структуре скомпилированной avr-gcc сишной программы, то картинка не [совсем] верна - я приводил выдержки листинга, доказывающие это: после main есть единственная заглушка, а вместо заглушек в неиспользуемых векторах на самом деле генерируется переход на нулевой вектор, т.е. в конечном итоге на reset.

разумеется, в самописных программах на ассемблере можно реализовать и такую, и любую иную структуру. просто компилятор Си avr-gcc делает иначе.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение Demiurg »

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

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

Сообщение ARV »

Вы показываете картинку того, как в вашем представлении должна выглядеть программа?
Я вам говорю: из-под avr-gcc она выглядит не так!
В вашем представлении нет ничего криминального или плохого, но avr-gcc делает не по-вашему!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение Demiurg »

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

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

Сообщение Z_h_e »

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

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

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

Сообщение ARV »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3159547#p3159547"]Компилятор может вызывать main, вы знали об этом? То есть, в зависимости от программы, настроек компилятора, после сброса и блока инициализации может быть как переход на main так и вызов.
Так же можно настраивать переходы из незапланированных прерываний.[/uquote]
я вам говорю - небо синее, а вы мне - нет, трава зелёная :)))

можно делать что угодно, но avr-gcc делает нечто конкретное, и я на 100% уверен, что знаю, что этот компилятор делает. остальное - домыслы.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение Demiurg »

1 - Я давно не писал проекты в gcc. Поэтому, остались остатки впечатлений и разбора дизассемблера. В некоторых моментах был не прав. Признаю. Но! Я зацепился за "выход из main". И "расположенный за main кусок кода". Тот, кто писал и пишет проекты на асме, никогда так не скажет.
Берем первый момент. Выход из main. Компиляторы, в зависимости от условий, могут компилировать два метода. Переход на main, и вызов main. В последнем случае появился в обсуждении срыв стека.
Второй момент. cli и rjmp PC + 0 или PC - 0 (однокуйственно). Это совершенно отдельный кусок кода, который можно рассматривать как отдельную подпрограмму. И не важно, где этот кусок будет находиться. Потому как:

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

main:
bla-bla
rjmp Main

cli
rjmp PC + 0
Смотрим на этот кусок кода:

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

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

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

Сообщение ARV »

Demiurg писал(а):Компиляторы, в зависимости от условий, могут компилировать два метода. Переход на main, и вызов main. В последнем случае появился в обсуждении срыв стека
не могу поручиться за компиляторы, но логика подсказывает, что если вызов функции компилятор подменяет на переход, то он уж как-то должен и выход из функции оформить так, чтобы никакого срыва стека не было. но в целом это рассуждения из разряда "есть ли жизнь на Марсе".

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

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

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

Сообщение Demiurg »

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

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

Сообщение ARV »

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

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

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

Сообщение Demiurg »

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

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

Сообщение ARV »

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

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

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

Сообщение Z_h_e »

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

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

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

Сообщение 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
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

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

Сообщение trofim2 »

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

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

Сообщение 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/
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

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

Лучше поясните по некие незапланированные прерывания, это как?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

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