Часы реального времени (Real-Time Clock, RTC) в контроллерах STM32 реализованы в двоично-десятичном коде (BCD-формат). Для хранения даты и времени в таком формате необходимо по крайней мере 5 байт памяти. Существуют случаи, когда место, отводимое для хранения метки времени может стать критичным, например, в случае ведения журнала событий в энергонезависимой памяти микроконтроллера, где объём памяти, выделяемый под всё событие (номер события, его временная метка, параметры и контрольная сумма) может составлять всего 16 байт. При меньшем объёме памяти фиксируемого события достигается максимальное число хранимых событий в журнале и уменьшается время на операцию записи одного события, что критично для резервных источников питания (ионисторы, электролитические конденсаторы) в случае пропадания основного питания микроконтроллера.
Простейшим способом увеличить объём памяти под полезную информацию при фиксированной длине массива является применение алгоритма упакованного времени. Для этого значение времени из BCD-формата необходимо перевести в привычную позиционную систему счисления, минимальная единица времени - секунда, далее необходимо выбрать дату и время отсчёта. В конкретном случае выбрана дата 01 января 2001 года. В этом случае выигрыш в объёме памяти будет составлять 1 байт (6,25% при использовании 16-байтного массива).
При пересчёте времени из BCD-формата, применяемого в микроконтроллерах STM32 необходимо учесть следующее:
- високосный год (реализация на языке Си представлена на рисунке 2);
- количество дней в зависимости от месяца (реализация вычисления количества секунд на языке Си представлена на рисунке 3);
Переменная типа “Упакованное время” занимает 4 байта и интерпретируются как целое число (unsigned long). Упакованное время является количеством секунд, пошедших с 1 января 2001 года (понедельник), рассчитывается из обычного времени по определенному алгоритму, учитывающему високосные годы.
Видно, что упакованное время имеет дискретность 1 секунда и диапазон до 2137 года. Контроллер учитывает високосные годы. После 2137 года можно выбрать другое смещение (например 2101 год).
Чтобы избежать необходимость каждый раз пересчитывать текущее время из BCD-формата при его фиксации, имеет смысл провести данную операцию разово при включении контроллера и инкрементировать переменную, хранящую данные времени в упакованном формате каждую секунду.
Для случаев, когда необходимо только значение даты объём памяти, выделяемый под хранение времени можно сократить до двух байт.
Такие специфические форматы даты и суточного времени выбраны в связи с тем, что они позволяют уменьшить затраты на хранение временных параметров и ускорить процесс принятия решения о проходе.
Преимущества использования формата упакованного времени:
- уменьшение объёма выделяемой памяти;
- увеличение скорости обработки при работе с переменной упакованного времени;
Недостатки использования формата упакованного времени:
- отсутствие удобочитаемости в отличие от двоично-десятичного кода;
- использование дополнительного процессорного времени для операций расчёта.
Исходный код размещён на github