Операционная система. Плоды размышления

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

По просьбе ARV создана эта тема, и перенесён в неёё материал из Кодевизион в вопросах и ответах
ARV писал(а):то есть по-вашему выходит, что надо и динамическую индикацию делать без прерываний, и опрос клавы, и собственно, основную вычислительную задачу программы - все в основном цикле... имхо, именно так предлагалось в обучалке... мда...
Скорей не так , на сколько я понял Желтого собрата ,
Делаем в прерывании :
для кнопок - сняли состояние , сохранили в буфер.
для дисплея - считали из буфера то что предварительно заносим
в главном цикле , вывели в порт .
А все основные обработки проводим в главном цикле .
Пинайте если я не прав ...
Я в основном пользую данную методу.

Yellow Tiger писал(а):
Никаких задержек внутри процедуры обработки прерывания от клавиатуры! Только обработка самого события!
Совершенно верно !
Можно (нужно)внутри прерывания обрабатывать счетчик наращиваемый при нажатой кнопке и сбрасываемый при ее размыкании, и ни каких задержек .
Последний раз редактировалось dosikus Вт июл 29, 2008 23:27:09, всего редактировалось 1 раз.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

привносить эти прелести (пусть и в более простом виде) в программу на МК?! увольте, обойдусь без этого...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

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

2. как ни странно, но все события в Windows программа сама извлекает из своей очереди событий,
По-порядку:
1. Структурное программирование - это только базис, азбука в деле программирования. В грамотном проектировании программ структурное программирование занимает такое же место, какое занимает Яблочков в электротехнике - отец-основатель, конечно,... но как же далеко вперёд всё ушло! Изображение Архитектура программы обязана соответствовать структуре моделируемых ею процессов, иначе вы будете её значительно переписывать всякий раз, когда будут развиваться условия задачи (это одна из самых коварных и дорогостоящих разновидностей граблей).
Если бы не догадались в свое время делать коробку передач отдельно от двигателя, использование двигателей не в тех механизмах, для которых движок создавался изначально, было бы невозможно, (ну, так - к примеру) - изменились НУ, масса, макс. скорость, или тяговое усилие, и пипец - проектируйте двигатель заново...

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

Сообщение ARV »

Yellow Tiger писал(а):И кстати - извлечение из очереди виндошная программа инициирует не сама - это для программы такое же асинхронное событие, как и прерывания, так-что ничего общего с опросом в этом принципе нет!
это кто вам такое сказал?!

я свою точку зрения не навязываю никому, как догму, я всего лишь говорю свое скромное мнение (имхо)...

если хотите - давайте опубликуем прямо тут образец программы на Си, которая бы выполняла ранее поставленную задачу: по первому нажиму на кнопку зажигала светодиод, а по второму - гасила. Вы сделаете по-своему, я по своему, а народ посмотрит и скажет, что ему больше нравится? что более понятно и что, по его мнению, более соответствует логике "моделируемого процесса"... Ну, заодно посчитаем строки в коде и строки "разъяснений" что тут к чему в исходнике... имхо: глас народа - глас божий...

мне кажется, я начинаю понимать, почему современные программы чтобы умножить 2 на 2 требуют 1 гектар ОЗУ и 2 гига тактовой частоты... видимо, моделируют процессы, происходящие в мозгу Лобачевского... подход, заслуживающий глубогого уважения... хотя, простите, я уклоняюсь от темы...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

ARV писал(а):это кто вам такое сказал?!
Это сказал мелкософт (не мне лично, разумеется, а всем).

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

Сообщение ARV »

