Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3345454#p3345454"]функция get_temperature может не возвращать управление до конца ожидания, может возвращать предыдущее значение до окончания преобразования - это тонкости её внутренней реализации, которая, как я и написал, может быть любой.[/uquote]
Так вроде Ivanoff-iv начал с того, что вот есть функция GetTemp(), внутри конечный автомат, из кода ее периодически вызываем... У тебя в примере циклично вызывается get_temperature(), реализация может быть какой угодно, в том числе и тот же автомат, если не хотим ждать. Существенная разница в чем?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Reflector писал(а):Существенная разница в чем?
Разница в том, что человек реализует автомат в прерывании. Причём, наживает себе гемор с разделением кода на куски, чтобы вовремя отдать управление обратно.
Ему тут ОС то, скорее всего, и не понадобится совсем. Всё перенести в основной цикл и грамотно распределить задачи (пусть даже тем же автоматом).
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

извините, пришлось отлучиться
1) если бы меня в текущем положении дел всё устраивало - я бы сюда не написал...
2) про ОПО там не такой код и его я не пишу, пока нет прав. но смотреть и разбираться в этом коде приходится. там не РТОС, там скорее виртуальная машина (сначала грузится система отладки, которая позволяет на горячую отслеживать и изменять переменные, флаги...) а сам "полезный" код очень линеен.
3) макарон получается немного, вот функцию вы вызываете и она пока датчик не ответил (отдельный вопрос определения что датчик ответил внешнее прерывание или от таймера? опустим пока, но потом всёравно над этим придётся подумать) допустим вылетает со старым значением, чтоб код не подвесить, тогда всё равно будет результат и его придётся обработать; а если виснет, то в это время на её уровне мы ничего не сможем делать.
на счет функций - да это подпрограмма со своим окружением, но если хотите - напишу всё через дефайн :)
4) а чем код конечных автоматов тяжел? и чем я рискую если точно знаю что время выполнения кода не больше времени между вызовами прерываний и знаю, что этого прерывания раньше чем я его жду не произойдёт? а остальные - не связанные с этим прерывания будут короткими.

Добавлено after 13 minutes 7 seconds:
размещение и компоновку кода я продумал, с этим вопросов нет.
пишу, чтобы получить совет - как красивее это всё оформить,
задача сделать конструкцию, чтобы при наступании на её запоминалась позиция выполнения и подпрограмма завершалась, а при следующем запуске подпрограммы (возможно там ответная конструкция) вернуться на прежнее место выполнения кода.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Сообщения: 290
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3345603#p3345603"]задача сделать конструкцию, чтобы при наступании на её запоминалась позиция выполнения и подпрограмма завершалась, а при следующем запуске подпрограммы (возможно там ответная конструкция) вернуться на прежнее место выполнения кода.[/uquote]

Хм. Классическое переключение контекста на другую задачу. Тогда как обычно: сохраняем контекст (все регистры + адрес возврата), далее, в общем случае начинает работать планировщик, который определяет, какой задаче дать процессорное время. Естественно, для каждой задачи требуется память (сообственно дескриптор задачи, стек задачи).
Или я не понял твои хотелки?

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

Сообщение ARV »

