Помогите пофиксить баги

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

daaar писал(а):Во время выполнения прерывания все другие прерывания ставятся в очередь,
Не совсем "в очередь", не суть.
Кнопки обладают интересной особенностью - "дребезг контактов", т.е. выдачи пачки импульсов при нажатии или отпускании.
Разрешение прерывания позволит контроллеру снова среагировать на импульс от кнопки и повторно войти в обработчик прерывания.
А помимо этого, функция "_delay_ms" выполняется при запрещенных прерываниях - достаточно изучить её код.
daaar писал(а):А задержка нужна для проверки кнопки еще раз
Вообще-то, классический алгоритм опроса клавиш не требует никаких задержек внутри обработчика прерываний! Даже больше - обработчик прерываний должен выполняться как можно быстрее.
Я удивляюсь, что такие элементарные вещи не знает программист. :facepalm:
Реклама
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

COKPOWEHEU писал(а):но зачем разрешать прерывания?
Справедливости ради отмечу, что вложенные прерывания порой нужны.
У меня в рабочей системе есть парочка "тяжелых" прерываний, при выполнении которых приходится разрешать остальные прерывания.
Это редкость, да. И довольно таки сложная редкость для отладки.
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

mas123 писал(а):Вообще-то, классический алгоритм опроса клавиш не требует никаких задержек внутри обработчика прерываний! Даже больше - обработчик прерываний должен выполняться как можно быстрее.
Вот на счет того быстро должно выполнятся прерывание или нет, это спорный вопрос в данном случае(выполнять кроме него нечего)
А про дребезг кнопки, я опытным путем подобрал этот _delay_ms(), да и я только под МК начал программировать, не подумал даже о том как это будет работать
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

COKPOWEHEU писал(а):Можно я? Можно я? Пара отличий все-таки будет.
При вызове процедуры или метода. Будет безусловный переход не некий участок кода, адрес возврата поместится на стек. Этот некий участок возьмет данные из некой области памяти, и положит некие данные в другую или ту же область памяти. Затем будет возврат по адресу указанному в стеке. А вот откуда брать данные и куда обратно положить, это всего-лишь синтаксис языка и алгоритма компиляции.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я выпил 0,5 литра неплохого французского вина, и теперь я добрый :)))
mas123 писал(а):Не совсем "в очередь", не суть.
Кнопки обладают интересной особенностью - "дребезг контактов", т.е. выдачи пачки импульсов при нажатии или отпускании.
Разрешение прерывания позволит контроллеру снова среагировать на импульс от кнопки и повторно войти в обработчик прерывания.
это достаточно страшная вещь, если рассматривать ее абстрактно. крови попортить может много, но не часто - нужно еще уметь попасть в соответствующую ситуацию.
в том и беда, что стопитцот раз на столе все будет работать, а в стопитцотпервый раз в изделии - перестанет. поэтому следует избегать даже потенциальной возможности наступления этих граблей.
mas123 писал(а):А помимо этого, функция "_delay_ms" выполняется при запрещенных прерываниях - достаточно изучить её код.
а вот это вы зря. никакого запрета прерываний в этой функции нет, но, разумеется, никто не запретит "настоящему программисту" запретить их перед обращением к этой функции
daaar писал(а):А вы уверены? Тут то явно "сквозь пальцы" смотрят
лично я сразу написал, что не в силах заставить себя смотреть сквозь пальцы - у меня пальцев не хватает.
COKPOWEHEU писал(а):Ладно задержка - антидребезг (и изредка это может быть оправдано), но зачем разрешать прерывания?
вообще-то для архитектуры AVR это может быть оправдано, ведь эта архитектура имеет единственный уровень обработки... но, справедливости ради, для avr-gcc следует использовать соответствующие атрибуты макроса, а не принудительное sei():

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

