Миро Самек "Использование режимов малого энергопотребления в простых программных архитектурах" (перевод)
M16C
M16C - 16-разрядный процессор фирмы Renesas - поддерживает малопотребляющий режим ожидания, включаемый специальной инструкцией "WAIT". Техническая документация на M16C недвусмысленно сообщает, что перед исполнением "WAIT" необходимо разрешить прерывания. Из этого можно заключить, что атомарный переход в режим ожидания процессором не поддерживается [8]. Никаких примечаний, подобных особенностям выполнения пары "SLEEP-SEI" в AVR, в документации на M16C нет, а значит, запрет прерываний ("FCLR I") срабатывает сразу.
Так же, как в 8051, единственным путём для M16C будет нейтрализация каким-либо способом перехода в режим ожидания в обработчике прерывания, не позволяющая фоновому циклу засыпать. В отличие от MCS-51, M16C переводится в режим малого потребления не записью в регистр, а исполнением специальной инструкции, и, следовательно, вариант с теневым регистром неприменим. Идея отмены перехода в режим ожидания требует замены инструкции "WAIT" чем-нибудь нейтральным (таким как "NOP" или "RTS"). Да, речь идёт о самомодифицирующемся коде, но другие способы для M16C не просматриваются. К счастью, M16C имеет фон-неймановскую архитектуру и может выполнять код из оперативной памяти.
Кусок самомодифицирующегося кода может быть очень небольшим. Надо завести в оперативной памяти 4-байтовый массив, как показано в листинге 10. Этот машинный код представляет собой маленькую функцию, выполняющую инструкцию "WAIT", возвращающую управление вызывающей процедуре и пригодную для вызова средствами языка Си. Код модифицируется в фоновом цикле и вызывается через указатель на функцию, как показано в листинге 11.
Листинг 10. Создание 4-байтного массива в оперативной памяти |
|
Листинг 11. Указатель на функцию, вызывающий код листинга 10 |
|
В каждом обработчике прерываний переход в режим ожидания должен быть нейтрализован заменой кода инструкции "WAIT", расположенного в "Wait_code[0]", как показано в листинге 12. Такой подход допускает прерывания на любой машинной инструкции между "FSET I" (разрешением прерываний) и исполнением кода в области "Wait_code[0]". Любое такое прерывание заменит содержимое "Wait_code[0]" на пару инструкций "RTS, NOP", которая просто возвращает управление вызывающей процедуре, то есть фоновому циклу. В результате "WAIT" не срабатывает в тот момент, когда фоновый цикл соберётся, наконец, его выполнить. Итак, любое прерывание, перехватывающее управление у фонового цикла, отменяет переход в состояние ожидания, решая, тем самым, задачу безопасного перехода в режим сна.
Листинг 12. Запрет перехода в каждом прерывании заменой инструкции "WAIT" по адресу "Wait_code[0]" |
|
- блог пользователя teap0t
- 45495 просмотров
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика Imprecise Bus Faults в микроконтроллерах Cortex-M3/M4/M4F
- Self-powered камера
- Фоновый модулятор: беспроводная связь из ничего (перевод)
- Texas Instruments Analog Applications Journal SLYT612 "Снижение искажений в аналоговых КМОП ключах" (перевод)
- USB MSD. Часть 6. Команды SCSI (перевод)
- USB MSD. Часть 3. USB класс накопителей данных (перевод)
- Texas Instruments Application Report SBAA042 "Кодовые схемы, используемые в аналогово-цифровых преобразователях" (перевод)
- 10 принципов правильного интерфейса
- Релиз SDK на русский микропроцессор КРОЛИК
Recent comments
5 лет 20 недель назад
5 лет 35 недель назад
5 лет 45 недель назад
5 лет 47 недель назад
6 лет 3 недели назад
6 лет 27 недель назад
6 лет 28 недель назад
6 лет 31 неделя назад
6 лет 42 недели назад
7 лет 22 недели назад