> For the complete documentation index, see [llms.txt](https://bit-by-bit.gitbook.io/embedded-systems/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bit-by-bit.gitbook.io/embedded-systems/processadores-cortex-m0+/modos-de-operacao.md).

# Modos de operação

## Suporte para sistemas operacionais

Para suporte de sistemas operacionais, o processador possui modos de execução e exceção dedicados. Além disso, o fabricante do chip pode incluir um timer em hardware de 24 bits chamado Systick (System Tick Timer) e outros recursos como: unidade de proteção de memória (MMU), vetores de interrupção realocáveis e *shadowed stack*.

### Modos de operação

Existem dois modos de operação: *Thread* e *Handler*. O modo *Thread* é definido quando a operação do processador é iniciada (modo de *Reset*). O processador entra em modo *Handler* quando ocorre uma exceção (interrupção). Quando o contexto é restabelecido, o processador retorna para o estado *Thread*.

![](https://www.embarcados.com.br/wp-content/uploads/2018/07/HandlerThread.png)

### Shadowed stack

Existem duas pilhas, denominadas *Main* e *Process Stack Pointer*. O motivo dessa duplicação é o seguinte: No modo de operação *Handler*, a pilha *Main* (MSP) é utilizada. Já no modo *Thread*, essa definição é realizada via configuração do registrador de controle do processador. Esse recurso permite que tarefas de um sistema operacional não sejam corrompidas pela aplicação.

### Modos de execução

Além dos modos de operação, existem dois estados de execução: Privilegiado e Não Privilegiado. O estado de privilégio significa que o código de aplicação pode executar todas as instruções disponíveis e acessar todos os recursos de hardware, por exemplo, acessar o registrador de controle do processador. O modo de operação *Handler*sempre é executado com privilégio. Já o modo não privilegiado tem as seguintes restrições:

* Pode ter o acesso restrito para alguns periféricos.
* Não pode acessar o Systick, NVIC, e os registradores de controle do processador.
* Algumas instruções tem a execução limitada (MSR e MRS) e outras não podem ser utilizadas (CPS – controle de interrupção).

## Suporte à exceções

Possui um sistema flexível para controlar interrupções, denominado NVIC. Tal sistema tem suporte para 32 fontes de interrupção, com funções de priorização (4 níveis) e ativação.

![](https://www.embarcados.com.br/wp-content/uploads/2018/07/NVIC.png)

Ao todo, existem seis tipos de exceções mais o Reset \[1].

* Hardware fault: Tem a maior prioridade, sendo causada por algum erro, por exemplo, ao executar uma instrução indefinida, ou realizar uma operação de Load em um endereço que não está alinhado.
* NMI: Interrupção gerada por periféricos ou via software. Não pode ser mascarada.
* IRQ: Interrupção gerada por periféricos ou via software.
* SVCall: Exceção gerada pela execução da instrução SVC.
* PendSV: Requisição de interrupção feita pelo sistema (SO). Usada para trocar o contexto, isto é, atender a chamada SVC.
* Systick: Exceção gerada quando a contagem do Systick chega ao valor zero.

Toda exceção possui um número de identificação, um endereço na tabela de interrupções e uma prioridade de execução. Na tabela de interrupções, os primeiros 16 endereços possuem funções específicas, sendo o restante dependente do fabricante do microcontrolador. A primeira posição é destinada para indicar o endereço da região de stack. A segunda, para indicar o ponto de entrada da aplicação.

![](https://www.embarcados.com.br/wp-content/uploads/2018/07/Vetores.png)

A latência de interrupção é de 15 ciclos de clock e se mantém constante – *zero jitter* – independente das instruções executadas. O único fator que altera esse tempo é a configuração de *wait states* no acesso à memória \[].

As ISRs não necessitam de instruções para o ponto de entrada, evitando a sobrecarga/aumento das operações. Isso ocorre devido a operação de carga dos registradores – *hardware stacking* –  na pilha durante a troca de contexto \[1].

{% hint style="info" %}
***Latência:** Ciclos de clock necessários para que o processador responda ao evento de interrupção.*
{% endhint %}

{% hint style="info" %}
***Jitter:** Variações que podem ocorrer no tempo tomado para uma interrupção.*
{% endhint %}

## Modos de sleep

Considerando aplicações de baixo consumo, o processador tem suporte para dois modos de *sleep*: normal e profundo (*deep*). O comportamento desses modos é dependente do chip (fabricante). Podem ser adicionados modos específicos de baixo consumo (ou, *power saving*), totalizado 4 modos de *sleep*.

Outras propriedades que resultam em redução de consumo são destacadas a seguir:

{% hint style="info" %}
***Wakeup:** Possui módulo que permite monitorar interrupções em modo sleep. Quando ocorre uma exceção o processador retoma o estado de execução para tratar a ISR.*
{% endhint %}

{% hint style="info" %}
***Sleep-on-exit:** Permite que o processador retorne para o modo de sleep quando uma ISR é tratada.*
{% endhint %}
