Easyelectronics.ru

Электроника для всех
Текущее время: 17 сен 2019, 01:37

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 82 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 01 окт 2014, 15:32 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Давайте разговаривать предметно. Без примеров.
Я, как видите, порешал эту задачу. Знаю, какие возникают проблемы.


Почитал ваш код.
Наши решения по сути не отличаются. Что в общем-то логично, ибо врядли что-то оригинальное для этой задачи можно придумать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 01 окт 2014, 16:03 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Mirmik писал(а):
Давайте разговаривать предметно. Без примеров.
Я, как видите, порешал эту задачу. Знаю, какие возникают проблемы.

Давайте предметно. Без комментариев я не могу прочитать код. Соответственно, не могу оценить.
Но switch-case у вас присутствует. А условия я обозначил. О чем и речь. Без автоматного программирования или пусть будет просто switch-case технология задачи очень тяжело решаются. Спор закончен? Как я и говорил, автоматное программирование, switch-case технология не имеет никакого отношения к диспетчерам и RTOS. Это абсолютно самостоятельное направление.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 01 окт 2014, 16:07 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Ну, ок...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 01:07 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1578
Откуда: Киев
Демиург красава. Любую программу можно обозвать конечным автоматом. Количество состояний (дампов памяти и регистров) конечно? Конечно. Входящие символы есть? Есть. Конечный автомат! Сжечь ведьму!

Твой код настолько же нечитаем, как и у Мирмика.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 07:56 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Steel.ne писал(а):
Демиург красава. Любую программу можно обозвать конечным автоматом. Количество состояний (дампов памяти и регистров) конечно? Конечно. Входящие символы есть? Есть. Конечный автомат! Сжечь ведьму!

Твой код настолько же нечитаем, как и у Мирмика.

Ну а вы что имеете против? Мирмик сказал, что якобы новичкам рано знать, что такое автоматное программирование, switch-case технология. Я же говорю, что без этого программа превращается в нечитаемую мешанину из флагов, условий и так далее. И я привел простейший пример - функцию опроса кнопок.
По поводу читабельности кода. У каждого свой стиль. Вы привели свои примеры. И на что я обратил внимание, так это на то, что вы уделяете очень большое внимание гламурности. На каждый чих своя функция. Там где можно выделить явные состояния, вы будете это превращать в якобы "идеальный код". Я вам тогда сказал, покажите на моем примере ваш "идеальный код". Вы это сделали? Нет. Попытались, конечно. Там, где можно гораздо проще написать, вы увлеклись гламурностью.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 19:13 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
demiurg1978 писал(а):
|>)))))))@>

Разве ваш код не есть мешанина флагов условий и уровней абстракции?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 19:24 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Условия в программе будут всегда. Только набор условий зависит от того, как написать программу, в первую очередь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 19:38 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
не только лишь все могут юзать КА.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 19:57 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
celeron366 писал(а):
не только лишь все могут юзать КА.

Слушай, умник. Я тебе даю точно такой же способ доказать свою правоту. Дано: опрос клавиатуры. Удержание, автоповтор. Пусть кнопки висят на одном порту. От тебя пример без использования КА и switch-case технологии. Или отвечай за свои слова или проходи мимо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 20:35 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
Как бы не будет такого. Но связно говорить вы все равно не в состоянии.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 20:54 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Э-э-э, нет чувак. Все это время я от тебя не видел ни одного вменяемого сообщения. Сейчас ты самым явным образом слился. Сказал, за свои слова не ответил. Грош цена твоим сообщениям. Так очередной чувак инетовский, которому лишь бы с умным видом что-то написать. Так что в дальнейшем, уважаемый, проходите мимо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 21:08 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
Сам придумал мой слив сам меня поймал сам обиделся сам ушел?) Окче, онанируй дальше на суперлупы с задержками.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 21:10 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Или отвечай за свои слова или иди мимо. Разговор закончен. Мне есть чем ответить. Ты ничем свои слова не подтвердил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 21:14 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
Я за СВОИ слова отвечаю, а не за твои фантазии. Хотя это надо бы в личку, лф бан или че там.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 21:18 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3283
demiurg1978 писал(а):
celeron366 писал(а):
не только лишь все могут юзать КА.

Дано: опрос клавиатуры. Удержание, автоповтор. Пусть кнопки висят на одном порту. От тебя пример без использования КА и switch-case технологии.

всю жизнь было просто синтаксическим сахаром для if() else if() else if(), а тут вдруг технология.

Код:
void scan_keyboard(){
  for (int i = 0; i < BUTTON_NUM; i++){
    if (active(BUTTON[i])) button_timer[i]++; else button_timer[i] = 0;
    if (button_timer[i] == BUTTON_DEBOUNCE_TIME) button_event_fifo.push(i);
    if (button_timer[i] == BUTTON_AUTOREPEAT_TIME + BUTTON_DEBOUNCE_TIME + 1){ button_timer[i] = BUTTON_DEBOUNCE_TIME + 1; button_event_fifo.push(i);}
  }
}

