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

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

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

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

Сообщение viiv »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346143#p3346143"]на сколько я знаю у АВР этот регистр (PC- программ каунтер) недоступен напрямую[/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=3346143#p3346143"]да и в его лезть, это почти как под поездом стрелки переводить...[/uquote]
Вот это точно. Компилятор сгенерировал код, а Вы хотите "прыгать" в этом коде, как Вам хочется? Ничего хорошего из этого не выйдет.

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346128#p3346128"]как добыть точку возврата?[/uquote]
Она (точка возрата) лежит под стеком.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346235#p3346235"]про стек знаю - там продолжение вопроса было.[/uquote]
Да, не внимательно читаю. Но и называть это "точкой возрата" странно - скорее, это точка входа, если я правильно понял то, что вам надо:

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

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;
        }
}
Далее можно объявить: extern void xx_wo_inc (void); и вызывать эту функцию, т.е. на самом деле "прыгать" в середину другой функции. Вот во что это скомпилировалось:

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

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
Т.е. все нормально - можно безболезнено вызывать xx_wo_inc (). Но это очень простая функция и здесь все получилось. Вообще говоря, "вход внутрь функции" - идея странная, я без о-о-о-о-о-очень больших оснований бы так не делал никогда, и Вам не советую. :-)
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

viiv писал(а):Вот во что это скомпилировалось:
судя по всему вы предложили очередной вариант setjmp.h, о котором уже было сказано... даже не понимаю, зачем об этом говорить вообще...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение viiv »

[uquote="ARV",url="/forum/viewtopic.php?p=3346260#p3346260"]судя по всему вы предложили очередной вариант setjmp.h, о котором уже было сказано... даже не понимаю, зачем об этом говорить вообще...[/uquote]
Ничего общего с setjmp()/longjmp(). Вообще не понимаю, почему у Вас возникла такая ассоциация
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Добрый день, есть enum который будет использоваться в в нескольких файлах подскажите пожалуйста как его объявить?
Так как дублирование typedef запрещено, пока нашел вариант и создать хедер и объявить в ним пользовательский тип. Подключать там где надо.
есть ли еще варианты?
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="baghear",url="/forum/viewtopic.php?p=3346285#p3346285"]пока нашел вариант и создать хедер и объявить в ним пользовательский тип. Подключать там где надо.
есть ли еще варианты?[/uquote]
Так и надо делать. А зачем другие варианты?
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Просто так еще не делал)))Спасибо!
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

Сообщение ARV »

viiv писал(а):Ничего общего с setjmp()/longjmp(). Вообще не понимаю, почему у Вас возникла такая ассоциация
ну вот почему:
viiv писал(а):т.е. на самом деле "прыгать" в середину другой функции
вы предложили способ без применения setjmp.h сделать то же самое: из середины одной функции прыгнуть в середину другой. по-моему, общее с setjmp есть
Ivanoff-iv писал(а):решил осмотреться и поприбраться...
вот я и не понимаю, почему вместо причесывания кода в приличной манере вы пытаетесь освоить какие-то грязные хаки... имхо, лучше структурного программирования для Си не придумать. конечный автомат хорош, когда количество состояний небольшое. поэтому вместо наворачивания всего в один конечный автомат правильнее разбивать алгоритм на несколько маленьких. и, разумеется, распределять задачи между главным циклом и прерываниями - может, тогда и потребности в бесконечных автоматах не возникнет
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

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

Сообщение arkhnchul »

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

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

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

Сообщение 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
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение 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 КБ) 372 скачивания
Последний раз редактировалось Ivanoff-iv Чт апр 05, 2018 08:33:25, всего редактировалось 1 раз.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение 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
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

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

Всему своё время. :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Ответить

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