# 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 _Handle&#x72;_&#x73;empre é 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 %}