ISR(TIMER1_OVF_vect, ISR_NOBLOCK){} // этот обработчик будет выполняться ПРИ РАЗРЕШЕННЫХ прерываниях - sei() в нем не требуется
COKPOWEHEU писал(а):Пара отличий все-таки будет
функция, которая не возвращает значения, это процедура - смотрите определение паскаля, если уж на то пошло. логически и функционально между ними нет никакой разницы. тип void для функции Си всего лишь дань синтаксису, на самом деле НИКАКОГО РЕЗУЛЬТАТА физически не существует, так что от процедуры паскаля это ничем не отличается (конечно, если не лезть в глубины передачи параметров через стек). смотреть в ассемблерную реализацию бессмысленно, т.к. она апаратно- и компиляторо-зависима.
daaar писал(а):Во время выполнения прерывания все другие прерывания ставятся в очередь
это не так для платформы AVR, в которой не существует очереди запросов прерываний.
daaar писал(а):Я задал вопрос конкретно описав проблему, а мне начали говорить, что...
извините, но наступает такой момент, когда для того, чтобы тебе помогли, следует добиться определенного уважения. отказ слушать - одна из главных причин, по которым желание помогать пропадает и может превратиться в желание гнобить.
daaar писал(а):Вы действительно считаете что это смешно?
я считаю, что действительно смешно вот это:
daaar писал(а):Там была не совсем отрицательная задержка, там была -.55
:)))
COKPOWEHEU писал(а):В контроллерах этим не пользуются, а разговор именно про них
ну почему же, можно и переопределить операторы... если захочется... однако, оператор в контексте ООП - это всего лишь метод класса, соответствующего определенному объекту. например, оператор сложения для экземпляра класса "вектор" будет осуществлен путем обращения к соответствующему методу этого класса. так что переопределение операторов - это ЧАСТЬ ООП, и, следовательно, я не исказил истину, когда говорил
ARV писал(а):С++ пахнет ООП, т.е. классами и их экземплярами
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

daaar писал(а):Вот на счет того быстро должно выполнятся прерывание или нет, это спорный вопрос
Спорный вопрос только в том случае, если не знать как делать.
Если программист опытный - это уже "на рефлексах" будет: прерывание должно выполняться быстро.
daaar писал(а):я опытным путем подобрал этот _delay_ms(),
Хороший способ программирования - "опытный подбор волшебных чисел". :))
А остальные задержки внутри циклов (в обработчике прерывания) - тоже опытным путём?
daaar писал(а):я только под МК начал программировать, не подумал даже о том как это будет работать
Я себя считаю более-менее опытным программистом. А программировать новый МК, процессор или иную мелкосхему всегда начинаю с чтения даташита.
И всегда думаю "как это будет работать", вплоть до рисования алгоритма на бумаге.
ARV писал(а):а вот это вы зря. никакого запрета прерываний в этой функции нет
Значит меня проглючило, бывает. :shock:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

mas123 писал(а):бывает. :shock:
конечно бывает! не проблемы ошибиться. проблема начинается, если упорствовать в ошибке... :beer:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

COKPOWEHEU писал(а):Пара отличий все-таки будет.
Я немного про другое говорил. В основном про вызов ассемблерной подпрограммы из высокоуровневого кода. Если подпрограмма изображает функцию придется положить в специальные регистры, для процедуры не нужно. А метод должен принимать адрес объекта.
вообще-то для архитектуры AVR это может быть оправдано
Разумеется, есть ситуации в которых это оправдано, но встречаются они редко. И уж точно не в подобных "проектах".
функция, которая не возвращает значения, это процедура
Я привел три точки зрения на этот вопрос, все они в той или иной мере обоснованы. Лично я придерживаюсь третьей - процедура, функция и подпрограмма это почти одно и то же, в обычной речи их допустимо использовать как синонимы.
переопределение операторов - это ЧАСТЬ ООП
ООП это еще, например, наследование, но для AVR оно слишком накладно. Ну и, например, шаблоны не относятся к ООП. Хотя я тоже не программист и для меня С++ это все еще скорее "Си с классами" чем отдельный язык.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

