Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Вопросы по С/С++ (СИ)
а спать - если все счётчики!=0 опять же их проверять, хотя.. когда по всем счетчикам пробежимся, проверяя на равенство - ответ сам и получится, складно..., ладно, завтра подумаю... сегодня рабдень кончился
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Реклама
- Сообщения: 291
- Зарегистрирован: Чт ноя 06, 2014 13:09:06
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346143#p3346143"]на сколько я знаю у АВР этот регистр (PC- программ каунтер) недоступен напрямую[/uquote]
Это почему же? Это как раз без проблем (команды переходов, вызовов, возвратов никто не отменял), например запись в PC:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346143#p3346143"]да и в его лезть, это почти как под поездом стрелки переводить...[/uquote]
Вот это точно. Компилятор сгенерировал код, а Вы хотите "прыгать" в этом коде, как Вам хочется? Ничего хорошего из этого не выйдет.
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346128#p3346128"]как добыть точку возврата?[/uquote]
Она (точка возрата) лежит под стеком.
Это почему же? Это как раз без проблем (команды переходов, вызовов, возвратов никто не отменял), например запись в PC:
Код: Выделить всё
#define avr_write_pc(new_pc) do { \
asm volatile ( \
"ijmp" "\n\t" \
: : "z" (new_pc)); \
} while (0)
Вот это точно. Компилятор сгенерировал код, а Вы хотите "прыгать" в этом коде, как Вам хочется? Ничего хорошего из этого не выйдет.
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346128#p3346128"]как добыть точку возврата?[/uquote]
Она (точка возрата) лежит под стеком.
про стек знаю - там продолжение вопроса было.
а про размещение в майне - код при прочих равных длиннее будет (счетчики по 2 раза проверять приходится)
а про размещение в майне - код при прочих равных длиннее будет (счетчики по 2 раза проверять приходится)
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
вы можете хотя бы в общих чертах обрисовать задачу, которую решаете? ну не укладываются у меня в голове ваши методы решения с тем, что я сам себе представляю... нужны пояснения.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 291
- Зарегистрирован: Чт ноя 06, 2014 13:09:06
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346235#p3346235"]про стек знаю - там продолжение вопроса было.[/uquote]
Да, не внимательно читаю. Но и называть это "точкой возрата" странно - скорее, это точка входа, если я правильно понял то, что вам надо:
Далее можно объявить: extern void xx_wo_inc (void); и вызывать эту функцию, т.е. на самом деле "прыгать" в середину другой функции. Вот во что это скомпилировалось:
Т.е. все нормально - можно безболезнено вызывать xx_wo_inc (). Но это очень простая функция и здесь все получилось. Вообще говоря, "вход внутрь функции" - идея странная, я без о-о-о-о-о-очень больших оснований бы так не делал никогда, и Вам не советую. 
Да, не внимательно читаю. Но и называть это "точкой возрата" странно - скорее, это точка входа, если я правильно понял то, что вам надо:
Код: Выделить всё
static unsigned char xx_var;
void xx (void)
{
xx_var += 1;
asm volatile ("xx_wo_inc: .globl xx_wo_inc\n");
if (xx_var) {
xx_var = 0;
}
}
Код: Выделить всё
xx:
lds r24,xx_var
subi r24,lo8(-(1))
sts xx_var,r24
xx_wo_inc: .globl xx_wo_inc
lds r24,xx_var
tst r24
breq .L3
sts xx_var,__zero_reg__
.L3:
ret
- Реклама
судя по всему вы предложили очередной вариант setjmp.h, о котором уже было сказано... даже не понимаю, зачем об этом говорить вообще...viiv писал(а):Вот во что это скомпилировалось:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 291
- Зарегистрирован: Чт ноя 06, 2014 13:09:06
[uquote="ARV",url="/forum/viewtopic.php?p=3346260#p3346260"]судя по всему вы предложили очередной вариант setjmp.h, о котором уже было сказано... даже не понимаю, зачем об этом говорить вообще...[/uquote]
Ничего общего с setjmp()/longjmp(). Вообще не понимаю, почему у Вас возникла такая ассоциация
Ничего общего с setjmp()/longjmp(). Вообще не понимаю, почему у Вас возникла такая ассоциация
- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
Добрый день, есть enum который будет использоваться в в нескольких файлах подскажите пожалуйста как его объявить?
Так как дублирование typedef запрещено, пока нашел вариант и создать хедер и объявить в ним пользовательский тип. Подключать там где надо.
есть ли еще варианты?
Так как дублирование typedef запрещено, пока нашел вариант и создать хедер и объявить в ним пользовательский тип. Подключать там где надо.
есть ли еще варианты?
- Сообщения: 291
- Зарегистрирован: Чт ноя 06, 2014 13:09:06
[uquote="baghear",url="/forum/viewtopic.php?p=3346285#p3346285"]пока нашел вариант и создать хедер и объявить в ним пользовательский тип. Подключать там где надо.
есть ли еще варианты?[/uquote]
Так и надо делать. А зачем другие варианты?
есть ли еще варианты?[/uquote]
Так и надо делать. А зачем другие варианты?
- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
умение объяснять (особо письменно) хоть и развивается, но пока не сильная моя сторонаviiv писал(а):скорее, это точка входа, если я правильно понял то, что вам надо:
я предпочитаю прыгать безопасно - только внутри подпрограммы "горизонтально", чтобы очередность стека не нарушить (входить как природой средой программирования задумано а уже потом шалить
———————————————
ARV, сейчас практических задач не стоит - собранный таким алгоритмом прибор исправно трудится в холодильнике: в тиню2313 запихнул дин.индикацию, работу с кнопками (антидребезг и комбинации) опрос термодатчика (его опрос и выкладывал в примере), таймеры (чтобы компрессор не мог включаться слишком часто, плавная регулировка яркости по конечнику двери (или датчику освещенности), меню для настройки рабочих температур, хотел добавить таймер, чтобы уменьшить потребление дорогого дневного электричества (но счетчик там оказался однотарифный). есть и другие поделки сделанные так и не только на тинях.
просто (пока есть свободное время) решил осмотреться и поприбраться...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ну вот почему:viiv писал(а):Ничего общего с setjmp()/longjmp(). Вообще не понимаю, почему у Вас возникла такая ассоциация
вы предложили способ без применения setjmp.h сделать то же самое: из середины одной функции прыгнуть в середину другой. по-моему, общее с setjmp естьviiv писал(а):т.е. на самом деле "прыгать" в середину другой функции
вот я и не понимаю, почему вместо причесывания кода в приличной манере вы пытаетесь освоить какие-то грязные хаки... имхо, лучше структурного программирования для Си не придумать. конечный автомат хорош, когда количество состояний небольшое. поэтому вместо наворачивания всего в один конечный автомат правильнее разбивать алгоритм на несколько маленьких. и, разумеется, распределять задачи между главным циклом и прерываниями - может, тогда и потребности в бесконечных автоматах не возникнетIvanoff-iv писал(а):решил осмотреться и поприбраться...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
сложность конечных автоматов не столько в количестве состояний, сколько в количестве и разнообразии прерходов. у меня переходы линейны, да и не переходы это по своей сути (разве правильно называть переходом перемещение из точки а в точку а, пусть и через промежуток времени?)
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
[uquote="ARV",url="/forum/viewtopic.php?p=3346110#p3346110"]но вообще мне не хватает break из вложенных циклов... как бы можно было это реализовать - не знаю, но не помешало бы точно
[/uquote]тут как раз goto вполне в тему 
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3346504#p3346504"]тут как раз goto вполне в тему
[/uquote] ну вот! я тоже считаю что в goto нет ничего страшного (пока он не попал не в те руки) это универсальный инструмент, но какраз за излишнюю универсальность его и не любят. (шарился по нэту - там так и пишут: я использую goto (приводится пример кода с ним и без с явным преимуществом в пользу goto и в размере и в наглядности), а как делать вам - решайте сами
)
——————————————
осталось найти как силами среды (чтоб в код попал только результат его работы) сделать счётчик для автоматического нумерования меток и будет функция отдачи управления майн процессу (типа OS_Yield (); из OSA) готова.
——————————————
осталось найти как силами среды (чтоб в код попал только результат его работы) сделать счётчик для автоматического нумерования меток и будет функция отдачи управления майн процессу (типа OS_Yield (); из OSA) готова.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Всю тему я, правда, не читал. Но, как я понял, вы с помощью 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
для того и использую.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 КБ) 372 скачивания
Последний раз редактировалось Ivanoff-iv Чт апр 05, 2018 08:33:25, всего редактировалось 1 раз.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Это лучше сжечь.подскажите лучше это:
Чтобы подсказать, как нужно сделать правильно, нужно точно знать, что вы решаете со всеми нюансами. И вникнуть. Но вряд ли кто этим займётся, кроме вас.
А зачем вы делаете 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
[uquote="da-nie",url="/forum/viewtopic.php?p=3346705#p3346705"]А зачем вы делаете sei в обработчике таймера? Вы любите балансировать на грани работоспособности программы?[/uquote] delay_ms(100); это далеко за гранью работоспособности программы... и ничего не упало.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Всему своё время. 
И день и ночь в пути...
Мои программки: 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


