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