вроде как повода спорить нет, но почему-то решил ответить :dont_know:
COKPOWEHEU писал(а):Лично я придерживаюсь третьей - процедура, функция и подпрограмма это почти одно и то же, в обычной речи их допустимо использовать как синонимы.
как ни крути, функция и процедура имеют одно коренное отличие: для функции определен метод передачи результата ее работы, а для процедуры - не определен. то есть для функции должно существовать место, куда обязательно будет помещен результат ее работы, для процедуры такого требования нет.
понятие подпрограммы, пожалуй, слишком низкоуровневое, чтобы всерьез его рассматривать, но по своей сути обобщено выходит, что подпрограмма - это аналог процедуры, а не функции.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

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

Сообщение Z_h_e »

ARV писал(а):то есть для функции должно существовать место, куда обязательно будет помещен результат ее работы,
void func(...)
ARV писал(а):для процедуры такого требования нет.
Т.е. процедура частный случай функции, разве нет?
ARV писал(а):понятие подпрограммы, пожалуй, слишком низкоуровневое, чтобы всерьез его рассматривать, но по своей сути обобщено выходит, что подпрограмма - это аналог процедуры, а не функции.
Если Вы решите написать функцию/процедуру на асме в среде СИ, то увидете что параметры передаются через определенные регистры и так же возвращаются, есть некие правила для компилятора. Так что оператор return (uint8_t)0, скопилируется в нечто типа

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

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

Сообщение ARV »

еще раз поясню свою точку зрения.

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

вы видите эту разницу?
Z_h_e писал(а):void func(...)
если вы намекали на то, что это безрезультатная функция, то снова напоминаю более раннее мое высказывание: тип void для функции Си - это дань синтаксису языка, который не предусматривает понятия процедуры, как паскаль. однако, по своей логической сути (см. жирные подчеркивания двумя линиями выше) является 100% аналогом процедуры. результат типа void не существует, никуда не помещается, и никак не может быть использован ни при каких условиях.
Z_h_e писал(а):Т.е. процедура частный случай функции, разве нет?
в языке Си - да, частный случай. в абстрактном программировании (аналитическом, алгоритмическом) это разные вещи - см. выше.
Z_h_e писал(а):Большое отличие?
еще раз: отличие в алгоритмическом смысле большое. а в нижний уровень лезть не советую, ибо, например, в Си (да и современных версиях паскаля) допускается ИГНОРИРОВАНИЕ результата функции, поэтому умный компилятор запросто может сделать голый ret и из функции и из процедуры

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

Мой уютный бложик... заходите!
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

А можно рассматривать и по-другому. Есть самая простая структура - подпрограмма, она не обладает интерфейсами для приема или передачи данных. Вокруг нее можно сделать обертку, предоставляющую интерфейс передачи данных внутрь - получится процедура. Если вокруг нее сделать еще одну обертку, позволяющую передавать данные наружу - получится функция. Поскольку пользоваться оберткой не обязательно, можем считать, что подпрограмма входит в подмножетсво процедур, а оно входит в подмножество функций.
функция всегда помещает результат своей работы в предопределенное место в программе. подчеркиваю двумя жирными линиями - всегда помещает результат. процедура не обязана это делать. так же двумя линиями - не обязана.
вы видите эту разницу?
Вообще-то не не обязана а не может. Это функция может принимать параметры, а может и нет, может возвращать значение, а может и нет. Вот подпрограмма никогда не принимает параметров и не возвращает значение.
Кстати, исходя из этого, AVR-ная структура sei()/cli()/enable_interrupts()/disable_interrupts() это что с точки зрения Си (не обращая внимание что это макрос и ассемблерная вставка) - подпрограмма, процедура или функция? Или, скажем, preset(), init() и тому подобная инициализация?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

пока вы не перестанете смешивать уровни программирования, диалога не получится.
подпрограмма - термин частично низкоуровневый, частично устаревший. исключаем его из рассмотрения и ограничиваемся парой процедура-функция.
определения возьмем по образцу паскаля, т.к. Си не подразумевает понятие процедуры.

итак, в чем разница?

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

