Ivanoff-iv писал(а):както со счётчиком комманд взаимодействовать?
в какие дебри вы полезли! Си вам дано для того, чтобы забыть про счетчик команд... а вы наоборот.
есть такая страшная вещь - setjmp.h - модуль, который позволяет откуда угодно сделать "goto" куда угодно в пределах модуля. но сразу предупреждаю - я вам не советую этим пользоваться! и вообще, есличо - я ничего про это не говорил.
если вам интересен мой совет, то он таков: вместо усложнения одной функции разбейте её на несколько маленьких и простых. толку будет гораздо больше. при этом, скорее всего, вам придется пересмотреть и подход в принципе, а именно отказаться от повсеместного и безоговорочного использования автомата состояний, как единственного решения любых проблем.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3345603#p3345603"]4) а чем код конечных автоматов тяжел? и чем я рискую если точно знаю что время выполнения кода не больше времени между вызовами прерываний и знаю, что этого прерывания раньше чем я его жду не произойдёт?[/uquote]
Он всем хорош. Но Вы, в своём случае, его используете всего-лишь потому, что крутите его в обработчике прерываний и не хотите допустить выход за временные рамки.
Если Вы его вынесете в основной цикл, то автоматом всё упростите. У Вас уже не будет столько switch-case'ов, у Вас уже не будет такого огромного кол-ва состояний и, как следствие, их обработки. У Вас упростится всё...
По поводу выхода и возврата в тоже место программы. Во время выполнения обработчика (где Вы всё и крутите) это сделать будет намного тяжелее, чем в основном цикле. А так - сохранение контекста для каждой задачи (отдельного потока) и возврат его при обратном входе. Как уже сказали - "Классическое переключение контекста на другую задачу".
ARV писал(а):есть такая страшная вещь - setjmp.h
Ой, только я начал читать это и меня сразу передёрнуло. И мне уже сразу не терпелось высказаться. Но, в конце предложения, Вы сами всё за меня сказали
ARV писал(а):Си вам дано для того, чтобы забыть про счетчик команд...
это я прекрасно понимаю... но раз встаёт такой вопрос - значит я его плохо знаю.
Аlex писал(а):У Вас уже не будет столько switch-case'ов,
у меня их обычно не так много - конкретно в этом коде я так убрал все крупные (мелкие в подпрограммах) делаи - сколько их было, столько и кейсов
--------------------------------------- пытаюсь думать дальше: есть какой нибудь метод чтобы название переменной преобразовать в текст?
если я сделаю вместо break`ов GOTO label; то, пока у меня в коде один блок - всё нормально, а вот если несколько - то метки нужны разные, вот, чтобы автоматом они вписывались взять бы за название метки имя переменной (в рамках одного блока она постоянна, а в другом будет гарантирована другая) т.е. возложить всю эту работу на компилятор ПС: я итак уже "дал слабину" начав нумеровать точки останова - по идее их нумерацию желательно тоже автоматизировать
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ivanoff-iv писал(а):если я сделаю вместо break`ов GOTO label;
ну вот, метастазы плохого стиля уже проникли в ваш код goto принято считать скорее допустимым исключением, вроде родимого пятнышка на лице (лучше, когда нет, но если маленькое, то ничего не портит и иногда придает даже некий шарм), чем правилом. вы же приступили к процессу, делающим goto доминирующим...
всё, пропал человек...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
на самом деле гото сидит во всех функциях, в которых изменяется порядок выполнения кода, просто программист к ним доступа не имеет.
я хочу сделать также - создам макрос и гото не будет доступно программисту, но если и это много...
я просто надеялся что такая конструкция существует, только я о ней не знаю - думаю, ткнут носом в готовый велосипед, чтобы не изобретать.
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ivanoff-iv писал(а):на самом деле гото сидит во всех функциях
и это совсем не хорошо
Ivanoff-iv писал(а):я хочу сделать также - создам макрос и гото не будет доступно программисту
и это не просто не хорошо, а ужасно
Ivanoff-iv писал(а):я просто надеялся что такая конструкция существует, только я о ней не знаю
да конструкций полно, но зачем?!
вы все время идете по пути усложнения кода, хотя правильная практика - максимальное его упрощение. чем загадочней код выглядит, тем хуже. если вы спрячете goto в макрос, вы вообще запутаете любого, кто взглянет на ваш код. ну зачем это делать?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
это как минимум неизбежно... а почему это не хорошо? оно както портит код (снижает понятность или надежность)?
всё, кажись получилось, попробую обкатать...
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
уже давно научно доказано, что избежно. просто достаточно часто избегание goto приводит к большей некрасивости кода. но в целом и общем наличие goto всегда тревожный маячок для программиста, а их избыток или решающая роль в коде - повод для очень большого беспокойства
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
нет, я имею ввиду не те, что пишутся goto Label; а те что пишутся if () {}else{}; или switch() {case0:...}; или ещё както - для контроллера на низком уровне это теже гото... только программист туда ахинею не сможет вписать - они контролируются компилятором
---------------------------------
кстати у меня получилась не совсем машина конечных автоматов (там переходы осуществляются самой машиной, програмист только задаёт направление), а у меня - простая замена делай`я: откуда ушли - от туда обязательно и продолжим, все остальные перемещения - силами программиста
Добавлено after 24 minutes 11 seconds:
из недостатков - практически все переменные, в подпрограмме, где использован код приходится делать статик.
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
среда - кодевижен,
камни - конкретно этот код идёт под тини2313, но и в меге 8 работает.
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
[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!
Siarzhuk писал(а):делать это быстрее всего уже привычно выглядящими для коллег блоками.
понятно, просто простыня длинная...вот и свернул... (действительно, надо было самую исходную портянку выкладывать)
так я и пытаюсь сделать код более привычным, понятным и универсальным.
Siarzhuk писал(а):О каком программисте речь?
Конечно задокументирую, когда конечный результат получу и проведу испытания
Siarzhuk писал(а):скрытый переход внутри макроса - это волчий билет для автора
а я вам и не предлагаю с ГОТОй - если внутрь цикла (или ветвления) его не вставлять - всё ОК, а если вставить - оператор брейк путается и кидается не на того... (завершает цикл вместо кейса).
но боюсь, что чтобы обойти такой прикол -всётаки ГОТО будет другого варианта пока не вижу
так то брейк - тотже гото, только более автоматизированый (сам себе цель выбирает)
Добавлено after 2 minutes 36 seconds:
над Вашим, Siarzhuk, вариантом кода подумаю.
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346097#p3346097"]среда - кодевижен,
камни - конкретно этот код идёт под тини2313, но и в меге 8 работает.[/uquote]
Тогда конкретно не подскажу.
В общих чертах - сохраняйте точку возврата (она будет адресом следующей инструкции) и возвращайтесь по return из функции. Затем, чтобы войти обратно, используйте эту точку. Первый вход - адрес функции.
Но учтите, если не будете манипулировать с сохранением стека (а это реально геморрой, ибо нужно отводить под каждый поток свою область памяти), то об использовании локальных переменных между вызовами можете забыть. В принципе, это не проблема - юзаем статические переменные.
Добавлено after 2 minutes 46 seconds:
ПыСы: Советую Вам поюзать OSA, тогда поймёте принцип распараллеливания задач и входа/выхода из них.
Добавлено after 6 minutes 18 seconds:
ПыСы2: И ещё. Ооооочень настоятельно рекомендую Вам пересмотреть реализацию своего кода и перенести бОльшую часть в основной цикл. Не нужно его экономить, наживая себе гемор...
OSA - изучаю, принцип распараллеливания понятен.
про стек - понимаю, потому и делаю всё локально внутри функции как добыть точку возврата? по номеру метки или абсолютный адрес сохранять? а если кто его испортит (хотя посторонних там быть не должно )
тот диспетчер, который я приводил - он тоже под тиню делался.
думаю что постепенно уйду в OSA - алгоритм многопоточности мне близок, я итак делаю чтото подобное, но с профи мне не тягаться
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
на сколько я знаю у АВР этот регистр (PC- программ каунтер) недоступен напрямую, да и в его лезть, это почти как под поездом стрелки переводить...
Добавлено after 1 hour 18 minutes 19 seconds:
ещё можно всю обработку сделать в майне - крутись она там, а в прерывании оставить лишь таймеры - в этом случае скорость выполнения кода вырастет, но предсказуемость по времени выполнения команд снизится...
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...