Первое. Техническое задание топикстартера. Первый выход. Вкл-выкл. Второй выход. Мигалка. Третий выход. Генератор 60 гц. Где соответствие в вашем примере?
Разгром не разгром. Не суть. Требования к проекту. К камню. Если у меня нет задачи вылизывать, чтобы сэкономить пару байтов flash либо SRAM, я не буду тратить свое время. Напишу проект в лоб.
Кстати, подсмотрел пример у MLX90640. Так как работает только какой-нибудь один режим, объединение трёх светодиодов в одну функцию имеет смысл. Действия однотипные, работает только какой то один режим.
Структура программных таймеров в моем примере.
- Код:
typedef struct soft_timer
{
bool status;
u08 sys_tick_prev;
u16 cnt; // Counter.
#ifdef __ST_PERIOD__
u16 period; // Period.
#endif
} soft_timer_t;
Status - Таймер активен-неактивен. Bool. 1 байт.
sys_tick_prev - при установке таймера считывается текущее значение счётчика, который считает временные интервалы в прерывании. Аппаратный таймер настраивается на системный тик. В данном примере это 1 мс. 1 байт.
cnt - Задаваемое время таймера. Если системный 1 мс, значит дискретность 1 мс. Максимальное время 65535 мс.
Итого, каждый программный таймер это 4 байта, в случае без периода, 6 байтов в случае наличия элемента period.
Алгоритм. Обработчик программного таймера работает в основном цикле. Если Status, считывается текущее значение счётчика, который тикает в прерывании, сравнивается с sys_tick_prev. Если значение изменилось, значит, как минимум 1 мс прошла. Декремент cnt. Если нуль, время вышло. Если есть элемент period, это значение, если не нуль, записывается в cnt. Таймер выдает признак, что время вышло и если есть элемент period считает заново.
Так как обработчик программных таймеров работают в основном цикле, это означает, что выполнение основного цикла должно выполняться с запасом за системный тик. В данном случае это 1 мс.
По поводу якобы перерасхода. Когда у меня нет острой необходимости экономить память, я использую эти программные таймеры как есть. Мне не нужно париться, ужиматься. Я беру и использую эти программные таймеры. Пусть у нас три светодиода, значит это три программных таймера. Да, это займет 4 или 6 (если есть элемент period) байтов на каждый таймер. Плюс переменная состояние мигалки. Зато эти 3 мигалки работают независимо.
Последний раз редактировалось
Demiurg Пн окт 17, 2022 10:53:34, всего редактировалось 3 раз(а).