что же остается в качестве отличительного признака? только то, о чем говорил я: функция безусловно обязана куда-то поместить результат своей работы. т.е. просто исключен вариант, когда это требование можно обойти - обязана, и точка. все, что не обязано это делать - суть процедура.

что же касается подпрограмм, то это всего лишь многократно повторяемый при помощи операторов "вызова" и "возврата" участок общего кода. никаких требований к интерфейсу обмена данными не предъявляется, и он может быть любым или отсутствовать в принципе. например, частенько требуется помещать в стек 15 регистров, а затем их оттуда извлекать - это оформляется подпрограммой (которая по сути процедура) - никаких данных она не обрабатывает и не выдает по сути, просто перемещает их по ОЗУ. с тем же успехом можно заставить подпрограмму заносить в регистр какую-то константу (если это имеет смысл) - делается это для экономии объема кода, по своему смыслу является функцией, но т.к. пишется на ассемблере - это подпрограмма.

итак, подпрограмма - это обобщающий термин, ныне малоиспользуемый, наиболее полно относящийся к языкам низкого уровня или "примитивным" вроде классического бейсика. подмножеством подпрограмм являются процедуры и функции. функция от процедуры отличается тем, что обязательно помещает в определенное место результат своей работы. синаксически функция от процедуры отличается тем, что может быть операндом выражения. процедура операндом быть не может, т.к. не подменяет своим идентификатором никакого значения.
COKPOWEHEU писал(а):Кстати, исходя из этого, AVR-ная структура sei()/cli()/enable_interrupts()/disable_interrupts() это что с точки зрения Си (не обращая внимание что это макрос и ассемблерная вставка) - подпрограмма, процедура или функция?
к сожалению, не обращать внимание то, что это на макрос, нельзя. по смыслу действий и работе с данными обработчик прерывания - это процедура, т.к. никогда не может подменить собой значение в выражении, т.е. не взвращает в программу результат своей работы.

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

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

Сообщение Z_h_e »

ARV писал(а):просто нужно понимать эту разницу, и все. просто понимать, чтобы не считать себя тупее остальных.
Я никогда так не считал, как и не считаю себя умнее всех. А вот Вы, судя по Вашим постам, на это видимо претендуете.
ARV писал(а):еще раз: отличие в алгоритмическом смысле большое.
Ну конечно же, если Вы вставите type X=Func(); в один и тот же код вместо void Func(type* X); весь алгоритм будет нарушен. Вы наверное слушать это не желаете. Для тех кому интересно, поясню. В первом случае результат будет положен в определенное место, а затем в переменную, во втором сразу в нее.
ARV писал(а): допускается ИГНОРИРОВАНИЕ результата функции, поэтому умный компилятор запросто может сделать голый ret и из функции и из процедуры
Вы может умнее всех, вот только не сделает "он голый ret", просто результат функции положенный в регистры R24 и далее в обратном порядке будет проигнорирован основным телом программы. Вот в этом и будет игнорирование. Неужели Вы думаете что компилятор сделает две подпрограммы, в которой результат не вычисляется и вычисляется, на случай разных вызовов?
ARV писал(а): а в нижний уровень лезть не советую,
Поздно советовать, именно с него я и начал программирование, еще ДВК и ZX Spectrum. И есть опыт написания функций для СИ на асме, именно поэтому я знаю как передаются входные и выходные параметры.
ARV писал(а):понятие подпрограммы, пожалуй, слишком низкоуровневое, чтобы всерьез его рассматривать, но по своей сути обобщено выходит, что подпрограмма - это аналог процедуры, а не функции.
Ха !!! Приведите пример этой разницы.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Z_h_e писал(а):Приведите пример этой разницы
прочтите мой пост над вашим.
Z_h_e писал(а):Ну конечно же, если Вы вставите type X=Func(); в один и тот же код вместо void Func(type* X); весь алгоритм будет нарушен. Вы наверное слушать это не желаете. Для тех кому интересно, поясню. В первом случае результат будет положен в определенное место, а затем в переменную, во втором сразу в нее.
не то. результат обработки данных будет передан куда-то в обоих случаях, но во втором Func() никогда не сможет находиться правее знака равенства, т.к. место хранения результата заранее не определено! в вашем примере void Func(type* X); результат может быть помещен в любое место, а в случае int Func(void) результат всегда будет помещен, как вы верно подметили, в R24 (условно говоря).
Z_h_e писал(а):только не сделает "он голый ret", просто результат функции положенный в регистры R24 и далее в обратном порядке будет проигнорирован основным телом программы. Вот в этом и будет игнорирование. Неужели Вы думаете что компилятор сделает две подпрограммы, в которой результат не вычисляется и вычисляется, на случай разных вызовов?
пока что я имею основания сильно сомневаться в том, что я ошибся. static функция компилятором может автоматически заменяться на inline-вставку, если того требуют правила оптимизации и позволяют условия. если я описал функцию с результатом, но по тексту своей программы ни разу этим результатом не воспользовался, есть далеко ненулевая вероятность, что компилятор именно сгенерирует код без помещения результата в какой-либо регистр.
Z_h_e писал(а):Поздно советовать, именно с него я и начал программирование, еще ДВК и ZX Spectrum. И есть опыт написания функций для СИ на асме, именно поэтому я знаю как передаются входные и выходные параметры.
иногда старые знания мешают воспринимать новые. не пугайте меня ассемблером и спектрумом, я и не таких ежей голой жопой давил. если мы рассматриваем логику языка высокого уровня, нет резона лезть в нижний, тем более что он довольно свободно отдан на откуп разработчикам компиляторов.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

