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


MSP430

MSP430 - 16-разрядный контроллер со сверхнизким потреблением фирмы Texas Instruments. Он поддерживает чистый атомарный переход в любой из пяти возможных режимов сохранения энергии, так как биты, управляющие тактированием, и бит разрешения прерываний ( "GIE") расположены в одном месте - регистре состояния ("SR") [2].

Код для компилятора GNU gcc для MSP430, приведённый в листинге 2, показывает как выполнить атомарный переход в режим малого потребления LPM1 с одновременным разрешением прерываний. Макрофункция "_bis_SR_register (LPM1_bits | GIE)" разворачивается в единственную ассемблерную инструкцию "BIS.W #0x58,SR", которая одновременно устанавливает биты 0x58 в регистре "SR". Единичное значение бита 0x10 ("CPUOFF") выключает тактирование ядра, [* единичное значение бита 0x40 ("SCG0") выключает внутренний генератор DCO,] а единичное значение бита 0x08 ("GIE") разрешает прерывания.

Листинг 2. Код для компилятора GNU MSP430 gcc показывает как выполнить атоммарный переход в режим пониженного потребления LPM1 с одновременным разрешением прерываний

    _disable_interrupts();                  /*  _asm("DINT");               */
    if (idle_condition()) {                 /*  Состояние простоя ?         */
        _bis_SR_register(LPM1_bits | GIE);  /*  Да: _asm("BIS.W #0x58, SR"); */    
    }
    else {
        _enable_interrupt();                /*  Нет: _asm("EINT");          */
    }

				

 

В MSP430 с его атомарным переходом в любой из режимов малого потребления возникает противоположная проблема [* - прерывание не изменяет автоматически режим питания ядра, притом, что сам обработчик работает в режиме максимальной мощности]: в каждом обработчике прерывания (ISR) нужно прямо запрещать режим малого потребления, меняя сохранённое в стеке состояние регистра "SR", чтобы после выхода из прерывания контроллер не засыпал вновь, а возвращался к выполнению фонового задания. К счастью, это очень легко сделать с помощью встроенной в большинство компиляторов для MSP430 функции. Листинг 3 показывает код обработчика прерывания для компилятора GNU gcc.

Листинг 3. Пример обработчика прерываний для компилятора GNU MSP430 gcc

    __interrupt void Timer_A(void);             /*  Прототип обработчика    */
    TIMERA0_ISR(Timer_A) __interrupt void Timer_A (void) {
        _bic_SR_register_on_exit(LPM1_bits);    /*  Отменяем переход в LPM1 */
        ...                                     /*  Код собственно ISR      */    
    }

				

 

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