Yellow Tiger писал(а):Это сказал мелкософт (не мне лично, разумеется, а всем).
И не надо так кричать - просто прочтите документацию.
видимо, из-за разницы во времени я проспал момент, когда мелкосовт это всем говорил :)

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

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

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

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

   int working = 1;
   while(working){
      switch( извлечь_событие_из_очереди() ){
         case WM_CREATE: // обработка сообщения СОЗДАНИЕ ОКНА
                                     break;
         case WM_CLOSE: // обработка сообщения ЗАКРЫТЬ ОКНО
                                     break;
         ... // обрботка прочих сообщений, в том числе путем вызова 
             // обработчика "по умолчанию" DefWndProc()

         case WM_QUIT: working = 0; break; // закрыть программу

         default: // обработка ситуации, когда в очереди нет сообщений
      }
   }
и мои слова подтверждаются простым примером (не говря уже о приличном количестве написанных и отлаженных мной программ): если написать программу, которая будет содержать внутри обработки ЛЮБОГО события бесконечный цикл - она зависнет, чего, конечно же, не произошло, если бы события поступали для обработки в программу АСИНХРОННО.

вот в очередь событий они действительно ПОМЕЩАЮТСЯ операционной системой АСИНХРОННО по отношению к программе (из совсем другого системного потока), однако ИЗВЛЕКАЮТСЯ лишь тогда, когда в программе произойдет ЯВНОЕ ОБРАЩЕНИЕ к очереди... согласитесь, что это как-то не вяжется со сказанным вами утверждением...

разумеется, проблемы с явным зависанием были актуальны для Windows 3.хх, чуть в меньшей степени для Windows95/98, а для современных ОС типа WindowsXP практически исключены, однако совсем не потому, что события вдруг стали обрабатываться АСИНХРОННО... просто система следит за каждым приложением: а как давно был вызов функции проверки очереди сообщений? и если оказывается, что программа давненько туда не обращалась - система рисует "не отвечает"... и принудительно (т.е. средствами ОС) может убить зависший процесс... И в мелкософте еще часть событий (предназначенных для программы, между прочим!) ОС частично обрабатывает ДО (или одновременно - тут точно не скажу) с программой - поэтому, например, зависшее окно можно свернуть и развернуть (раньше было нельзя), хотя отрисовки содержимого обычно не происходит... т.е. налицо "латание дыр", а не системное изменение...

возможно, это как раз следствие "неправильного подхода", о котором вы, Yellow Tiger, говорите... т.е. изначально неверная идеология тянет проблемы из версии в версию, а меры по устранению проблем попахивают извращением... тут спорить не стану, т.к. все похоже на правду... но тем не менее, обращусь к вашему образному примеру с двигателем и коробкой: никто никогда не предусматривает изначально в конструкции велосипеда варианты, которые без проблем позволят сделать из него мотоцикл, вертолет и т.п., даже переделка из обычного велосипеда в спортивный или "горный" может не оставить и следа от исходного велосипеда... Т.е. любой "системно правильный" подход имеет рамки и ограничения, внутри которых говорить о модифицируемости имеет смысл, а вне их - бесполезно. возвращаясь к нашим микроконтроллерам и простым их применениям: это означает, что программа, построенная по предложенному мною варианту так же легко модифицируема под новые требования К СТАРОМУ ПРОЕКТУ, как и ваша; а при КОРЕННОМ изменении требований к проекту и ваша и моя программы будут уничтожены и переписаны заново полностью - выигрыша нет никакого. или почти нет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

ARV писал(а):разумеется, проблемы с явным зависанием были актуальны для Windows 3.хх, чуть в меньшей степени для Windows95/98, а для современных ОС типа WindowsXP практически исключены,
Ну, вы бы еще DOS вспомнили! :)
На самом деле, разница, которую вы упомянули, заключается не в том, современная версия виндовс, или несовременная - мелкософт изначально вел два совершенно разных семейства ОСей под похожими названиями.
Винды версий 1, 2 и 3 (а позже и 95, и 98, и ME) должны были, по задумке мелкософта, уметь запускать DOS'овские программы под своим управлением - чтобы пользователи могли гонять свое, нажитое в DOS'овские времена, ПО. Отсюда и эта странная архитектура.
Винды версий NT (2, 4, 5, XP и так далее) писались изначально, как многозадачные (о многозадачности чуть ниже), причем, команда писателей была создана на основе спецов из IBM, которые делали OS 360 - своего рода эталон многозадачной ОС того времени.
Обе ОСи, как видите, существовали одновременно.
Пару слов о многозадачности - вот здесь мелкософт объясняет разницу между вытесняющей и кооперативной многозадачностью. Правда, есть мнение, что кооперативная многозадачность была выдумана мелкософтом в маркетинговых целях - чтобы громко заявлять в рекламных материалах, что винды 1, 2, 3 и так далее - многозадачные ОСи. Возможно, это их болезненная реакция на то, что это семейство виндов называли графическими надстройками над DOS. :))

