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


ARM

В контроллерах на основе ядра ARM используется другой подход к атомизации перехода в режим низкого потребления. Производители кристаллов ARM, такие как Atmel, NXP и TI, объединяют стандартное ядро ARM7 или ARM9 с набором периферийных модулей собственной разработки, включающих контроллеры прерываний и управления питанием. Связь между различными частями процессора получается не жёсткая и внутреннее состояние ARM не влияет на периферию. Что же касается прерываний, то ядро может запретить их, устанавливая биты "I" и "F" в регистре состояния программы (current program status register - "CPSR"), но это действие не повлияет на внешний [* по отношению к ядру] модуль управления питанием и внешний же контроллер прерываний, которые вводят дополнительный уровень управления.

Такая конструкция позволяет контроллерам ARM переходить в режим малого потребления с запрещёнными на уровне ядра прерываниями. Сразу после перехода модуль управления питанием выключает тактирование ядра, но любое событие, разрешённое на уровне контроллера прерываний, тактирование восстанавливает. Для ускорения обработки сразу же после возобновления работы ядро должно разрешить прерывания на своём уровне.

В листинге 6 показан общий принцип перехода в режим низкого потребления для контроллеров на ядре ARM (компилятор IAR ARM, процессор AT91SAM) [4]. Модуль управления питанием останавливает тактирование ядра ("AT91C_BASE_PMC->PMC_SCDR = 1") при запрещённых на уровне ядра прерываниях. Разблокировка прерываний происходит уже после пробуждения, когда процессор выполнит внутреннюю функцию "__enable_interrupt()". Такое поведение можно наблюдать, если подключиться к активному приложению через JTAG отладчик. Исполнение будет останавливается на строке "__enable_interrupt()".

Листинг 6. Стратегия перехода в режим пониженного потребления для микроконтроллера на ядре ARM (компилятор IAR ARM, процессор AT91SAM)

    __disable_interrupt();              /*  Запретить прерывания            */
    if (idle_condition()) {             /*  Состояние простоя ?             */
        AT91C_BASE_PMC->PMC_SCDR = 1;   /*  Да: запретить тактирование ядра */
        __enable_interrupt();           /*  Разрешить прерывания в ядре     */
    }
    else {
        __enable_interrupt();           /*  Нет: разрешить прерывания в ядре */    
    }

				

 

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

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