Миро Самек "Использование режимов малого энергопотребления в простых программных архитектурах" (перевод)


Миро Самек


Использование режимов малого энергопотребления в простых программных архитектурах с приоритетной задачей и фоновым циклом


Перевод teap0t<caxapa.ru> v1.000 13-Dec-2012


В современном мире батарейных устройств важно правильно использовать имеющиеся в большинстве процессоров режимы малого потребления и сна. При этом следует учитывать, что современные крупнотиражные устройства на микроконтроллерах (MCU), такие как бытовая техника, торговые автоматы, системы управления двигателями или электронные игрушки, выполнены в виде систем с приоритетной и фоновой задачами.

Программное обеспечение подобных систем состоит из двух основных частей: "приоритетной" - программ-обработчиков прерываний (ISR), незамедлительно обслуживающих внешние асинхронные события, и "фоновой" - бесконечного цикла, который тратит оставшиеся такты процессора на менее срочную работу.

Обычно приоритетные задачи общаются с фоновым циклом через общую область памяти. Фоновый цикл защищает её от повреждения через запрет прерываний на время доступа к общим переменным.

Перед тем, как задействовать режим низкого потребления контроллера, фоновый цикл должен убедиться, что все внешние и внутренние события обработаны и процессор можно остановить до появления следующего прерывания, которое выведет его из режима сна. Такая ситуация называется состоянием простоя (idle) и показана на рисунке 1.

 

Рисунок 1. Система с фоновой и приоритетными задачами и возможностью перехода в режим малого потребления
Рисунок 1. Система с фоновой и приоритетными задачами

 

Выявление состояния простоя подразумевает проверку общих с приоритетным процессом (ISR) переменных, перед началом которой фоновый цикл должен запретить прерывания. Более того, состояние простоя остаётся таковым до тех только пор, пока прерывания запрещены. Если прерывания будут разрешены после выполнения фоновым процессом всей работы, но до того, как он переключит аппаратуру в состояние низкого потребления, внешнее событие может перехватить управление и подготовить новую порцию данных, отменяя, тем самым, состояние простоя. [* оно может возникнуть в тот момент, когда прерывания запрещены, и ждать до момента отмены блокировки]

Упрощая ситуацию, можно сказать, что фоновый процесс завершает свою работу сразу после прерывания и переходит в состояние низкого потребления, когда у процессора ещё полно неотложной работы. Контроллер засыпает на неопределённое время до момента пробуждения от следующего прерывания [* и необязательно от того же источника]. Таким образом, разрешение прерываний до начала перехода в режим низкого потребления открывает временное окно для логических гонок между внешними событиями и переключением режима питания.

Переход в режим сна с запрещёнными прерываниями не позволит разбудить систему, так как сделать это можно только по прерыванию. Работая в режиме с приоритетной/фоновой задачами, контроллер должен разрешать переход в состояние сна одновременно с разрешением прерываний, чтобы не создавать условий для логических гонок.

Многие процессоры позволяют такой "атомарный" переход в режим сна. У других есть многоуровневая система запрещения прерываний и они могут перейти в режим малого потребления с запретом прерываний на одном из уровней. У третьих нет никаких возможностей перехода в режим сна с разрешением прерываний и они требуют иного подхода.


HC08

HC08 - семейство 8-разрядных контроллеров фирмы Freescale Semiconductors. Система команд HC(S)08 содержит две специальные инструкции - "WAIT" и "STOP" - для перехода в режим ожидания с малым потреблением и останова соответственно [1]. В документации на HC08 прямо говорится [* в разделе 7.5 "Low-Power Modes"], что обе инструкции разрешают прерывания как побочный эффект перехода в режим сна. Очевидно, разработчики HC08 предвидели необходимость перехода в режим малого потребления при запрещённых прерываниях [* с их последующим автоматическим разрешением]. Листинг 1 демонстрирует код фонового цикла с атомарным переходом в режим "WAIT" для компилятора CodeWarrior для HC08.

Листинг 1. Код для компилятора CodeWarrior для HC08 показывает фоновый цикл с атоммарным переходом в режим ожидания (WAIT)

    main () {
        ...                             /*  Инициализация                   */
        for (;;) {
            ...                         /*  Основной код фонового цикла     */
            __asm SEI;                  /*  Запрещаем прерывания            */
            if (idle_condition()) {     /*  Состояние простоя ?             */
                __asm WAIT;             /*  Да: переходим в состояние WAIT  */
            }
            else {                      /*  Нет: разрешаем прерывания       */    
                __asm CLI;
            }
        }
    }

				

ПредпросмотрAttachmentSize
low_power_modes_in_background.zip27.87 КБ