2014-11-28 20 views
6

Sono ragionevolmente nuovo per le architetture ARM e sto cercando di avvolgere la mia mente attorno al meccanismo di sveglia.arm modalità sleep entry e exit difference WFE, WFI

Quindi, prima di tutto, trovo difficile trovare buone informazioni su questo. La documentazione di ARM sembra essere molto concisa sull'argomento.

Quello che vorrei capire è quando il Cortex (in particolare l'M0 come quello con cui sto lavorando) si sveglierà.

Per avere un riferimento, ho anche sentito il seguente:

La documentazione sulle istruzioni WFE sono:

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 

Il 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 

Così, alcune domande:

1) In primo luogo, qualcuno può chiarire la differenza tra:

a) Sistema Handler priorità Registri

b) di interrupt di priorità Registri. È solo che b) sono per interrupt che non sono correlati al sistema come pendSv?

Ora per alcuni scenari. Davvero vorrei capire come gli scenari disciplinati dal: NVIC IRQ consentono NVIC attesa PRIMASK

influenzano l'entrata e l'uscita di WFE e WFI.

Quindi le varie combinazioni di questi bit producono 8 diversi scenari {abilitazione NVIC_IRQ, NVIC in sospeso, PRIMASK}.

Ho già aggiunto la mia vaga comprensione finora. Per favore aiutami con questo tavolo.

  • 000 - No prevenzione del WFE o di entrata WFI, ma non svegliarsi condizione sia
  • 001 - 000 come
  • 010 - Come funziona attesa influisce entrata in modalità di sospensione per WFE e WFI?
  • 011 - Credo che la risposta qui sia come 010 ma con condizioni di svegliamento potenzialmente diverse?
  • 100 - Immagino che WFE e WFI entrino entrambi in modalità basso consumo e in uscita in modalità basso consumo senza problemi.
  • 101 - Qualunque differenza tra l'uscita di alimentazione WFE e WFI qui?
  • 110 - Non ne ho idea!
  • 111 - Non ne ho idea!

Qui escludo le priorità perché non sono ancora troppo preoccupato per l'ordine di gestione delle eccezioni.

Escludendo SEV e i segnali di evento, WFE si comporta come WFI se SEVONPEND è 0?

+1

Non riesco a capire completamente la tua domanda. Tuttavia, la documentazione ARM è piuttosto ** vaga ** perché spetta all'implementatore SOC collegare questi segnali a una logica diversa. Non penso che questo sia rilevante per il NVIC (conosco meglio il GIC) quindi forse qualcuno può rispondere direttamente alla tua domanda; tuttavia, è necessario consultare la documentazione del SOC per vedere se ha qualcosa su questo comportamento. Ad esempio, molti SOC hanno un registro che raffina ulteriormente ciò che accade su un 'WFI'; * mette in pausa solo CPU * a * tutti i clock disattivati ​​ma DDR 32kHz autoaggiornamento *. –

+1

Ad esempio su alcuni SOC, se un interrupt influenzerà un 'WFI' è configurato attraverso un registro separato che è specifico per SOC. Ad esempio un modulo UART può supportare la logica statica asincrona che rileverà un carattere in arrivo. È possibile configurarlo per riattivare dalle modalità di sospensione più profonde. Quindi i registri * NVIC * potrebbero non essere affatto coinvolti. C'è un segnale interno di tipo * WFI_WAKE * che il SOC si dirigerà verso il core. –

+0

Grazie per questa informazione. Non ero a conoscenza di questi segnali extra. La mia domanda riguarda i significati dei bit di cui sopra. –

risposta

4

Il meccanismo principale per la scia che vedrai su un Cortex-M è un interrupt, quindi WFI (attendere l'interruzione). Su tutte le implementazioni che ho visto si traduce in clock-core del core, anche se a volte sono disponibili modalità di sleep più profondo/latenza più elevata se il design lo supporta.

WFE è più rilevante nei progetti multiprocessore.

Per quanto riguarda le domande - 1. Interrupt e System Handler sono molto simili nel Cortex-M, differendo principalmente dal modo in cui vengono attivati. L'architettura distingue tra loro, ma in pratica sono uguali.

Sono per le vostre tabelle bit, non hanno davvero senso. Ogni implementazione Cortex-M ha la propria interpretazione di ciò che accade durante la WFI. Può variare dal clock di base alle modalità deep-sleep. Consultare la documentazione del microprocessore per la storia vera.

PRIMASK non influenza il comportamento di riattivazione dal sonno.

1

La mia risposta alla domanda sul diverso tra WFI e WFE si basa su ARM Cortex-A9 MPcore, si prega di dare un'occhiata a questo collegamento ARM cortex-a9 MPcore TRM.

Fondamentalmente, ci sono quattro modalità di esecuzione della modalità CPU, modalità standby, modalità dormiente, modalità spegnimento.

Le differenze per WFI e WFE sono il modo per portare la CPU in modalità esecuzione.

WFE può funzionare con l'esecuzione di un'istruzione SEV su qualsiasi processore nel sistema multiprocessore e funziona anche con l'asserzione del segnale di ingresso EVENTI.

WFI non ha questi due.

Anche il modo in cui gestiscono le cause.

WFI deve funzionare con IRQ_Handler, WFE non deve.