Вопросы по С/С++ (СИ)
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Вопросы по С/С (СИ)
сложность конечных автоматов не столько в количестве состояний, сколько в количестве и разнообразии прерходов. у меня переходы линейны, да и не переходы это по своей сути (разве правильно называть переходом перемещение из точки а в точку а, пусть и через промежуток времени?)
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Вопросы по С/С++ (СИ)
[uquote="ARV",url="/forum/viewtopic.php?p=3346110#p3346110"]но вообще мне не хватает break из вложенных циклов... как бы можно было это реализовать - не знаю, но не помешало бы точно
[/uquote]тут как раз goto вполне в тему 
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Вопросы по С/С++ (СИ)
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3346504#p3346504"]тут как раз goto вполне в тему
[/uquote] ну вот! я тоже считаю что в goto нет ничего страшного (пока он не попал не в те руки) это универсальный инструмент, но какраз за излишнюю универсальность его и не любят. (шарился по нэту - там так и пишут: я использую goto (приводится пример кода с ним и без с явным преимуществом в пользу goto и в размере и в наглядности), а как делать вам - решайте сами
)
——————————————
осталось найти как силами среды (чтоб в код попал только результат его работы) сделать счётчик для автоматического нумерования меток и будет функция отдачи управления майн процессу (типа OS_Yield (); из OSA) готова.
——————————————
осталось найти как силами среды (чтоб в код попал только результат его работы) сделать счётчик для автоматического нумерования меток и будет функция отдачи управления майн процессу (типа OS_Yield (); из OSA) готова.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- da-nie
- Говорящий с текстолитом
- Сообщения: 1590
- Зарегистрирован: Вс июн 24, 2012 16:07:00
- Откуда: Лен.Обл.
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Всю тему я, правда, не читал. Но, как я понял, вы с помощью 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 от ситуации и на следующей итерации автомат выполнит уже другую функцию.
В целом, я за 18 лет игр с Си++ goto не применял ни разу. Только в бейсике. 
Вот, посмотрите, например. Ни одного goto:
https://github.com/da-nie/3DEngine-Universal
https://github.com/da-nie/teamcontrolclient
Goto не нужен в 99.9999999% случаев.
А вы все состояния сведите в один большой 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 нет ничего страшного
Вот, посмотрите, например. Ни одного 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
Мои программки: 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: Вопросы по С/С++ (СИ)
для того и использую.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);
}- Вложения
-
- загрузка АЛУ.png
- (132.45 КБ) 359 скачиваний
Последний раз редактировалось Ivanoff-iv Чт апр 05, 2018 08:33:25, всего редактировалось 1 раз.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- da-nie
- Говорящий с текстолитом
- Сообщения: 1590
- Зарегистрирован: Вс июн 24, 2012 16:07:00
- Откуда: Лен.Обл.
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Это лучше сжечь.подскажите лучше это:
Чтобы подсказать, как нужно сделать правильно, нужно точно знать, что вы решаете со всеми нюансами. И вникнуть. Но вряд ли кто этим займётся, кроме вас.
А зачем вы делаете sei в обработчике таймера? Вы любите балансировать на грани работоспособности программы?
Даже такая стабильная ОС, как QNX, способна упасть, если не будет успевать обрабатывать события внутри системного такта.а когда прерывание завершается - подпрограмма продолжается:
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Мои программки: 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: Вопросы по С/С++ (СИ)
[uquote="da-nie",url="/forum/viewtopic.php?p=3346705#p3346705"]А зачем вы делаете sei в обработчике таймера? Вы любите балансировать на грани работоспособности программы?[/uquote] delay_ms(100); это далеко за гранью работоспособности программы... и ничего не упало.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- da-nie
- Говорящий с текстолитом
- Сообщения: 1590
- Зарегистрирован: Вс июн 24, 2012 16:07:00
- Откуда: Лен.Обл.
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Всему своё время. 
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Мои программки: 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: Вопросы по С/С++ (СИ)
расчетно порушить её можно специально записав delay_ms(17000); но так писать и не надо - для того и делал, - надо Delay(1,17000,delayx,delayt); и всё будет ок (только для таких длинных интервалов delayt придется делать лонг...), правда если delay будет лонг - то и delay_ms(17000); её не вышибет...
другой вариант для больших интервалов использовать предделитель для вызова этой функции (счетчик пойдёт медленнее).
на встречный вопрос об ожидании внешнего события - в цикл ожидания надо вставить Delay(1,0,delayx,delayt); и всё будет ОК
другой вариант для больших интервалов использовать предделитель для вызова этой функции (счетчик пойдёт медленнее).
на встречный вопрос об ожидании внешнего события - в цикл ожидания надо вставить Delay(1,0,delayx,delayt); и всё будет ОК
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Вопросы по С/С++ (СИ)
Берите нормальною ОС, типа FreeRTOS. Возможностей гораздо больше.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Вопросы по С/С++ (СИ)
можно было бы вообще счетчик останавливать, тогда можно пихать код любой длительности, но это доппроверки -> удлинение кода, а т.к. я пытаюсь его ужать - то лучше про этот нюанс просто буду помнить.
___________________
а нормальная ОС в тини влезет?
___________________
а нормальная ОС в тини влезет?
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Каждый сам выбирает способ выстрелить себе в ногу... и если уж кто решил - бесполезно отговаривать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346671#p3346671"]нет, только выход наружу (вместо брейк) и только в пределах функции[/uquote]
Если все тек, как Вы описываете ниже используйте return вместо goto. И никаких меток
Если все тек, как Вы описываете ниже используйте return вместо goto. И никаких меток
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Вопросы по С/С++ (СИ)
а если этот код не будет выделен в функцию?
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- da-nie
- Говорящий с текстолитом
- Сообщения: 1590
- Зарегистрирован: Вс июн 24, 2012 16:07:00
- Откуда: Лен.Обл.
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
А вы его выделите. 
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Мои программки: 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: Вопросы по С/С++ (СИ)
бывает, за пару слов борорься приходится а вы мне предлагаете потерять ещё немного флеша на запись, памяти на стек и времени на переход? а что я получаю взамен?
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Вопросы по С/С++ (СИ)
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346922#p3346922"]бывает, за пару слов борорься приходится а вы мне предлагаете потерять ещё немного флеша на запись, памяти на стек и времени на переход? а что я получаю взамен?[/uquote]
Компилятор все заоптимизирует. Не будет никаких вызовов.
Компилятор все заоптимизирует. Не будет никаких вызовов.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346922#p3346922"]бывает, за пару слов борорься приходится а вы мне предлагаете потерять ещё немного флеша на запись, памяти на стек и времени на переход? а что я получаю взамен?[/uquote]вы так и не объяснили, зачем вам строго нормированное по времени исполнения дробление кода. поэтому объяснить вам преимущества иного подхода - невозможно. тем более, что вы не особо прислушиваетесь. ну и соответственно, желание советовать тоже тает.
ковыряться в ваших макросах уже никто не хочет, да и ответов на ваши вопросы, по-моему, уже три страницы нет. прогноз каков? останетесь вы со своими проблемами в гордом одиночестве, да и все. мир не перевернется, никто не пострадает, никто и не заметит. всем, и вам тоже, будет наплевать на всё.
ковыряться в ваших макросах уже никто не хочет, да и ответов на ваши вопросы, по-моему, уже три страницы нет. прогноз каков? останетесь вы со своими проблемами в гордом одиночестве, да и все. мир не перевернется, никто не пострадает, никто и не заметит. всем, и вам тоже, будет наплевать на всё.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346884#p3346884"]а если этот код не будет выделен в функцию?[/uquote]
Опять же недопонимание. Как я понял, Вы хотите написать функцию, которая будет выполняться последовательно частями. Это все надо для того, чтобы где-то ее (эту функцию) вызвать, не заботясь какая часть будет выполняться. Это так? Тогда как может быть, что "этот код не будет выделен в функцию"?
Опять же недопонимание. Как я понял, Вы хотите написать функцию, которая будет выполняться последовательно частями. Это все надо для того, чтобы где-то ее (эту функцию) вызвать, не заботясь какая часть будет выполняться. Это так? Тогда как может быть, что "этот код не будет выделен в функцию"?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Такой ощущение, что человек начал разговор не из-за помощи или совета, а что бы что-то кому-то доказать.
Советовать тоже уже нет никакого желания...
Советовать тоже уже нет никакого желания...