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


Cortex-M3

Cortex-M3 это модификация 32-разрядной RISC архитектуры ARM для использования в недорогих малопотребляющих носимых устройствах. У него есть несколько отличий от обычных ARM7 и ARM9. Основным изменением, относящимся к теме обсуждения, является тесная интеграция вычислительного ядра, системы управления питанием и приоритетного контроллера прерываний (nested vectored interrupt controller - NVIC).

Набор команд Thumb-2, используемый только в семействе Cortex, содержит специальную инструкцию "WFI" (wait for interrupt - ожидать прерывания) для остановки тактирования ядра. К сожалению, справочные данные (ARMv7-M Reference Manual [5], Cortex-M3 Technical Reference [6] и технические данные LM3Sxxx) [7] не сообщают может ли "WFI" использоваться при запрещённых прерываниях.

В отсутствие информации приходится экспериментировать с реальным контроллером. При использовании модели LM3S811 с ядром Cortex-M3 фирмы Luminary Micro [* сейчас TI] было обнаружено, что инструкция "WFI" может использоваться с запрещёнными прерываниями (регистр "PRIMASK" установлен в единицу). Как и ожидалось, после выполнения "WFI" процессор прекращал выполнение программы, но любое прерывание, разрешённое в приоритетном контроллере (NVIC) пробуждало ядро. В листинге 7 показан атмарный переход в режим сна для ядра Cortex-M3 (компилятор IAR ARM).

Листинг 7. Перехода в режим сна для процессора Cortex-M3 (компилятор IAR ARM)

    __disable_interrupt();      /*  __asm("CPSID i");                       */
    if (idle_condition()) {     /*  Состояние простоя ?                     */
        __asm("WFI");           /*  Да: Остановить CPU и ожидать прерываний */
        __enable_interrupt();   /*  __asm("CPSIE i");                       */
    }
    else {
        __enable_interrupt();   /*  Нет: __asm("CPSIE i");                  */    
    }

				

 

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