Сегодня мелкософт уже не испытывает необходимости поддерживать DOS'овские приложения и потому применяет (насколько мне известно) только вытесняющую многозадачность, но архитектурные ошибки - штука приставучая, допущенные один раз, они тянут на дно до последнего :) - теперь приходится поддерживать виндошные приложения написанные для "младших" виндов, построенных с применением "кооперативной многозадачности" - именно поэтому приложение внутри по-прежнему имеет тот самый цикл, который вы выше нарисовали. Но это только видимость - вся задача, целиком, вызывается к жизни ОСью асинхронно, согласно её (ОСи) планам и соображениям. :)))
Задача-то думает, что она опрашивает очередь, но на самом деле она лежит где-нибудь в своп-файле и титьк..., пардон, процессора не получит, пока, например, для неё не поступит мессаг. Это как если бы ваш цикл опроса клавиатуры был помещен в тело процедуры обработки прерывания. :)))
Все эти вещи можно найти и в MSDN, и в материалах не от мелкософта - у того же Шилдта. Начать можно с того места, на которое я дал ссылку, например со слов "Preemptive multitasking differs from non-preemptive multitasking in that the operating system can take control of the processor without the task's cooperation.".

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

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

Сообщение ARV »

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

Знаете, Yellow Tiger, читая ваш пост, я все не мог понять, что он мне напоминает... но вот сообразил :) Вы со своим тезисом напомнили мне Морфеуса, когда он рассказывал Нео о Матрице... :)
Yellow Tiger писал(а):Винды версий 1, 2 и 3 (а позже и 95, и 98, и ME) должны были, по задумке мелкософта, уметь запускать DOS'овские программы под своим управлением - чтобы пользователи могли гонять свое, нажитое в DOS'овские времена, ПО. Отсюда и эта странная архитектура.
это умели и умеют все без исключения версии винды, разве что NT стала это делать с некоторыми ограничениями. Причем умеют настолько хорошо, что перехватывают обращения к потам так, что DOS-овская программа даже не подозревает, что работает не с портом, а с драйвером виртуального устройства... Матрица, что поделать...
Yellow Tiger писал(а):Пару слов о многозадачности
Нет, спасибо, этого нам не надо - давно в курсе...
Yellow Tiger писал(а):Правда, есть мнение, что кооперативная многозадачность была выдумана мелкософтом в маркетинговых целях - чтобы громко заявлять в рекламных материалах, что винды 1, 2, 3 и так далее - многозадачные ОСи. Возможно, это их болезненная реакция на то, что это семейство виндов называли графическими надстройками над DOS. :))
гм... а то, что Apple-вская ОС по рождению имела кооперативную многозадачность, история умалчивает? А ведь Микрософт с нее винду слизывала... Это потом System получила номер 6, 7 и т.д., а начинали все в одной песочнице...
Yellow Tiger писал(а):теперь приходится поддерживать виндошные приложения написанные для "младших" виндов, построенных с применением "кооперативной многозадачности" - именно поэтому приложение внутри по-прежнему имеет тот самый цикл, который вы выше нарисовали.
извините, но это притянуто за уши. для совместимости с 16-разрядными (не-"истинно"-многозадачными ОС) версиями сейчас создается виртуальная 16-разрядная машина, в среде которой запускаются эти программы. все современные программы продолжают иметь этот самый цикл вовсе не потому, что требуется с чем-то совмещаться или что-то поддерживать - это ведь глупо, не так ли? глупо заставлять новые программы работать по старому, если в ОС имеются новые средства...
Yellow Tiger писал(а):Но это только видимость - вся задача, целиком, вызывается к жизни ОСью асинхронно, согласно её (ОСи) планам и соображениям. :)))
опять Матрица...
Yellow Tiger писал(а):Задача-то думает, что она опрашивает очередь, но на самом деле она лежит где-нибудь в своп-файле и титьк..., пардон, процессора не получит, пока, например, для неё не поступит мессаг. Это как если бы ваш цикл опроса клавиатуры был помещен в тело процедуры обработки прерывания. :)))
а вот это вообще ни в какие ворота... ну, лежит себе программа в свопе... ну ОС помещает в ее очередь сообщение и "вызывает" программу к жизни - и что? программа тут же все дела бросает и обрабатывает свеженькое поступившее сообщение? да фигушки - это вам в Матрице так кажется, а реально программа продолжает свой бесконечный цикл (в который я ее нагло загнал), в очередь не смотрит и толком ничего не делает... ОС, глядя на это дело некоторый квант времени, решает, что хорошего помаленьку - и снова погружает программу в сон, т.е. в своп (или куда там еще ОС захочется)... вот что происходит на самом деле.
Yellow Tiger писал(а):Все эти вещи можно найти и в MSDN
да кому надо искать эти пространные рассуждения? разве что вам, т.к. похоже, это вы путаетесь с вытесняющей и т.п. многозадачностью...

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

