2016-04-02 7 views
4

У меня есть код, запущенный из ОЗУ в с низким энергопотреблением (поэтому прерывание не обрабатывается). Этот режим включен по кодовой последовательности: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 этого содержания довольно таблица:

example code execution from RAM

Там 2 случая, когда выполнение кода остановилось на 3 цикла. Поэтому я не уверен, что мое асинхронное событие пробуждения не произойдет между инструкциями BTJT и WFE.

Есть ли способы обеспечить строгую логическую последовательность (условие проверки> wfe> событие пробуждения)?

+0

Непонятно, что вы просите. После выполнения инструкции WFE ЦП уже пробужден событием и выполняется следующая инструкция. Следующая инструкция должна быть инструкцией JRA, которая возвращается к инструкции BTJT. Последовательность: 1) тестовый бит и цикл выхода, если он установлен 2) ждать события пробуждения 3) перейти к шагу 1. Если вы правильно запрограммировали регистры управления WFE, это должно быть эквивалентно последовательности 1) тестовый бит и выйти если набор 2) перейдите к шагу 1. Инструкция WFE просто экономит электроэнергию. –

+0

@Ross, это правда, как вы думаете? _После выполнения инструкции WFE ЦП уже пробужден событием и выполняется следующая инструкция. Теперь я считаю, что эта ошибочная конструкция кода и правильный способ заключается в использовании WFE-функции только в том случае, если имеется довольно большой запас время. И в более сложных случаях не используйте его после каких-либо соревновательных событий пробуждения. – imbearr

+0

Я уверен, что он работает так, как я описал. Во время выполнения инструкции WFE процессор спит и ждет события. По завершении выполнения инструкции WFE процессор больше не спит и больше не ждет события. Затем он переходит к выполнению следующей инструкции, точно так же, как обычно, когда команда завершает выполнение. Тем не менее, я все еще не понимаю, в чем проблема. поэтому мы не можем говорить об одних и тех же вещах. Какую проблему решал бы большой промежуток времени? –

ответ

1

Решение найдено OP:

Я прочитал список опечаток (спасибо Ross Ridge) несколько раз более внимательно, и это главная идея:

Общее решение, чтобы гарантировать отсутствие запроса прерывания или событие происходит во время выполнения команды WFE или цикла повторного выполнения посредством правильного времени приложения.

5

Если ваши проблемы Блокировки вызваны опечатками WFE я говорил тогда должен быть простым решением, чем пытаться добиться «правильного времени приложения».

errata provided by STMicroelectronics гласит:

Два типа неудач может произойти:

Случай 1:
В случае, если инструкция WFE помещается в двух MSB из 32-битового слова в памяти, событие, которое происходит во время цикла выполнения или цикла повторного выполнения WFE (при возврате из обработчика ISR ) приведет к некорректному выполнению кода.

Случай 2:
Запрос на прерывание, возникающий во время цикла выполнения WFE , приведет к некорректному выполнению кода. Это также справедливо для цикла WFE повторного выполнения, при возвращении из ISR обработчика

Случай 2 не должны применяться в вашем случае, как вы говорите, «Прерывания не обрабатываются, потому что я использую режим низкой мощности запуска ». Если прерывания не могут произойти во время инструкции WFE, только отказ, описанный в первом случае, может вызвать блокировки.

Дело 1 применяется только в том случае, если инструкция WFE находится в определенном выравнивании в 32-разрядном слове в памяти. Поэтому, если вы можете убедиться, что инструкция WFE никогда не появляется в коде, выровненном таким образом, вы не столкнетесь с этим сбоем. Если ваш ассемблер поддерживает директиву align, вы можете использовать его для достижения этого, возможно, вместе с меткой и прыжком, если ассемблер не вставляет NOP. Однако простое решение дается как «выделенный» обходной путь в опечаток:

Replace инструкцию WFE с

 WFE 
    JRA next 
next: 

Это, кажется, работает вокруг провала, помещая то, что составляет 2- байт NOP после инструкции WFE. Я предполагаю, что отказ приводит к тому, что CPU не выполняет инструкцию сразу после инструкции WFE, вместо этого пропускает два байта в инструкцию (если есть) в начале следующего 32-битного мира. Помещение 2-байтового NOP в пропущенное пространство означает, что не имеет значения, произошел ли сбой или нет.

+0

не так сложно пересмотреть код, чтобы обеспечить правильное время, и это более правильный путь для моего мнения. – imbearr

 Смежные вопросы

  • Нет связанных вопросов^_^