Варіант використання упакованого формату часу в STM32

Годинники реального часу (Real-Time Clock, RTC) в контролерах STM32 реалізовані в двійково-десятковому коді (BCD-формат). Для зберігання дати і часу в такому форматі необхідно принаймні 5 байт пам'яті. Існують випадки, коли місце, відводене для зберігання мітки часу, може стати критичним, наприклад, у випадку ведення журналу подій в енергонезалежній пам'яті мікроконтролера, де об'єм пам'яті, виділений під все подія (номер події, її тимчасова мітка, параметри і контрольна сума) може складати всього 16 байт. При меншому об'ємі пам'яті фіксованого події досягається максимальне число зберігаються подій у журналі і зменшується час на операцію запису одного події, що критично для резервних джерел живлення (іоністори, електролітні конденсатори) у випадку зникнення основного живлення мікроконтролера.

Найпростішим способом збільшити об'єм пам'яті під корисну інформацію при фіксованій довжині масиву є застосування алгоритму упакованого часу. Для цього значення часу з BCD-формату необхідно перевести в звичайну позиційну систему числення, мінімальна одиниця часу - секунда, далі необхідно вибрати дату і час відліку. У конкретному випадку вибрана дата 01 січня 2001 року. У цьому випадку виграш в об'ємі пам'яті буде складати 1 байт (6,25% при використанні 16-байтового масиву).

​Рисунок 1 - Зміна розподілу полів даних при використанні упакованого формату часу на прикладі 16-байтового події
Рисунок 1 - Зміна розподілу полів даних при використанні упакованого формату часу на прикладі 16-байтового події

При перерахунку часу з BCD-формату, що застосовується в мікроконтролерах STM32, необхідно врахувати наступне:

  • високосний рік (реалізація на мові Сі представлена на рисунку 2);

  • кількість днів залежно від місяця (реалізація обчислення кількості секунд на мові Сі представлена на рисунку 3);

Рисунок 2 - Приклад реалізації визначення високосного року
Рисунок 2 - Приклад реалізації визначення високосного року

Змінна типу “Упакований час” займає 4 байта і інтерпретується як ціле число (unsigned long). Упакований час є кількістю секунд, що пройшли з 1 січня 2001 року (понеділок), розраховується з звичайного часу за певним алгоритмом, що враховує високосні роки.

​Рисунок 3 - Реалізація обчислення кількості пройдених місяців в секундах на мові Сі
Рисунок 3 - Реалізація обчислення кількості пройдених місяців в секундах на мові Сі

Видно, що упакований час має дискретність 1 секунда і діапазон до 2137 року. Контролер враховує високосні роки. Після 2137 року можна вибрати інше зсув (наприклад, 2101 рік).

Щоб уникнути необхідності кожного разу перераховувати поточний час з BCD-формату при його фіксації, має сенс провести цю операцію один раз при вмиканні контролера і інкрементувати змінну, що зберігає дані часу в упакованому форматі, кожну секунду.

Для випадків, коли необхідно тільки значення дати, об'єм пам'яті, виділений під зберігання часу, можна скоротити до двох байт.

Такі специфічні формати дати і добового часу вибрані у зв'язку з тим, що вони дозволяють зменшити витрати на зберігання тимчасових параметрів і прискорити процес прийняття рішення про проходження.

Переваги використання формату упакованого часу:

  • зменшення об'єму виділеної пам'яті;

  • збільшення швидкості обробки при роботі з змінною упакованого часу;

Недоліки використання формату упакованого часу:

  • відсутність зручочитання на відміну від двійково-десяткового коду;

  • використання додаткового процесорного часу для операцій розрахунку.

Исходний код прикріпляю. Також він розміщений на github

Прикріплені файли:

Top