Но вернемся к Матрице... Так вот, с точки зрения того, кто в ней живет, действия самой Матрицы отсутствуют - нет ее... И в этом контексте основной цикл программы остается единственной реальностью, данной в ощущениях матрициалу (т.е. жителю матрицы). Но самое удивительное то, что и сама Шматрица не подозревает, что вы ей приписали нечто, ей не свойственное - ну не меняет она порядка исполнения команд программы, и точка! и если в программе есть while(1){} - то ни матрица, ни шматрица не вырвет указатель программного счетчика за его пределы!!! точнее, в рамках процесса этой программы не вырвет, сама-то ОС рано или поздно, как вы справедливо заметили, вытеснит этот цикл из области досягаемости процессора, чтобы дать немного пожить и другим задачам - но изнутри нашей тупой зацикленной программы все будет по прежнему, программный счетчик не изменится!!!

Помните Рассеянного с улицы Бассейной? Он ехал в Лениград (или куда он там поперся - не помню) трое суток в стоящем вагоне - и видел за окном один и тот же вокзал, когда просыпался... И наша программа, будучи выдернута из свопа, стека, из черта, из ж..пы - откуда б ее ОС не выдернула - увидит все тот же вокзал... Для бесконечного цикла нашей проги процессорное время остановилось. Баста. Матрица маст ребут...

Так вот, уважаемый Желтый Морфеус (не сердитесь за такую вольность? если да - извините), если вы захотите все-таки меня переубедить (я люблю правду не меньше Нео) - представьте доказательства того, что программа для Windows действительно АСИНХРОННО реагирует на события... гм... как вы это сделаете? не знаю, Морфеус смог... А без доказательств я склонен думать, что все эти умные слова о кооперативности, многопоточности, совместимости и т.п. - не более чем муть... в текущем контексте беседы :)

Это все здорово, но куда, по-Вашему, стоит перенести флейм по поводу программирования под Винды на тематическом Форуме по радиоэлектронике? :)) Aheir
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Куда перенести, не знаю :))) но к CV AVR это действительно не относится.
А насчет асинхронности, вот как это фактически выглядит:
(это псевдокод, ни к виндам, ни к АВР не относящийся)

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

