У меня есть код, запущенный из ОЗУ в с низким энергопотреблением (поэтому прерывание не обрабатывается). Этот режим включен по кодовой последовательности:STM8 ASM безопасно выполнить WFE
- переход к RAM
- SIM
- выключатель внутренней вспышки, а также регулятор мощности, переключатель для источника тактового сигнала низкой скорости (LSE)
- сделать некоторую работу с режимом WFE (режим низкой мощности ожидания)
- выключатель на регулятор мощности и вспышки, восстановить источник синхронизации
- RIM
- прыжок прошить
Таким образом, нет проблем с инструкцией WFE, описанной в листе ошибок. Проблема с этой конструкцией, это может быть причиной блокировки центрального процессора в режиме низкой мощности ожидания навсегда:
while nbit(TIM1_SR1,CC3IF) asm("wfe");
, который разборка как:
000035 720252B602 BTJT TIM1_SR1, #1, 0xB6
00003A 728F WFE
событий от таймера имеет вероятностный характер, и это код не гарантирует, что это произойдет после выполнения инструкции WFE:
- Инструкция BTJT вычитается за 2 цикла и имеет длину 5;
- код выполняется из оперативной памяти может быть не непрерывным, так как «выборка» состояние приостановки выполнения на несколько циклах
Я использую ручной PM0044, а на странице 26 этого содержания довольно таблица:
Там 2 случая, когда выполнение кода остановилось на 3 цикла. Поэтому я не уверен, что мое асинхронное событие пробуждения не произойдет между инструкциями BTJT и WFE.
Есть ли способы обеспечить строгую логическую последовательность (условие проверки> wfe> событие пробуждения)?
Непонятно, что вы просите. После выполнения инструкции WFE ЦП уже пробужден событием и выполняется следующая инструкция. Следующая инструкция должна быть инструкцией JRA, которая возвращается к инструкции BTJT. Последовательность: 1) тестовый бит и цикл выхода, если он установлен 2) ждать события пробуждения 3) перейти к шагу 1. Если вы правильно запрограммировали регистры управления WFE, это должно быть эквивалентно последовательности 1) тестовый бит и выйти если набор 2) перейдите к шагу 1. Инструкция WFE просто экономит электроэнергию. –
@Ross, это правда, как вы думаете? _После выполнения инструкции WFE ЦП уже пробужден событием и выполняется следующая инструкция. Теперь я считаю, что эта ошибочная конструкция кода и правильный способ заключается в использовании WFE-функции только в том случае, если имеется довольно большой запас время. И в более сложных случаях не используйте его после каких-либо соревновательных событий пробуждения. – imbearr
Я уверен, что он работает так, как я описал. Во время выполнения инструкции WFE процессор спит и ждет события. По завершении выполнения инструкции WFE процессор больше не спит и больше не ждет события. Затем он переходит к выполнению следующей инструкции, точно так же, как обычно, когда команда завершает выполнение. Тем не менее, я все еще не понимаю, в чем проблема. поэтому мы не можем говорить об одних и тех же вещах. Какую проблему решал бы большой промежуток времени? –