Вопрос по программированию задержки внутри прерывания

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

Starichok51 писал(а):shonty, ты что, вручную вычисляешь смещения для РС?
Ну не огульно все :)))

В "библиотеках" в циклах да. Избегаю меток при работе со шрифтами, при конвертациях различных..
Вобщем, что универсальное, там избегаю.
И если процедура до 20 строк допустим, то внутри метки тоже не ставлю))
Starichok51 писал(а):а если нужно сделать прыжок на много адресов,
по метке прыгаю)

Метки для подпрограмм в основном. Но бывает что пишу например rjmp Label+5, что бы внутрь подпрограммы запрыгнуть ))
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Вопрос по программированию задержки внутри прерывания

Сообщение COKPOWEHEU »

[uquote="shonty",url="/forum/viewtopic.php?p=4678980#p4678980"]Использование PC более универсально, да и привычнее мне.
А конечный результат в данном случае в макросе оформлен будет.
С метками порой конфликты случаются, когда много своих "библиотек" подключаешь.[/uquote]
Использование PC как раз менее универсально. А чтобы не было конфликта подобных "одноразовых" меток, используйте цифры:

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

STC_wait:
1:
  SBIS EIFR,INTF0
    RJMP 1b
  SBI EIFR,INTF0
shonty писал(а):Но бывает что пишу например rjmp Label+5, что бы внутрь подпрограммы запрыгнуть ))
Извращение какое. А если понадобится лишнюю инструкцию вставить? А если поменять камень с m8 на m328 с соответствующей заменой in на lds и другим размером?
Реклама
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

COKPOWEHEU писал(а):Использование PC как раз менее универсально. А чтобы не было конфликта подобных "одноразовых" меток, используйте цифры:

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

STC_wait:
1:
  SBIS EIFR,INTF0
    RJMP 1b
  SBI EIFR,INTF0
Если метка начинается с цифры, то avrasm2 пишет: "error: syntax error, unexpected INTEGER"
COKPOWEHEU писал(а):Извращение какое. А если понадобится лишнюю инструкцию вставить? А если поменять камень с m8 на m328 с соответствующей заменой in на lds и другим размером?
Если инструкцию вставить, то пересчитываю.
Если камень, то разные "библиотеки" у меня под m8, m328, lgt8, и т.д..
Так у m8/m328 даже регистры не все совпадают. Как универсалить :dont_know:
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Jack_A »

[uquote="shonty",url="/forum/viewtopic.php?p=4679000#p4679000"]Но бывает что пишу например rjmp Label+5, что бы внутрь подпрограммы запрыгнуть ))[/uquote]
Мне кажется, это не совсем хорошая практика. Трудно читаемо, особенно если после длительного перерыва или если кто-то другой разбирает исходник. Высчитывать смещения, загружать бошку. Программер должен быть достаточно ленивым. :)
Лишняя метка, особенно если это не безликая Label123, а осмысленное: LED_on, Busy и т.п. - денег не просит, но облегчает читаемость и модифицируемость.
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

Предпочтения по оформлению кода индивидуальны и субъективны :)))
Тем более от меня не требуется соблюдения корпоративных концепций ))
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Вопрос по программированию задержки внутри прерывания

Сообщение COKPOWEHEU »

[uquote="shonty",url="/forum/viewtopic.php?p=4679012#p4679012"]Если инструкцию вставить, то пересчитываю.[/uquote]
Вообще-то, метки для того и придуманы чтобы не пересчитывать.
shonty писал(а):Если метка начинается с цифры, то avrasm2 пишет: "error: syntax error, unexpected INTEGER"
Рекомендую начать осваивать гнутый ассемблер. Как минимум, проще потом с Си стыковаться.
shonty писал(а):Так у m8/m328 даже регистры не все совпадают. Как универсалить :dont_know:
Как все - ifdef-ами. И in/lds тоже. Хотя, честно говоря, не знаю, как это в гнутом асме делается.
shonty писал(а):Предпочтения по оформлению кода индивидуальны и субъективны
до тех пор, пока вы их не рекомендуете кому-то другому.
Реклама
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

Для примера приведу примерный пример про Label+5 :)))

Есть подпрограмма, выводит на дисплей значение регистра R21 в hex формате, ну это мне для отладки нужно..

Таки вот: если я пишу rcall OUT_HEX, то выводится 0x00
а если rcall OUT_HEX+5, то выводится просто 00.