interrupt [...] void pin_change_isr(void)
{
    while (1)
    {
        // прочитать клавишу и обработать
        switch ( ucNewKeys = ReadKeyb() )
        {
          case: ... break;
            ...
          default: ... break;
        }
    }
}
Есть ваша программа, есть внешняя исполняющая система, вызывающая процедуры вашей программы по событиям - и наличие внутри вашего кода оператора while(1){...} ничего не меняет.
Можете для проверки сделать пустой цикл - ОСи от него плохо не станет, что как раз и свидетельствует о том, что ваша программа на самом деле лишь вызывается ОСью, когда это потребуется. :)))
Код при этом выглядит действительно так, как будто он работает синхронно, и "изнутри тупой зацикленной программы все" выглядит "по прежнему", но суть происходящих событий не зависит от того, как они выглядят "изнутри тупой зацикленной программы все" - и именно об этом я вам твержу с самого начала этой части ветки. В DOS-режиме программы подсчитывали количество циклов, чтобы заамерять временные интервалы - вот где синхронность! Тот же самый код, но под управлением реально-многозадачной ОСи потеряет какую бы то ни было связь со временем, о какой синхронности тогда можно говорить? Вы рассматриваете исполняемый код в отрыве от режима его исполнения, а это не при любых условиях допустимо.


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

Добавлено: Посмотрел на этот while(1) и обратил внимание на то, что все еще круче - поскольку ОСь даже этот while(1) оборвет на полуслове, если ей понадобится, так-что даже в этом примере синхронности больше, чем её на самом деле. :)))
Последний раз редактировалось Yellow Tiger Чт июл 31, 2008 19:50:46, всего редактировалось 1 раз.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

если вы хотите мне что-то про Windows сказать - говорите конкретно, без псевдокодов. ваш псевдокод оспорить невозможно, как утверждение, что солнце существует. Но сам по себе взятый ОТДЕЛЬНО код никогда ничего не докажет - требуется конкретный контекст его исполнения... потому абстракции такого рода меня не удовлетворяют...

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

как все выглядит в реальности в Windows - я уже сказал, как я считаю, могу предоставить программу, которая по нажатию кнопки уходит в бесконечный цикл, но при обработке события WM_QUIT записывает в файлик какое-то слово... Если вы сумеете вырубить эту программу из бесконечного цикла так, что в этом файлике появится указанная запись (т.е. сообщение обработается) - поверю, что события действительно обрабатываются АСИНХРОННО... другие доказательсва есть? - милости просим, в студию!

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

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

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

Мой уютный бложик... заходите!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Теперь и я не понимаю - при чем здесь аппаратные прерывания? Я совсем о другом говорю...

Возможно, как и в прошлый раз мы одними словами называем разные вещи... :?

P.S.
ARV писал(а):приходилось реализовывать внутри нее вытесняющую многозадачность:)
Хм... это на каком же процессоре вы DOS гоняли? :)))
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

По просьбе ARV создана эта тема, и перенесён в неёё материал из Кодевизион в вопросах и ответах
большое спасибо!!!

Yelow Tiger, не стесняйтесь - расскажите все, ничего не скрывайте :))) вы что имеете ввиду?

я - то, что АСИНХРОННАЯ обработка подразумевает, что событие, поступившее АСИНХРОННО, т.е. в случайный момент времени исполнения программы, заставлет эту программу "немедленно перескочить со своего текущего места" на обработчик этого самого события (т.е. изменить обычный порядок исполнения команд)... причем с точки зрения программы совершенно все равно как именно - то ли напрямую от аппаратного прерывания, то ли при помощи какого-то трюка ОС... главное, что МГНОВЕННО (относительно) программа из текущего места окажется в совсем ином, что-то там сделает, и вернется к продолжению, как ни в чем ни былвало... я верно излагаю суть АСИНХРОННОЙ ОБРАБОТКИ?

так вот, в Windows по отношению к очереди событий такого НЕТ.
а в МК такой подход для обработки кнопок в 90% случаев неоправдано сложен (а может и более, чем в 90%)