Ivanoff-iv писал(а):а чем код конечных автоматов тяжел?
он не столько тяжел, сколько сложен для понимания. да и получается путаным частенько после пары-тройки корретировок
Ivanoff-iv писал(а):задача сделать конструкцию, чтобы при наступании на её запоминалась позиция выполнения и подпрограмма завершалась, а при следующем запуске подпрограммы (возможно там ответная конструкция) вернуться на прежнее место выполнения кода
очень странная постановка задачи. тут на форуме не один раз сталкивался с тем, что то одному, то другому начинает хотеться то из прерывания возвращаться не туда, откуда вышел, то из функции возвращаться в другое место... то главный цикл продолжать сначала... что-то и в вашей задаче есть такое, странненькое.
viiv писал(а):Классическое переключение контекста на другую задачу
характерное для многозадачных ОС. к чему это в собственных поделках - пока не ясно. особенно, если мы говорим о малоресурсных МК типа AVR
Ivanoff-iv писал(а):допустим вылетает со старым значением, чтоб код не подвесить, тогда всё равно будет результат и его придётся обработать; а если виснет, то в это время на её уровне мы ничего не сможем делать.
давайте неспеша разберемся. если функция не виснет, то очевидно, что её результат следует обработать. и это очень правильно и логично. задача функции - сделать свои дела и сообщить наружу о результате, задача "главного" цикла - понять, что с этим результатом делать. и очень даже хорошо, когда именно так. в частности, есть и стандарты, ПРЕДПИСЫВАЮЩИЕ только так и делать, т.е. нельзя игнорировать результат функции.
а теперь вторая часть вашего рассуждения - про зависшую функцию. вы абсолютно правы, что в этом случае на уровне вызывающего такую функцию кода все подвисает. но это абсолютно не касается фоновых процессов, работающих по прерываниям, например, динамической индикации или чего-то еще. поэтому, если функция должна работать долго - пусть работает. а вот если она зависла из-за ошибки, то и в вашем случае с автоматом состояний все будет стоять колом... поэтому для случая ошибок в коде вообще все равно. и, кстати, даже ОСРВ тут ничем не поможет: даже если она сумеет прервать "зависшую" функцию, то спустя некоторое время все равно вернется в неё. и та часть кода, которая ждет результатов из этой подло зависшей функции, так никогда и не дождется его, и все ваши старания пойдут коту под хвост.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

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

Добавлено after 40 minutes 49 seconds:
Re: Вопросы по С/С++ (СИ)
хотя нет не разобрался - там для выхода изконструкции применён брейк, а в цикле он скорее всего сделает не то. :( наверно GOTO придётся применять.

Добавлено after 53 seconds:
Re: Вопросы по С/С++ (СИ)
завтра поэкспериментирую
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3345686#p3345686"]очень странная постановка задачи. тут на форуме не один раз сталкивался с тем, что то одному, то другому начинает хотеться то из прерывания возвращаться не туда, откуда вышел, то из функции возвращаться в другое место... то главный цикл продолжать сначала... что-то и в вашей задаче есть такое, странненькое.[/uquote]
В плюсах сейчас обкатывают coroutines/resumable functions(в VS уже работают), во многих языках корутины идут из коробки. Если это stackless реализация, то компилятор по сути преобразовывает код в конечный автомат, т.е. получается именно то, что Ivanoff-iv и хочет. Не знаю насколько это в данном случае будет эффективно, но хотеть такое совсем не странно, потому подобную функциональность в языки и добавляют.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ivanoff-iv писал(а):както со счётчиком комманд взаимодействовать?
в какие дебри вы полезли! Си вам дано для того, чтобы забыть про счетчик команд... а вы наоборот.

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

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

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3345603#p3345603"]4) а чем код конечных автоматов тяжел? и чем я рискую если точно знаю что время выполнения кода не больше времени между вызовами прерываний и знаю, что этого прерывания раньше чем я его жду не произойдёт?[/uquote]
Он всем хорош. Но Вы, в своём случае, его используете всего-лишь потому, что крутите его в обработчике прерываний и не хотите допустить выход за временные рамки.
Если Вы его вынесете в основной цикл, то автоматом всё упростите. У Вас уже не будет столько switch-case'ов, у Вас уже не будет такого огромного кол-ва состояний и, как следствие, их обработки. У Вас упростится всё...

По поводу выхода и возврата в тоже место программы. Во время выполнения обработчика (где Вы всё и крутите) это сделать будет намного тяжелее, чем в основном цикле. А так - сохранение контекста для каждой задачи (отдельного потока) и возврат его при обратном входе. Как уже сказали - "Классическое переключение контекста на другую задачу".
ARV писал(а):есть такая страшная вещь - setjmp.h
Ой, только я начал читать это и меня сразу передёрнуло. И мне уже сразу не терпелось высказаться. Но, в конце предложения, Вы сами всё за меня сказали :)))
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