только не надо объяснять что это тоже конечный автомат состояние которго хранится в переменной таймера, Steel.ne всё правильно сказал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 02 окт 2014, 21:50 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
_pv писал(а):
...

Теперь усложняем задачу. Если держим, скажем 1 с, включается автоповтор. Продолжаем удерживать, каждые 1 секунду увеличивается скорость автоповтора.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 03 окт 2014, 03:01 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3283
demiurg1978 писал(а):
_pv писал(а):
...

Теперь усложняем задачу.

и что же должно произойти?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 03 окт 2014, 16:52 
Заглядывает иногда

Зарегистрирован: 28 мар 2013, 11:01
Сообщения: 86
_pv писал(а):
всю жизнь было просто синтаксическим сахаром для if() else if() else if(), а тут вдруг технология.

Да просто какой-нибудь преподаватель какого-нибудь института написал методичку о всем известных вещах и гордо обозвал это switch-технологией.

Кстати, а о чем спор то?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 03 окт 2014, 17:36 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
Вкратце - "ртос это для гламура, хардкорный эмбеддер юзает только ка!" vs "учи ртос, советы по програмизму из 70х годов уже не актуальны".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 03 окт 2014, 18:29 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
Кстати, как насчет конечного автомата в задаче ртос? Я делал, удобно. Разного уровня эти две вещи, и одно другого не исключает. Некоторые задачи практически идеально вписываются в ка, и тут хочешь-нехочешь, а ка будет. Как эта задача про обработку этих несчастных кнопок. Но не ка единым, иногда код на них получается не столь очевидным, проще бывает обычный линейный код, ака задача ртос.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 03 окт 2014, 18:39 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
elisey писал(а):
Кстати, как насчет конечного автомата в задаче ртос? Я делал, удобно. Разного уровня эти две вещи, и одно другого не исключает. Некоторые задачи практически идеально вписываются в ка, и тут хочешь-нехочешь, а ка будет. Как эта задача про обработку этих несчастных кнопок. Но не ка единым, иногда код на них получается не столь очевидным, проще бывает обычный линейный код, ака задача ртос.

Автоматное программирование абсолютно самостоятельное направление. Заметьте, я не говорю, что автоматное программирование панацея. Если мне проще обычным линейным кодом писать, значит это будет линейный код. Если проще флаг поставить, значит будет флаг.
И КА спокойно можно использовать в задаче в RTOS. Одно другому нисколько не мешает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 03 окт 2014, 21:15 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Я малёк помедитировал над этим вопросом... Так сказать, разложил его себе по полочкам, и склонен согласиться с камрадом Демиургом в части того, что тема "автоматов" достойна того, чтобы быть описанной и изучаемой, именно как выделенная тема, причем, на весьма начальном уровне. Я покопался в памяти, и, действительно, в своё время, когда я изучил этот приём, согласно которому итерация какого-то процесса оформляется как вызов функции, сверяющейся с текущим состоянием задачи, я был весьма им и собой доволен. Хотя, конечно, я никогда не подозревал, что приём этот нужно называть "автоматом" или "технологией". И, хотя я не очень хорошо знаком с теорией, наверняка для обозначения этого принципа придуман какой-нибудь умный паттерн.

Другое дело, что подход этот придуман не сегодня и не вчера, а чуть ли не на заре истории программирования, примерно в тоже время, как вообще появилась концепция процедур и подзадач.

Давайте я для простоты назову этот приём или подход паттерном "автомат".

Я, и многие на нашем форуме, действительно неправильно (или, скажем, не так, как это делает Демиург) интерпретируем слово "автомат". Это повелось от термина "флаговый автомат", который является одним из методов организации псевдокооперативной многозадачности.

Здесь встречается затык. Татарчевский предлагает использовать патерн "автомат" для оформления подзадач, для части которых, как мы выяснили, паттерн этот совершенно незаменим. Но цикл статей Татарчевского плох тем, что там сей паттерн возведён в абсолют. Татарчевский описывает не столько сам паттерн, сколько то, как с помощью него можно реализовать псевдокооперативную многозадачность. И всё это вместе вызывает заблуждения и кашу в голове. И, кстати говоря, представляется мне фундаментально неправильным, поскольку основное назначение паттерна отнюдь не в том, чтобы разорвать выполнение задачи, отдав вычислительное время другой задаче, хотя это, конечно, одна из его возможностей.

Что же такое паттерн "автомат".
Суть паттерна в том, что объект запоминает, какую из веток кода следует задействовать при следующем своём вызове.
Тоесть, паттерн "автомат" представляет собой функциональный объект, обладающий возможностью менять своё поведение в зависимости от истории своих вызовов.
Объект при этом может как иметь входные данные, так и не иметь их.

С помощью паттерна автомат решаются такие типовые задачи как:

