Se para a questão 1 os tempos de acionamento do pino RD1 devessem ser personalizados com valores múltiplos de 50 ms (Ex: 100 ms com nível lógico 0 / 50 \mathrm{~ms} com nível lógico 1 ), responda:
  • Seria melhor continuar utilizando uma estrutura cooperative multitask ou FREERTOS considerando que a modificação desta tarefa não impacta nas demais? Justifique sua resposta (textualmente e/ou reescrevendo o trecho de código relacionado a esta tarefa), lembrando que em cada tarefa só pode ser relacionado um pino de I/O e em cada intervalo de tempo (loop) só podem ser executadas no máximo 3 tarefas em uma estrutura cooperative multitask. (0,35 pontos)
  • Qual dos modelos de microcontroladores abaixo deveria ser utilizado para este projeto, considerando o menor custo possível e que caso seja utilizado o FREERTOS, os requisitos mínimos são 1300 bytes de memória RAM, 8Kbytes de memória Flash e um timer? ( 0,3 pontos)
Modelo Características Custo
\mu \mathrm{C} 1 4 pinos de I/O, 1 timer de 16 bits, RAM=2Kbytes e Flash=16Kbytes U$1,30
\mu \mathrm{C} 2 5 pinos de I/O, 1 timer de 16 bits, RAM=2Kbytes e Flash=16Kbytes U$1,40
\mu \mathrm{C} 3 4 pinos de I/O, RAM=2Kbytes e Flash=16Kbytes U$1,20
\mu \mathrm{C} 4 5 pinos de I/O, RAM=2Kbytes e Flash=16Kbytes U$1,30
\mu \mathrm{C} 5 4 pinos de I/O, 1 timer de 16 bits, RAM=1Kbytes e Flash=6Kbytes U$1,10
\mu \mathrm{C} 6 5 pinos de I/O, 1 timer de 16 bits, RAM=1Kbytes e Flash=6Kbytes U$1,20

Passo 1

O enunciado pergunta se, para permitir tempos de “off” e “on” do pino RD 1 ajustáveis em múltiplos de 50 ms (por exemplo 100 ms nivel 0 e 50 ms nivel 1), é melhor manter uma estrutura de cooperative multitask ou migrar para FreeRTOS, considerando que essa mudança na tarefa do RD 1 não afeta as outras. Depois, pede para escolher, ao menor custo, qual dos seis \muC atende ao requisito mínimo de FreeRTOS ( >=1300 B RAM, >=8 K B Flash e um timer). O conteúdo é escalonamento de tarefas em microcontrolador e seleção de hardware.

Passo 2

Em cooperative multitask cada tarefa é um simples laço ou máquina de estados que roda quando é chamada, sem overhead de contexto de RTOS. Como a alteração de tempos no RD 1 é local a essa tarefa e não impacta as outras, e como temos no máximo três tarefas por loop (limite da cooperative), não há ganho de preempção ou priorização fina que justifique usar FreeRTOS. Assim, manter a cooperative multitask é mais leve e simples.

Passo 3

Segue um exemplo de como parametrizar os tempos em cooperative multitask, supondo que o laço principal chame cada 50 ms as três tarefas permitidas:
\texttt{\#define OFF\_MS 100 // personalizável (múltiplo de 50)}áú
\texttt{\#define ON\_MS 50 // personalizável (múltiplo de 50)}áú
\texttt{static const uint8\_t OFF\_COUNTS = OFF\_MS/50;}
\texttt{static const uint8\_t ON\_COUNTS = ON\_MS/50;}
\texttt{void Task\_RD1(void)\{}
\quad \texttt{static uint8\_t state = 0; // 0 = desligado, 1 = ligado}
\quad \texttt{static uint8\_t cnt = 0;}
\quad \texttt{cnt++;}
\quad \texttt{if ((state == 0 \&\& cnt >= OFF\_COUNTS) || (state == 1 \&\& cnt >= ON\_COUNTS)) \{}
\qquad \texttt{RD1 = state; // alterna RD1: state=0\toRD1=0, state=1\toRD1=1}
\qquad \texttt{state ^= 1;} // troca o estado
\qquad \texttt{cnt = 0;}
\quad \texttt{\}}
\texttt{\}}
E o loop principal:
\texttt{while(1)\{}
\quad \texttt{Task\_A();\quad // outra tarefa qualquer}
\quad \texttt{Task\_B();\quad // outra tarefa qualquer}
\quad \texttt{Task\_RD1();}
\texttt{\}}

Passo 4

Para usar FreeRTOS precisamos de \geq 1300 B RAM, \geq 8 K B Flash e um timer. Entre os seis \muC da tabela, apenas \mu\mathrm{C}_1 e \mu\mathrm{C}_2 têm timer de 16 bits, RAM = 2 K B e Flash = 16 K B. O de menor custo é \mu\mathrm{C}_1 (U$ 1,30).

Resposta

Continuar com cooperative multitask, pois a alteração de tempo em RD 1 não afeta outras tarefas e mantém código mais simples.
Microcontrolador recomendado: \mu\mathrm{C}1.

Exercícios relacionados