Управление несколькими процессами с помощью millis() - создание диспетчера задач

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Logik пишет:

Чисто тебе, как  бывшему ПэХэПэшнику. Делай как то так


typedef struct LED
{
    uint8_t pin;  //куда подключен светодиод
    uint8_t stat; //текущее состояни светодиода
    uint16_t cnt;  //счетчик оставшихся времени
    uint16_t poluperiod;  //пол периода моргания
};


LED led[]={
  {2, 0, 0,500}, 
  {3, 0, 0,400},
  {4, 0, 0,100},
  {13,0, 0,300};

Ну так то и слону понятно. Меня другой вопрос интересовал.

Logik
Offline
Зарегистрирован: 05.08.2014

Так задай этот самый другой вопрос, может и узнаешь ответ. Если имеешь в виду массив из функций - так запросто. Можно даже в те же структуры, что я описал добавить еще поле - указатель на функцию.

 

NikShel
Offline
Зарегистрирован: 21.01.2018

Эта функция должна вызываться как можно чаще, чтобы не иметь проблем с пропусками выполнения задач, а потому поместим ее вызов в loop().

Ну и итоговый скетч:

Светодиоды подключаются к цифровым выводам 4, 5, 6 и 7 ардуино.

--------------------------------------------------------------------------------

Я так понимаю это ответ на мой вопрос !

Мне нравится!!

А скетчи от Green 24/01/2022 - 08:10 & BOOM 25/01/2022 - 07:57

у меня как-то не работают.

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

NikShel пишет:

Я так понимаю это ответ на мой вопрос !

В общем-то нет. Таких вопросов здесь вагон и маленькая тележка ))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Logik пишет:

Так задай этот самый другой вопрос, может и узнаешь ответ. Если имеешь в виду массив из функций - так запросто. Можно даже в те же структуры, что я описал добавить еще поле - указатель на функцию.

 

Что в моем вопросе в #49 не понятно? Я там ничего про массивы не писал, а писал о «подстановке», если так понятнее. Но на сколько я знаю, в Си такое невозможно. Или возможно?

Logik
Offline
Зарегистрирован: 05.08.2014

Не. Не понятно. Не понятно что ты хочешь получить. Даже гугл не помогает.

на  "подстановка php"

5 нояб. 2016 г. · 1 ответ
я думал, что интерпретатор СНАЧАЛА подставит значение переменных $x и $y, а ПОТОМ начнет читать заново полученную строку, увидит \x23 и ...
15 авг. 2010 г. — PHP: $string = '{hi} меня {call} {name}'; $array = ( 'hi' => 'Привет', 'call' => 'зовут' ...
 
Принципы проектирования классов SOLID в PHP. Принцип подстановки Барбары Лисков. (Liskov Substitution Principle, LSP). Это третий из пяти принципов SOLID и ...

???

если про СОЛИД - то я за! )))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Logik

Вот смотри, вполне используемая в PHP конструкция:

$name = "classname";
$obj = new $name;

Вполне законная и по моему вопросу выше конструкция (так же в PHP):

$("LED" . $i . "_PIN")

Где $i - переменная в цикле от, к примеру, 0 до N. (Могу синтаксис написания немного путать, давно не говнокодил на PHP, но вроде бы все так). Результат будет перечень переменных вида: LED0_PIN, LED1_PIN .. LEDN_PIN, которым даже значения можно присваивать и считывать их.

В Си я ничего подобного не встречал. Поэтому и задал вопрос...

Logik
Offline
Зарегистрирован: 05.08.2014

Первый кусок кода на рефлексию смахивает, если не ошибаюсь. И шо ты хочешь от $("LED" . $i . "_PIN")? Обращение к пину или переменная с номером пина? Если обращение к пину - то никак. Не в си дело, в виринге.  В вирингн только один способ к пину digitalWrite/digitalRead. Можно конечно из чистого си извернутся, но это уже не совсем ардуино, платформенно-зависимый код. Если переменная с номером пина - нет проблем led[i].pin из объявлений в #51. Записывать и считывать можно. Это массив структур. Можно и LED[i].Set(HIGH) - вызов функции Set(HIGH) с параметром HIGH, для i-го пина она может быть индивидуальной, может общей для всех или некоторых.

Варианты с строковыми именами ("LED" и т.д) - не плохо, а очень плохо. Строки сильно медленно обрабатываются. Потому в си только идентификаторы - константы, числа но ничто не мешает их именовать 

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Logik пишет:

Варианты с строковыми именами ("LED" и т.д) - не плохо, а очень плохо. Строки сильно медленно обрабатываются. Потому в си только идентификаторы - константы, числа но ничто не мешает их именовать 

Спасибо.

bwn
Offline
Зарегистрирован: 25.08.2014

Добавил ссылку в #3 Песочницы.

NikShel
Offline
Зарегистрирован: 21.01.2018
v258 пишет:
 
Для начала, собственно, создадим наши задачи. Для этого нужно объявить и инициализировать четыре переменные типа taskData.
 
1
// ==== список задач ============================
2
taskData led1 = (taskData){true, 500, 0};  // задача активна, интервал срабатывания - 500 милисекунд
3
taskData led2 = (taskData){true, 20, 0};  // задача активна, интервал срабатывания - 20 милисекунд
4
taskData led3 = (taskData){false, 200, 0}; // задача неактивна, т.е. не начинает выполняться в момент старта МК, интервал срабатывания - 200 милисекунд
5
taskData led4 = (taskData){true, 300, 0};  // задача активна, интервал срабатывания - 300 милисекунд
Каждая задача должна выполнять какое-то действие. А значит должна быть функция, которая будет вызываться 
 
------------------------------------------------------
v258, нужна помощь!
 
Пытался поменять частоту мигания led1. 
 
Для этого вместо, указанных 500 мс, вставил переменную Current_Interval_LED1. 
 
Cделал новую задачу, процедуру её выполнения, добавил в void tick() положенный  if .
 
Новая моя задача (подсчёт нажатий кнопки) - выполняется, Current_Interval_LED1 - изменяется, но на частоту миганий это никак не влияет.
 
Я так понимаю, что обращение к задаче выполняется только один раз! Как бы изменить эту ситуёвину?
 
b707
Offline
Зарегистрирован: 26.05.2017

NikShel пишет:

Я так понимаю, что обращение к задаче выполняется только один раз! Как бы изменить эту ситуёвину?

неправильно понимаете.
 
внимательно прочтите сообщение #2. Обратите внимание на метод setTaskInterval()
NikShel
Offline
Зарегистрирован: 21.01.2018

При попытке вставить правильно код, выдаёт такое:

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, zzziii@mail.ru and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.


Apache/2.2.23 (FreeBSD) mod_fcgid/2.3.6 PHP/5.2.17 with Suhosin-Patch DAV/2 Server at arduino.ru Port 80
-----------------------------------------------
Вчера сообщил на этот адрес: zzziii@mail.ru

и написал об этом на форуме.

b707
Offline
Зарегистрирован: 26.05.2017

NikShel пишет:

При попытке вставить правильно код, выдаёт такое:

а у меня без проблем

Internal Server Error

Может у вас код на 10 тыс строк?

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

b707 пишет:

Может у вас код на 10 тыс строк?

Или в тексте кода содержатся какие-либо спецсимволы, которые нельзя добавлять.

NikShel
Offline
Зарегистрирован: 21.01.2018

b707 пишет:

NikShel пишет:

Я так понимаю, что обращение к задаче выполняется только один раз! Как бы изменить эту ситуёвину?

неправильно понимаете.
 
внимательно прочтите сообщение #2. Обратите внимание на метод setTaskInterval()

Cпасибо!

получилось!!

NikShel
Offline
Зарегистрирован: 21.01.2018

BOOM пишет:

b707 пишет:

Может у вас код на 10 тыс строк?

Или в тексте кода содержатся какие-либо спецсимволы, которые нельзя добавлять.

1
// ==== список задач ============================
2
taskData led1 = (taskData){true, 500, 0};  // задача активна, интервал срабатывания - 500 милисекунд
3
taskData led2 = (taskData){true, 20, 0};  // задача активна, интервал срабатывания - 20 милисекунд
4
taskData led3 = (taskData){false, 200, 0}; // задача неактивна, т.е. не начинает выполняться в момент старта МК, интервал срабатывания - 200 милисекунд
5
taskData led4 = (taskData){true, 300, 0};  // задача активна, интервал срабатывания - 300 милисекунд
Каждая задача должна выполнять какое-то действие. А значит должна быть функция, которая будет вызываться 
 
Вот это пытался правильно вставить
Windows 10 Pro
Microsoft Edge Версия 98.0.1108.62 (Официальная сборка) (64-разрядная версия)
b707
Offline
Зарегистрирован: 26.05.2017

NikShel пишет:

Вот это пытался правильно вставить

 1
// ==== список задач ============================
2
taskData led1 = (taskData){true, 500, 0};  // задача активна, интервал срабатывания - 500 милисекунд
3
taskData led2 = (taskData){true, 20, 0};  // задача активна, интервал срабатывания - 20 милисекунд
4
taskData led3 = (taskData){false, 200, 0}; // задача неактивна, т.е. не начинает выполняться в момент старта МК, интервал срабатывания - 200 милисекунд
5
taskData led4 = (taskData){true, 300, 0};  // задача активна, интервал срабатывания - 300 милисекунд
Каждая задача должна выполнять какое-то действие. А значит должна быть функция, которая будет вызываться 

как видете - без проблем.

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

NikShel
Offline
Зарегистрирован: 21.01.2018

// ==== первый светодиод ========================
void setLed1()
{
  static bool led_state = false; // флаг состояния светодиода

  led_state = !led_state;            // меняем флаг состояния светодиода на противоположный
  digitalWrite(LED1_PIN, led_state); // выполняем работу - включаем или выключаем светодиод
}

 

NikShel
Offline
Зарегистрирован: 21.01.2018

Да, работает!

Но пусть СисАдмин вместо того сообщения вставит примерно такой текст:

Ну Ты и лох! Научись правильно вставлять код!!

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

NikShel пишет:

Да, работает!

Но пусть СисАдмин вместо того сообщения вставит примерно такой текст:

Ну Ты и лох! Научись правильно вставлять код!!

Самокритично )))

Morroc
Offline
Зарегистрирован: 24.10.2016

v258 пишет:

Стандартная отсылка к скетчу BlinkWithoutDelay очевидно не всегда помогает новичку понять суть вопроса. Здесь мы попробуем разжевать вопрос более подробно и попытаемся создать некое подобие диспетчера задач.

Когда то еще в прошлом веке с друганом изучали программирование, так сказать, пописывая небольшие игрушки на бейсике/асме бк и спектрума. Оба быстро нарвались на необходимость множества параллельных действий. Интернетов тогда не было, да и с книжками не очень, что такое КА удалось узнать через годы и хотя мозговой штурм был не долгим, но основной затык я помню - это именно переход от линейного выполнения команд друг за другом к алгоритму КА, а собственно написание кода после этого осознания настолько плевое дело, что не особо нуждается в разборе, ну вот разве что как это все красивше оформить. Ну т.е. imho именно отличие алгоритма КА от мигалки с delay нуждается в объяснении и именно поэтому BlinkWithoutDelay не помогает новичку - новичок просто не понимает сходу принципиальную разницу.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Morroc пишет:

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

Верно. Даже предложенный здесь диспетчер задач требует пересмотра подхода к программированию. Но таки кто хочет - сможет. А кто не хочет - ему ничего не поможет ))