подпрограмма - термин частично низкоуровневый, частично устаревший
Так можно сказать, что и процедура - устаревший термин. Собственно, для Си так и есть.
не согласен, процедура может иметь интерфейс передачи данных наружу, например через ссылки, указатели, глобальные переменные, наконец.
Э, нет! Глобальные переменные это не интерфейс, специфичный именно для процедуры, ими может пользоваться кто угодно - и другой участок кода и подпрограмма. Ссылки и указатели передаются внутрь процедуры, а дальше она меняет значение ОЗУ по переданному адресу, что аналогично использованию глобальной переменной.
что же касается подпрограмм, то это всего лишь многократно повторяемый при помощи операторов "вызова" и "возврата" участок общего кода. никаких требований к интерфейсу обмена данными не предъявляется, и он может быть любым или отсутствовать в принципе.
Именно так! Подпрограмма не обладает интерфейсом передачи данных ни внутрь ни наружу, обеспечиваемым языком программирования. Именно это вынуждает программиста реализовывать его вручную - помнить через какие регистры принято (но не обязательно!) передавать данные, считывать нужное количество байт со стека и т.д.
итак, подпрограмма - это обобщающий термин, ныне малоиспользуемый, наиболее полно относящийся к языкам низкого уровня или "примитивным" вроде классического бейсика. подмножеством подпрограмм являются процедуры и функции.
Как раз наоборот, обобщающим является скорее "функция". Потому что функцию можно использовать и как подпрограмму и как процедуру, а вот наоборот далеко не всегда. "Можно использовать" я употребил не просто так: это верно даже для вашего определения функции, обязательно что-то возвращающей. При использовании ее как процедуры возвращаемое значение игнорируется. А термин "подпрограмма" потому и не используется что слишком узкоспецифичен и редко используется.
к сожалению, не обращать внимание то, что это на макрос, нельзя.
Это почему? С тем же успехом можно оформить как void sei(){asm("sei");} будет процедура-подпрограмма. То что он в данной реализации объявлен макросом-ассемблерной вставкой не гарантирует что в других версиях не будет по-другому.
по смыслу действий и работе с данными обработчик прерывания - это процедура, т.к. никогда не может подменить собой значение в выражении, т.е. не взвращает в программу результат своей работы.
Теперь еще и обработчики прерывания появились. Вот они как раз типичный случай подпрограммы, потому что не принимают значений, да и по логике им эти значения брать неоткуда.
для простоты можно назвать функцией все, что может стоять правее знака присваивания. все, что ни при каких условиях там появиться не может, можно причислить к процедурам.
А можно считать процедуры подмножеством функций, а подпрограммы подмножеством процедур, это тоже не будет ошибкой.
.
Когда программистам скучно они устраивают срач по терминологии...
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

