Вопщем, это не наша тема, а v258, и не про Даллас, а про задачи. Надо Алехандру сказать, чтоб всё лишнее апчистил
Дет! Мне очень неловко, но на RP2040 есть FreeRTOS, на которой есть треды и очереди уже искаропки. А исчо семафоры мутексы блэкджек и шахматистки!
Там тот же даллас в отдельном потоке просто так, с delay(750) пишеццо. ;)))
Я ж про то и говорю постоянно.Когда помрет последний монстр, с навыками “бега в мешке” и на заводах в урну полетит последний лейаут с 8-ми битником, то куда умище девать станем? ;))
Я так не умею.
Как я понимаю, ОСь это просто удобство. Хотя и свои заморочки тоже.
ну и нахрена городить огород когда можно паразитировать на millis() ?
На C++ я не умею этого делать, но написать в коде ваапще нет проблем…
PS точность условная одна миллисекунда, ну иногда две вполне устроит отцов русской демократии
Так тут и есть “паразитирование на миллис”
@v258 , а как обстоит дело с пропущенными задачами? Например, задача должна запускаться каждую 1 мс , но вторая задача крутит цикл аж 1.5 мс. Или такого не бывает?
Спросил просто из интереса…
Запустится с опозданием. Но такое лучше не проектировать изначально. Тем более что у миллиса, емнип, дискретность более 1 мс соврал, таки одна единица
Спойлер
void setup() {
Serial.begin(115200);
}
void loop() {
static uint32_t data[10];
static uint32_t timer = 0;
static uint32_t cur_time;
cur_time = millis();
static byte n = 0;
if(cur_time - timer >= 1)
{
timer = cur_time;
data[n] = cur_time;
if (++n >= 10)
{
n = 0;
for (byte i = 0; i < 10; i++)
{
Serial.print(data[i]);
Serial.print(",");
}
Serial.println();
}
}
}
Вывод в сериал
1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,
1015,1016,1017,1018,1019,1020,1021,1022,1024,1025,
1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,
1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,
1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,
Но это на 328 атмеге, да и тут может проскакивать (см. вторую строку вывода)
Я шутки понимаю только свои!!!
Я ж ведь и в самом деле показывать начну ;))). Тока на ЕСП, у меня PR нет сейчас.
Давеча крутил индикацию, зарядил таймер на 500 мкс, отлично. Но, нужно следить за кнопкой и считать время при этом. И всё бы хорошо, но нужно ещё сохраняться в ЕЕПРОМ ежеминутно. А вот тут нужно и подумать.) Какие решения?
Например:
shTaskManager tasks(1);
shHandle save_eeprom; // идентификатор задачи, по которому ею можно управлять; по сути это индекс задачи в списке
void saveEEPROM()
{
// здесь сохраняешься
}
void setup()
{
save_eeprom = tasks.addTask(60000, saveEEPROM);
}
void loop()
{
tasks.tick()
}
ОК. Вижу что автоматом сохраняешься каждые 60 сек?
А время на сохранение учитываешь? А мне ведь общее время ещё нужно считать.
Как напишешь, так и будет
Ну да, и я ведь про то же.)
Микроса нет. Заряжаю таймер на 500 мкс, по нему делаю индикацию, он же системный тик. Однако, при записи в ЕЕПРОМ получается что тик замедляется. Ага?
Нужен механизм хранения состояния для каждой задачи. Глобальные переменные убивают весь смысл.
Каждая задача имеет свой флаг. Доступ только через геттеры и сеттеры. Никаких глобальных переменных.
печально
Почему?
Тик срабатывает при каждом проходе лупа. Если что-то замедляет этот проход, то и тик сработает чуть позже. Тут как бэ выше головы не прыгнешь.
Ну да, это понятно. Когда есть что то типа millis() проблем нет, но если приходится считать самому…