Потоковая обработка последовательности входных символов, включающая служебные последовательности. Например, с помощью этого паттерна замечально отлавливаются ESC-последовательности.
Как выяснено ранее, опрос клавиатуры.
Управление индикаторами, устройствами вывода.

Банальный пример без входного потока данных:
Код:
void blink()
{
static int a;
a = (a+1)%4;
switch(a){
case 0: RED_ON(); GREEN_OFF(); BLUE_OFF();
case 1: RED_OFF(); GREEN_ON(); BLUE_OFF();
case 2: RED_OFF(); GREEN_OFF(); BLUE_ON();
case 3: SOUND(); RED_OFF(); GREEN_OFF(); BLUE_OFF();
};
};

Функция эта работает просто. При каждом своём вызове она зажигает следующий светодиод, но на каком-то этапе генерирует звуковой сигнал.
Если мы в систему включим некий таймер, что раз в 200 миллисекунд будет вызывать нам эту функцию, мы получим бегущий огонёк, прерывающийся на издание звукового сигнала.
(Я специально включил сюда совершенно нелогичный SOUND(), чтобы пример стал чуть менее банальным).
Обратите внимание, что таймеров надо не четыре, а всего один за счет того, что задача помнит предыдущее состояние.

В этом собственно и есть сакральный смысл паттерна.

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

Чем плох паттерн?
Паттерн плох тем, что все его крутые возможности являются не плодом деятельности какого-то объекта, а сохранены в структуре кода. Это делает паттерн негибким. Тоесть автомат этот действительно конечный, то есть законченный. Простите за игру слов. Это означает, что если я хочу в функцию blink ввести дополнительные светодиоды, мне придется изменить что-то в механизме изменения ее состояний. Тоесть "автомат" плохо масштабируется. Это логично, потому что, чтобы там не говорил Демиург, по сути, это все тот же набор if, else, хоть и замаскированный.


Основной смысл моего мессаджа в следующем:
1. Паттерн "Конечный автомат" это хорошо. И используется он часто и практически всеми на определённом этапе развития
2. Путать его с "флаговым автоматом" не следует.
3. Цикл статей Татарчевского сильно выходит за рамки данной проблематики и сложен для понимания.
4. Называть сей метод технологией - излишне громко.

P.S. Детский сад, старшая группа... Слился, не слился...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 03 окт 2014, 21:41 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Mirmik писал(а):
P.S. Детский сад, старшая группа... Слился, не слился...

Ну сорри, просто целерон меня немного, м-м-м, вывел из-себя. Строит из себя умника, а конкретного от него нет.

Ну и какую альтернативу автоматному программированию вы предлагаете? Потому что у меня наступил тот момент, когда я увидел, что чисто автоматное программирование начинает себя исчерпывать. RTOS не предлагать. Я говорю о программных решениях, алгоритмах. Если это будет правильно сказано, понятиях.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 03 окт 2014, 22:00 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Зависит от задачи, разумеется.

Я объясню, почему RTOS рано или поздно появляется на повестке дня.
Дело в том, что любая попытка сделать многозадачность без вытеснения контекста натыкается на проблемы.... эмм... функций отложенного выполнения.

Тоесть, допустим мы пишем код, в котором, в теле процедуры есть чтение с диска или с флешки, или ожидание ввода по USART.
То есть мы пишем какой-нибудь
Код:
read(file, str, 129);

И операционка начинает длительный, но не связанный с задействованием процессора, процесс лифтования данных с диска... И только потом осуществляет возврат из функции.

Но, пока она это делает, в рамках псевдомногозадачного подхода временно перейти к выполнению других задач невозможно (ну, или очень ограничено возможно). Потому что потеряется локальный контекст.

Если мы попытаемся решить эту задачу на автоматах, можно попытаться разорвать выполнение задачи на верхнюю и нижнюю половины, разделённые операцией чтения. Но что делать, если таковых отложенных чтений у нас двадцать восемь? Делать двадцать девять кусков?

Поэтому, как бы не хотелось думать, но вытеснение - это не блаж, а необходимость.

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

Диспетчер - это правильно.
Более того, они идеально друг с другом сочетаются, ибо и создавались друг для друга.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 04 окт 2014, 00:56 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
demiurg1978 писал(а):
Mirmik писал(а):
P.S. Детский сад, старшая группа... Слился, не слился...

Ну сорри, просто целерон меня немного, м-м-м, вывел из-себя. Строит из себя умника, а конкретного от него нет.

Ну и какую альтернативу автоматному программированию вы предлагаете? Потому что у меня наступил тот момент, когда я увидел, что чисто автоматное программирование начинает себя исчерпывать. RTOS не предлагать. Я говорю о программных решениях, алгоритмах. Если это будет правильно сказано, понятиях.

Ну вы можете например конкретно пойти нахер, например. Потому что нефиг каждому встречному пихать знание о свитч кейсе как некое откровение.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 82 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB