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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Вопросы по С/С (СИ)

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

сложность конечных автоматов не столько в количестве состояний, сколько в количестве и разнообразии прерходов. у меня переходы линейны, да и не переходы это по своей сути (разве правильно называть переходом перемещение из точки а в точку а, пусть и через промежуток времени?)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

[uquote="ARV",url="/forum/viewtopic.php?p=3346110#p3346110"]но вообще мне не хватает break из вложенных циклов... как бы можно было это реализовать - не знаю, но не помешало бы точно :)[/uquote]тут как раз goto вполне в тему :dont_know:
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3346504#p3346504"]тут как раз goto вполне в тему :dont_know:[/uquote] ну вот! я тоже считаю что в goto нет ничего страшного (пока он не попал не в те руки) это универсальный инструмент, но какраз за излишнюю универсальность его и не любят. (шарился по нэту - там так и пишут: я использую goto (приводится пример кода с ним и без с явным преимуществом в пользу goto и в размере и в наглядности), а как делать вам - решайте сами :) )
——————————————
осталось найти как силами среды (чтоб в код попал только результат его работы) сделать счётчик для автоматического нумерования меток и будет функция отдачи управления майн процессу (типа OS_Yield (); из OSA) готова.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

Всю тему я, правда, не читал. Но, как я понял, вы с помощью goto делаете переход между состояниями автомата?
сложность конечных автоматов не столько в количестве состояний, сколько в количестве и разнообразии преходов.
А вы все состояния сведите в один большой enum, а сам автомат сделайте просто вызовом функций обработки состояния по значению этого самого enum. Тогда goto вам не нужны будут.
Типа
enum STATE
{
STATE_BEGIN,//начальное состояние автомата
STATE_ONE,//первое состояние
STATE_TWO//второе состояние
};
...
STATE state;
...
if (state==STATE_BEGIN) ExecuteStateBegin();
if (state==STATE_ONE) ExecuteStateOne();
if (state==STATE_TWO) ExecuteStateTwo();

А в этих функциях меняйте state от ситуации и на следующей итерации автомат выполнит уже другую функцию.
я тоже считаю что в goto нет ничего страшного
Такие ситуации достаточно редкие. Я могу вспомнить разве что выход из вложенных циклов наружу и только. :dont_know: В целом, я за 18 лет игр с Си++ goto не применял ни разу. Только в бейсике. :)
Вот, посмотрите, например. Ни одного goto:
https://github.com/da-nie/3DEngine-Universal
https://github.com/da-nie/teamcontrolclient

Goto не нужен в 99.9999999% случаев. :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

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

Добавлено after 53 seconds:
до этого случая тоже гото ни разу не пригождалось.

Добавлено after 2 minutes 34 seconds:
подскажите лучше это:
Ivanoff-iv писал(а):осталось найти как силами среды (чтоб в код попал только результат его работы) сделать счётчик для автоматического нумерования меток
а про ужасы и геенну огненную, что меня ожидает за применение гото, я осведомлен :))

Добавлено after 1 hour 4 minutes 23 seconds:
сейчас код выглядит так (пример использования):

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

#define DelayCoeff 4.096   //количество вызовов за миллисекунду
#define StartDelay(x,t)  if (t) {(t)--;} else {switch (x){case 0: (t)=-1; 
#define Delay(num,te,x,t)  (x)=(num); (t)=(te)*DelayCoeff; goto Label##x; case(num): (t)=-1;
#define EndDelay(te,x,t) (t)=(te)*DelayCoeff; default: (x)=0;}; Label##x:};
//_______________
void NashaFunctia (void)
{
static unsigned char delayx; //счет точек 
static unsigned int  delayt;  //счет времени
StartDelay(delayx,delayt) //размещается вначале функции
<код а>
Delay(1,100,delayx,delayt); //размещается в произвольных местах в функции всесто delay_ms();
<код б>
Delay(2,500,delayx,delayt);
<код в>
EndDelay(1000,delayx,delayt); //размещается в конце функции
}

interrupt [TIM2_OVF] void timer2_ovf_isr(void) // interrupt-прерывание
{
<критичный код>
#asm("sei")
NashaFunctia();
}
....
здесь:
x (static unsigned char) - хранит номер текущей точки останова (нужно вписать название переменной)
t (static unsigned int) - хранит задержку (нужно вписать название переменной)
te (переменная, но лучше константа (число)) - задержка перед продолжением (мс) (по идее здесь надо вычесть 1, т.к. выход из подпрограммы - уже задержка на цикл)
num (число) - неповторяющийся номер точки останова
в отдельную функцию код выделять не обязательно - написал так для наглядности, если в пределах функции есть несколько независимых подзадач - для их счетчиков надо выделить независимые переменные.

эта конструкция заменяет записанный в майне код:

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

while (1)
{
<код а>
delay_ms(100);
<код б>
delay_ms(500);
<код в>
delay_ms(1000);
}
причем, даже если вписываю в код подпрограммы delay_ms(100); - срыва стека не происходит, просто подпрограмму накрывает следующим прерыванием (в нём выполнение этой задачи блокировано), а когда прерывание завершается - подпрограмма продолжается: на скриншоте осциллограф показывает работу АЛУ (высокий уровень) и режим сна (низкий уровень), просто низкого уровня нет (там импульсы менее 5% заполнения) т.к. АЛУ просыпается, чтобы переключить разряд индикатора. ПС:длительность в 2 раза превышает расчетную потому что поставлена неправильная тактовая (4 вместо 8 МГц)
Вложения
загрузка АЛУ.png
(132.45 КБ) 359 скачиваний
Последний раз редактировалось Ivanoff-iv Чт апр 05, 2018 08:33:25, всего редактировалось 1 раз.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

подскажите лучше это:
Это лучше сжечь. :) Правда! 8)
Чтобы подсказать, как нужно сделать правильно, нужно точно знать, что вы решаете со всеми нюансами. И вникнуть. Но вряд ли кто этим займётся, кроме вас. :)
А зачем вы делаете sei в обработчике таймера? Вы любите балансировать на грани работоспособности программы? :) Вы бы лучше задержки делали с помощью счётчика и таймера, уменьшающего этот счётчик, если он больше нуля. А в основном цикле в delay просто ждали бы, когда счётчик не равен нулю. В вашей функции NashaFunctia проще сделать return в случае необходимости преждевременного выхода и всё.
а когда прерывание завершается - подпрограмма продолжается:
Даже такая стабильная ОС, как QNX, способна упасть, если не будет успевать обрабатывать события внутри системного такта. ;)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

[uquote="da-nie",url="/forum/viewtopic.php?p=3346705#p3346705"]А зачем вы делаете sei в обработчике таймера? Вы любите балансировать на грани работоспособности программы?[/uquote] delay_ms(100); это далеко за гранью работоспособности программы... и ничего не упало.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

Всему своё время. :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

расчетно порушить её можно специально записав delay_ms(17000); но так писать и не надо - для того и делал, - надо Delay(1,17000,delayx,delayt); и всё будет ок (только для таких длинных интервалов delayt придется делать лонг...), правда если delay будет лонг - то и delay_ms(17000); её не вышибет...
другой вариант для больших интервалов использовать предделитель для вызова этой функции (счетчик пойдёт медленнее).
на встречный вопрос об ожидании внешнего события - в цикл ожидания надо вставить Delay(1,0,delayx,delayt); и всё будет ОК
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

Берите нормальною ОС, типа FreeRTOS. Возможностей гораздо больше.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

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

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346671#p3346671"]нет, только выход наружу (вместо брейк) и только в пределах функции[/uquote]

Если все тек, как Вы описываете ниже используйте return вместо goto. И никаких меток :-)
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

а если этот код не будет выделен в функцию?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

А вы его выделите. ;)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

бывает, за пару слов борорься приходится а вы мне предлагаете потерять ещё немного флеша на запись, памяти на стек и времени на переход? а что я получаю взамен?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

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

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

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

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346884#p3346884"]а если этот код не будет выделен в функцию?[/uquote]

Опять же недопонимание. Как я понял, Вы хотите написать функцию, которая будет выполняться последовательно частями. Это все надо для того, чтобы где-то ее (эту функцию) вызвать, не заботясь какая часть будет выполняться. Это так? Тогда как может быть, что "этот код не будет выделен в функцию"?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

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

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