Я достаточно новичок в архитектурах ARM и пытаюсь осмыслить механизм пробуждения.
Так что, во-первых, мне трудно найти хорошую информацию по этому поводу. Документация ARM кажется очень краткой по этой теме.
Я хотел бы понять, когда Cortex (особенно M0, с которым я работаю) проснется.
Для справки я также проконсультировался со следующим:
- Какова цель WFI и WFE инструкции и сигналы событий?
- Почему процессор переходит в режим ожидания при использовании Инструкция WFE, но не при использовании инструкции WFI?
Документация по инструкциям WFE:
3.7.11. WFE
Wait For Event.
Syntax
WFE
Operation
If the event register is 0, WFE suspends execution until
one of the following events occurs:
an exception, unless masked by the exception mask registers or the current
priority level
an exception enters the Pending state, if SEVONPEND in the
System Control Register is set
a Debug Entry request, if debug is enabled
an event signaled by a peripheral or another processor in a
multiprocessor system using the SEV instruction.
If the event register is 1, WFE clears it to 0 and completes immediately.
For more information see Power management.
Note
WFE is intended for power saving only. When writing software assume
that WFE might behave as NOP.
Restrictions
There are no restrictions.
Condition flags
This instruction does not change the flags.
Examples
WFE ; Wait for event
WFI:
3.7.12. WFI
Wait for Interrupt.
Syntax
WFI
Operation
WFI suspends execution until one of the following events occurs:
an exception
an interrupt becomes pending, which would preempt if PRIMASK was clear
a Debug Entry request, regardless of whether debug is enabled.
Note
WFI is intended for power saving only. When writing software assume
that WFI might behave as a NOP operation.
Restrictions
There are no restrictions.
Condition flags
This instruction does not change the flags.
Examples
WFI ; Wait for interrupt
Итак, несколько вопросов:
1) Во-первых, может кто-нибудь пояснить разницу между:
а) Регистры приоритета системного обработчика
б) Регистры приоритета прерывания. Это просто b) для прерываний, не связанных с системой, таких как pendSv?
Теперь несколько сценариев. На самом деле я хотел бы понять, как сценарии регулируются: NVIC IRQ включить NVIC в ожидании PRIMASK
влияют на вход и выход из WFE и WFI.
Таким образом, различные комбинации этих битов дают 8 различных сценариев {NVIC_IRQ enable, NVIC pending, PRIMASK}.
Я уже добавил свое смутное понимание. Пожалуйста, помогите мне с этой таблицей.
- 000 - Нет предотвращения входа в WFE или WFI, но и нет условия пробуждения
- 001 - as 000
- 010 - Как ожидание влияет на переход в спящий режим для WFE и WFI?
- 011 - Думаю, ответ здесь - 010, но с возможно другими условиями пробуждения?
- 100 - Я предполагаю, что WFE и WFI без проблем переходят в режим низкого энергопотребления и выходят из режима низкого энергопотребления.
- 101 - Есть ли разница между выходом из режима питания WFE и WFI?
- 110 - Понятия не имею!
- 111 - Понятия не имею!
Я исключаю здесь приоритеты, поскольку меня пока не слишком беспокоит порядок обработки исключений.
За исключением SEV и сигналов событий, ведет ли WFE то же самое, что и WFI, если SEVONPEND равен 0?
WFI
; приостановить только ЦП для выключения всех тактовых частот, но самообновление DDR 32 кГц. - person artless noise   schedule 28.11.2014WFI
, настраивается через отдельный регистр, специфичный для SOC. Например, модуль UART может поддерживать асинхронную статическую логику, которая обнаруживает входящий символ. Вы можете настроить это так, чтобы выходить из режима самого глубокого сна. Так что регистры NVIC могут вообще не участвовать. Существует некоторый внутренний сигнал типа WFI_WAKE, который SOC направит в ядро. - person artless noise   schedule 28.11.2014