Зачем мне тут лишняя метка, когда для меня и так всё достаточно информативно)
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Starichok51 »

shonty, то есть, тебе жалко буквы на клавиатуре расходовать на написание метки?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

Starichok51 писал(а):shonty, то есть, тебе жалко буквы на клавиатуре расходовать
Starichok51, да я вообще не жадный :)))

Но, информативность должна быть достаточной, а не излишней) Всё ж в меру дожно быть, а меры у всех разные))

Кстати, именно в том примере осталась метка OUT_HEX_NO_0x:
Но я пишу rcall OUT_HEX+5
:)))

Добавлено after 29 minutes 12 seconds:
Сам код (+4 к метке в данном случае):
Спойлер

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

OUT_HEX:
	ldi R16, 0
	rcall DIG_10x16				; на вывод "0"
	ldi R16, 0x10
	rcall DIG_10x16				; на вывод "x"
OUT_HEX_NO_0x:
	mov R16, R21
	andi R16, 0b11110000
	swap R16
	rcall DIG_10x16
	mov R16, R21
	andi R16, 0b00001111
	rcall DIG_10x16
	ret
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Вопрос по программированию задержки внутри прерывания

Сообщение COKPOWEHEU »

[uquote="shonty",url="/forum/viewtopic.php?p=4679031#p4679031"]Но, информативность должна быть достаточной, а не излишней)[/uquote]
У вас информативность НЕдостаточная. Почему именно +5, как узнать это число, не заглядывая в реализацию?
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

COKPOWEHEU писал(а):Почему именно +5, как узнать это число, не заглядывая в реализацию?
Частично вы правы. Но как бы название метки, не заглядывая в реализацию, тоже не узнать))

Но кстати, реализацию для себя поправил))
Спойлер

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

OUT_HEX:
	ldi R16, 0
	rcall DIG_10x16				; на вывод "0"
	ldi R16, 0x10
	rcall DIG_10x16				; на вывод "x"
; (+4 к метке, если без 0x)
	mov R16, R21
	andi R16, 0b11110000
	swap R16
	rcall DIG_10x16
	mov R16, R21
	andi R16, 0b00001111
	rcall DIG_10x16
	ret
Добавлено after 22 minutes 16 seconds:
С выводом hex-а не самый удачный пример привёл..
Вот тут оправдан + к адресу:

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

Label:
	ldi R18, 8
	...
	...
	...
	много строк
	...
	...
	dec R18
	brne Label+1
	...
	...
Чтобы код не пестрил метками через строчку.

Добавлено after 4 minutes 27 seconds:
PS: "+" к адресу иногда рациональнее писать , чем "PC-.."
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Вопрос по программированию задержки внутри прерывания

Сообщение COKPOWEHEU »

[uquote="shonty",url="/forum/viewtopic.php?p=4679063#p4679063"]Частично вы правы. Но как бы название метки, не заглядывая в реализацию, тоже не узнать))[/uquote]
Названия функций и их аргументы описываются в документации. Для этого не обязательно залезать в исходник. Да даже и залезая - пробежать глазами по меткам и вычленить те, что с осмысленными именами. Опять же не заглядывая в реализацию и не пытаясь угадать куда там можно прыгать, а куда нет.
А на языках высокого уровня вообще есть такая штука, как прототипы.
shonty писал(а):Но кстати, реализацию для себя поправил))
Стало гораздо хуже. Мало того, что не появилось осмысленных меток, так и та, что была, исчезла. При анализе кода как догадаться, что в эту точку подпрограммы вообще можно попасть кроме как с предыдущей строки?
shonty писал(а):Вот тут оправдан + к адресу:
И снова сделали только хуже. Из кода вообще неочевидно зачем туда прыгать.
shonty писал(а):PS: "+" к адресу иногда рациональнее писать , чем "PC-.."
В одном-единственном случае - когда он вычисляется в рантайме. Переход по таблице или что-то в этом роде.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

COKPOWEHEU писал(а):
shonty писал(а):Вот тут оправдан + к адресу:
И снова сделали только хуже. Из кода вообще неочевидно зачем туда прыгать.
Я не понимаю, что может быть неочевидного, если после dec R18 очень даже очевидно куда совершается переход. А именно на адрес, следующий за ldi R18.

И мне там метка точно не нужна.