я раскрыл карты - ваша очередь
Последний раз редактировалось ARV Чт июл 31, 2008 20:09:39, всего редактировалось 2 раза.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение ARV »

Yellow Tiger писал(а):Хм... это на каком же процессоре вы DOS гоняли? :)))
вы будете смеяться.... 8086...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение ARV »

Это все здорово, но куда, по-Вашему, стоит перенести флейм по поводу программирования под Винды на тематическом Форуме по радиоэлектронике? :)) Aheir
по всей видимости, надо открывать новый раздел :) как ни крути - без Windows современная электроника никуда...

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

Мой уютный бложик... заходите!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Ну, да, так и есть - мы о разных вещах говорим.

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

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

Если отказаться от рассмотрения всей системы, как единого целого, и ограничиться только видением "изнутри" программы, то истинное процессорное время окажется недоступным - вот только в этом времени такой код и будет синхронным, но не с точки зрения всей системы в целом.
Сравните - если запустить длинный цикл под 95-ми, и задача будет точно знать, на какой инструкции она сейчас находится, и вся система в целом, а под NT'ёй это уже не одно и то же.

Я так понимаю, вы полагали, что я пользуюсь тем же формализмом, что и вы, но он не предназначен для одновременного взгляда изнутри программы и извне её, отсюда и мои отступления от него.

Добавлено:
ARV писал(а):как мне казалось, он вел в эту сторону...
Нет, вы меня поняли неверно. Если помните, я даже специально отметил, что "Предположение, что применение асинхонной обработки к асинхронным событиям продиктовано "стремлением мгновенно отреагировать на замыкание контактов кнопки" - ошибочно" - то есть, выделение части кода в ISR я связываю не со стремлением обработать событие как можно быстрее, а считаю необходимым для разделения процедур по содержанию, по выполняемым функциям и т.д.
ARV писал(а):вы будете смеяться.... 8086...
Нет, смеяться я не буду - напротив, я восхищусь мастерством человека, сумевшего воплотить настоящую многозадачность на таком проце. И как же вам удавалось прерывать какую-нибудь зациклившуюся программу?
Последний раз редактировалось Yellow Tiger Чт июл 31, 2008 20:49:34, всего редактировалось 1 раз.
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

Мама родная.... Ребят, я всю тему два раза прочитал, но так и не смог понять, О ЧЕМ же вы спорите? С чего спор начался? Кто что утверждает?

А то я бы тоже пофлудил по теме. Как никак два года вел в институте л/р по ОС и УСРВ.
Знание - сила!
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

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

Сообщение ARV »

Yellow Tiger писал(а):О синхронности или асинхронности исполнения кода еще можно говорить, имея ввиду то, "знает" программа, когда она выполнит некий участок кода, или не знает. Поскольку я считал важным отметить тот факт, что код, находящийся под управлением многозадачной ОСи по определению этого знать не может, я вам и сказал об этом.
...
Сравните - если запустить длинный цикл под 95-ми, и задача будет точно знать, на какой инструкции она сейчас находится, и вся система в целом, а под NT'ёй это уже не одно и то же.
вы сами-то понимаете, что сейчас сказали? конечно, программа в любой ОС всегда "знает", на какой своей команде она сейчас находится. то время, когда она не исполняется, потому что ОС ее приостановила - она ничего не знает, но когда приходит в себя - не помнит о том, что только что программный счетчик указывал куда-то вне ее тела. и более того, программе вовсе не обязательно знать, где она находится - принципиально важно лишь то, что ход ее исполнения не нарушен извне.

повторяю еще раз: ОС не меняет порядок исполнения кода конкретной программы, последовательность ее исполнения остается той, что задал программист. разумеется, единственный способ нарушить это правило, не нарушая корректности работы программы - это действительно АСИНХРОННО обработать какое-то событие. только вот беда: истинно асинхронными могут быть в данном случае лишь аппаратные прерывания... а их обрабатывает ОС... все остальные либо не являются асинхронными по отношению к программе, либо просто не заменты ей. в частности, программе незаметны все действия ОС по переключению контекстов, приоритетов, своппингу и т.п., хотя логически эти действия выглядят асинхронными - только происходят они ВНЕ ПОТОКА ПРОГРАММЫ...