ARV писал(а):в R24 (условно говоря).
Нет не условно, конечно я не скажу за все компиляторы. Но скорее всего. Но ну его нафиг "умный компилятор", который будет делать для каждого вызова подпрограммы свой код.
ARV писал(а):иногда старые знания мешают воспринимать новые. не пугайте меня ассемблером и спектрумом,
Не пугал я Вас, сообщил для инфы, чтобы мне Вы лишнего не писали. Знать низкий уровень не сложно, верхний сложнее, помнить надо слишком много. Но вот Вы не очень как оказалось то с нижним. (я Вас давно тут вижу и сегодня Вы разочаровали меня). Вы так углубились в синтаксис и терминалогию верхнего уровня, что забыли что программу буде выполнять камень, которому насрать на него.
ARV писал(а):но во втором Func() никогда не сможет находиться правее знака равенства
Вы считаете стоить обсуждать, что компилятор откажется компилировать выдав ошибку?
COKPOWEHEU писал(а):Когда программистам скучно они устраивают срач по терминологии...
Как Вы корректно заменили фразу " писюнами меряются". :beer:
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Z_h_e писал(а):Как Вы корректно заменили фразу " писюнами меряются". :beer:
Не, этим в соседней теме Demiurg занимается, а тут именно спор чья терминология лучше, чбе определение функции более правильно и чьи функции функцастее.
Нет не условно, конечно я не скажу за все компиляторы. Но скорее всего. Но ну его нафиг "умный компилятор", который будет делать для каждого вызова подпрограммы свой код.
Правильнее сказать, что именно avr-gcc использует r24-r25 и r22-r23 для хранения результатов функции. Другие компиляторы могут использовать ОЗУ, стек или атсрал на их вкус.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Z_h_e писал(а):Но ну его нафиг "умный компилятор"
именно поэтому я отказался в данной дискуссии от залезания на нижний уровень.

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

снова повторяю, что функция int func() является некоторым аналогом числа типа int, просто число это не берется из недр программы, а рождается в этих недрах благодаря работе функции. именно это число и называется результатом. то есть реально на месте обращения к функции будет использовано число-результат. в случае с процедурой это не так в принципе.
Z_h_e писал(а):Вы считаете стоить обсуждать, что компилятор откажется компилировать выдав ошибку?
о том и речь! почему он выдаст ошибку? потому что процедура не может возвращать значение, а функция - может. я об этом и толкую - о разнице между ними.
COKPOWEHEU писал(а):можно сказать, что и процедура - устаревший термин. Собственно, для Си так и есть
нет, в обоих случаях нет.
процедура - не устаревший, поскольку присутствует, как понятие, в паскале, который не устарел очень даже. а для Си это не устаревший, а неприменимый термин. но его неприменимость всего-навсего догма изобретателя языка, никаких других смыслов в том нет. наоборот, функция, которая ничего не возвращает, это скрытое противоречие, на которое адепты Си просто забили болт. ну уж как есть, так и живем...
COKPOWEHEU писал(а):Глобальные переменные это не интерфейс
еще какой интерфейс! интерфейс - это свод правил по обмену информацией: последовательность, форматы и т.п. что программист посчитает нужным использовать для обмена данными, то и будет интерфейсом. не путайте со стандартизированными интерфейсами (типа properties)! В Си понятие "интерфейс" отсутствует, за что этот язык и критикуем, но логически программист волен сам устанавливать правила обмена, организуя собственный интерфейс.
COKPOWEHEU писал(а):наоборот, обобщающим является скорее "функция"
последняя попытка, если не смогу убедить, признаю своё бессилие пред вашей твердостью :)
постройте график процедуры - сумеете? а график функции? в чем же разница?
Z_h_e писал(а):сегодня Вы разочаровали меня
ну что ж... придется нам с этим теперь как-то жить... :dont_know:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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