Потому что искать глазами в коде R18 (подсвеченную подсветкой синт-са) легче чем бесполезную метку))
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по программированию задержки внутри прерывания

Сообщение BOB51 »

shonty писал(а):...искать глазами в коде R18 (подсвеченную подсветкой синт-са) легче чем бесполезную метку))
Абсолютно неверное предположение.
Даже в старо-древних компиляторах "на бумажке карандашиком" высчитывать смещение для перехода было весьма муторно.
А при более сложной организации адресации это вообще достаточно затратное дело.
Тем более, что доступ по метке применяется как для полного адреса, так и для "укороченного" (+/- N), и не только для адресного пространства ПЗУ но и для адресного пространства ОЗУ (частью которого являются и регистровый файл и РСФ).
Получить карту меток также особого труда не представляет - или по листингу *.lst или по map файлу (*.map) (смотрим окно project в АВР студио 4.19 или аналогичное в микрочип студио).
Второе - компилятор позволяет выполнять вычисления с данными меток, удобные в случае специальных требований к размещению исполняемых модулей подпрограмм.
Да и "склеивание" взаимодействия двух независимых программ при использовании в подгружаемом софте части резидентного может пригодиться.
АВРка с ПЗУ программ конечно не 51я с совмещенной внешней памятью программ/данных, но вариант использования элементов бутлоадера загружаемой (обновляемой) программой в своих целях также не исключается.
:tea:
Относительно использования абревиатуры R0 - R31...
не возбраняется и довольно часто используется при малом количестве используемых программой регистров - подобие "классического одноаккумуляторного" решения.
Однако АВР тем и отличается от I8080/Z80, MCS51 и PIC среднемладших, что имеет аж 32 регистр-аккумулятора с очень развитой системой доступа.
Нужно и про эти возможности помнить и применять. Вот тут и подходят заданные пользователем имена регистров согласно задач
Я такой вариант еще называю "модель регистров" - ибо можно задать практически модель аналогичную всем ранее перечисленным МП и МК.
:wink:
Последний раз редактировалось BOB51 Вт фев 04, 2025 19:57:00, всего редактировалось 2 раза.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Starichok51 »

а еще для ручного расчета смещения нужно точно знать длину каждой команды - один или два адреса.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по программированию задержки внутри прерывания

Сообщение BOB51 »

Хватит и такого, чтоб порой матюкнуться (особо, ежли еще учесть разницу что принимается за точку расчета нулевого адреса компилятором и "вручную" - это РАЗНЫЕ точки будут!):
Rel_map.pdf
(376.28 КБ) 30 скачиваний
8)
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

BOB51 писал(а):Получить карту меток также особого труда не представляет - или по листингу *.lst или по map файлу (*.map) (смотрим окно project в АВР студио 4.19 или аналогичное в микрочип студио).
BOB51, редко иде открываю. Из нотепада++ батник запускаю, который компилит и, если ошибок нет, шьёт..
Starichok51 писал(а):а еще для ручного расчета смещения нужно точно знать длину каждой команды - один или два адреса.
Иногда в справку подглядываю, но точно знаю, что rcall 1 слово, а call 2 ))
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по программированию задержки внутри прерывания

Сообщение BOB51 »

Предпочтение все же надо отдавать IDE !
В АВР студии есть достаточно удобный отладчик - дебаггер.
Ядро и команды он отрабатывает прекрасно, хотя и имеет ерраты по некоторым аппаратным модулям МК(ограничения функционала описаны в документации IDE)/
Отладчик/симулятор штука весьма удобная (тем более дармовая).
Второе - не потребуется прописи в запускающей строке компилятора вручную ставить.
(Если "классический" многофайловик).
8)
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

BOB51 писал(а):Предпочтение все же надо отдавать IDE !
и эмуляторам? :)))

У меня 3 в одном) иде, эмулятор и отладчик))
Изображение

И вопросов не возникает, почему в протеусе работает, а в железе нет))
Также любую метку где нужно ставлю.
Вячеслав М.
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Пн янв 13, 2025 15:24:02

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Вячеслав М. »

В самом названии темы есть ошибка режущая слух - никаких задержек в прерывании не должно быть! Я в прерывании обычно только выставляю флаг события, или если идёт поток данных, в SPI например, то только заранее подготовленные данные беру и отсылаю в соответствующий регистр и принимаю входные данные, всё, ничего другого и быть не должно.
Ответить

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