ARV писал(а):Си вам дано для того, чтобы забыть про счетчик команд...
это я прекрасно понимаю... но раз встаёт такой вопрос - значит я его плохо знаю.
Аlex писал(а):У Вас уже не будет столько switch-case'ов,
у меня их обычно не так много - конкретно в этом коде я так убрал все крупные (мелкие в подпрограммах) делаи - сколько их было, столько и кейсов
---------------------------------------
пытаюсь думать дальше: есть какой нибудь метод чтобы название переменной преобразовать в текст?
если я сделаю вместо break`ов GOTO label; то, пока у меня в коде один блок - всё нормально, а вот если несколько - то метки нужны разные, вот, чтобы автоматом они вписывались взять бы за название метки имя переменной (в рамках одного блока она постоянна, а в другом будет гарантирована другая) т.е. возложить всю эту работу на компилятор
ПС: я итак уже "дал слабину" начав нумеровать точки останова - по идее их нумерацию желательно тоже автоматизировать
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ivanoff-iv писал(а):если я сделаю вместо break`ов GOTO label;
ну вот, метастазы плохого стиля уже проникли в ваш код :))) goto принято считать скорее допустимым исключением, вроде родимого пятнышка на лице (лучше, когда нет, но если маленькое, то ничего не портит и иногда придает даже некий шарм), чем правилом. вы же приступили к процессу, делающим goto доминирующим...

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

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

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

нет, я имею ввиду не те, что пишутся goto Label; а те что пишутся if () {}else{}; или switch() {case0:...}; или ещё както - для контроллера на низком уровне это теже гото... только программист туда ахинею не сможет вписать - они контролируются компилятором
---------------------------------
кстати у меня получилась не совсем машина конечных автоматов (там переходы осуществляются самой машиной, програмист только задаёт направление), а у меня - простая замена делай`я: откуда ушли - от туда обязательно и продолжим, все остальные перемещения - силами программиста

Добавлено after 24 minutes 11 seconds:
из недостатков - практически все переменные, в подпрограмме, где использован код приходится делать статик.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Ivanoff-iv писал(а):Ivanoff-iv
У Вас камень и компилятор какие ?
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

среда - кодевижен,
камни - конкретно этот код идёт под тини2313, но и в меге 8 работает.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3345996#p3345996"]на самом деле гото сидит во всех функциях, в которых изменяется порядок выполнения кода, просто программист к ним доступа не имеет.[/uquote]
Как не имеет? Имеет. В С мы платим гибкостью ассемблера за комфорт обобщённых типовых паттернов построения кода. И перекладываем львиную долю рутинных операций на машину. Человек должен творить, а машина - пахать. Если вам нужен доступ к этим goto - пишите на ассемблере. Но сделав из С ассемблер - будьте готовы, что вас не поймут - причём во всех смыслах - и стратегически (заччем?!) и буквально - никто не любит смотреть неструктурированный запутанный код. Кстати о последнем - ваш исходный спойлер нечитабелен, честно говоря. "Мыслит, кто ясно излагает, тот ясно. Поняли если вы меня о чём." Заставив искать case чёрт знает где вы, вероятно, потратили лимит внимания тех, кто потенциально был готов вам помочь, увы. Всякий язык - для обмена идеями и делать это быстрее всего уже привычно выглядящими для коллег блоками. Не в обиду? ;-)
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3345996#p3345996"]я хочу сделать также - создам макрос и гото не будет доступно программисту, но если и это много...[/uquote]
О каком программисте речь? Для собственого употребления вы вольны делать как вам удобнее, но предлагая кому-то воспользоваться вашими трудами нужно думать о удобстве тех, кому предлагаете - а они уже лет 40 как предпочитают привычные формы. Макрос хорош если вы сами его писали для себя, или если вы его прилежно задокументировали для коллег, но в любом случае скрытый переход внутри макроса - это волчий билет для автора. Силява́! :-(

ЗЫ: Интересно, кому-нибудь ещё, кроме меня, не хватает штатной "конструкции" (АКА исключения для бедных):
Спойлер

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

   do {
     if (check1)
       break;

     if (check2)
       break;

     if (check3)
       break;

     if (check4)
       break;

     if (check5)
       break;

[...]

     if (checkN)
       break;

     // all checks are ok - let's do 
     result = OK;
   } while (false); 

  return result;
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Ответить

Вернуться в «Разные вопросы по МК»