Миро Самек "Использование режимов малого энергопотребления в простых программных архитектурах" (перевод)
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
- 51200 просмотров
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика 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
15 недель 6 дней назад
8 лет 22 недели назад
8 лет 38 недель назад
8 лет 48 недель назад
8 лет 49 недель назад
9 лет 5 недель назад
9 лет 30 недель назад
9 лет 31 неделя назад
9 лет 34 недели назад
9 лет 45 недель назад