ваша попытка смешать действия ОС и действия программы - тщетна, ибо нельзя смешать стихи и котлеты - это категрии разных уровней.

еще раз (на всякий случай) повторю: от того, многозадачна (многопоточна) ОС или нет, действия программы (и ход ее работы) не зависят.

все сказанное мной касается Windows: я не исключаю, что существуют какие-то иные ОС, где действительно на системном уровне рализована событийная модель работы. я о таких ОС не знаю, да и не принципиально мне это знание...
Yellow Tiger писал(а):И как же вам удавалось прерывать какую-нибудь зациклившуюся программу?
единственно возможным в тех рамках асинхронным способом - перехватывая прерывание таймера... ну, были еще маленькие хитрости и большие трудности, признаю, сейчас это больше похоже на извращения... к счастью, задачи построить именно многозадачную ОС из DOS у меня не стояло :) поэтому было достаточно наличия параллельно работающих 2-3 процессов, кроме того, что запускал пользователь...

P.S. Событийная модель реализована в драйверах ядра, виртуальных драйверах Windows и, некоторым образом, в ее службах. возможно, я не все перечислил - это не принципиально...
P.P.S. кстати, Windows очень "аккуратно" реализует свою вытесняющую многозадачность при исполнении кода драйверов - потому их отладка не раз преварщается в многочисленные "синие экраны смерти" и глухие зависания ОС... я хочу сказать, что эта асинхронность и многозадачность - скорее мечта, чем реальность...
Последний раз редактировалось ARV Чт июл 31, 2008 21:33:31, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение ARV »

Yellow Tiger писал(а):Она разорвана на две части, оттого и непонятно.
ARV убежден, что обработку событий ввода практически всегда нужно вести не прерыванием, а в основной части кода.
Когда я возразил, что события на входах правильнее обрабатывать как прерывания, он решил, что я таким образом забочусь о скорейшей обработке нажатий кнопок, а поскольку человек, жмущий кнопки, "является самым медленным периферийным устройством", ARV этим объяснил отсутствие необходимости торопиться. Далее, он сослался на винды, как на пример того, как можно обойтись опросом, не замечая, по-прежнему, что мое предпочтение использовать прерывания никак не связано с сокращением времени реакции...
В общем, мы говорили о разных вещах и, как и в прошлый раз, долго не знали, в чем же расходимся... :)
сказанное верно лишь отчасти.

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

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

мне кажется, что Yellow Tiger умышленно говорит не о том, продолжая утверждать очевидные вещи, с которыми никто не спорит, и игнорируя другие аспекты, о котрых я говорю.

если вспомнить упоминание о быстроте реакции - то я настаивал и настаиваю, что АСИНХРОННАЯ обработка требуется как раз для случаев, когда эта самая скорость необходима. не улавливаете, Yellow Tiger, что это не совсем то, что говорите вы и что хотите мне приписать? вы же уверены, что так обрабатывать правильно любые события, даже те, которые могут и подождать.

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

Мой уютный бложик... заходите!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

ARV писал(а):вы сами-то понимаете, что сейчас сказали?
Я-то да, а вот сделать так, чтобы вы меня поняли, мне не удается - я вам говорю, оставьте точку зрения "изнутри" одной только программы, а вы упорно рассуждаете с тех же самых позиций. Что ж, привычная точка зрения может иногда казаться единственно возможной.
ARV писал(а):перехватывая прерывание таймера...
Думаю, вы и сами понимаете, что называть это вытесняющей многозадачностью - перебор. На 8086-ом любая программа может взять таймер на себя и если она после это зависнет, управление больше никогда не вернется...
Последний раз редактировалось Yellow Tiger Чт июл 31, 2008 21:43:10, всего редактировалось 1 раз.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»