====== Tarefas dormindo ======
Este projeto faz parte do [[PPOS-v2:start|PPOS v2]].
O objetivo deste projeto é criar uma função ''task_sleep'', que faz com que **a tarefa atual** fique suspensa durante o intervalo indicado (tempo em **milissegundos**), sem perturbar a execução das demais tarefas:
void task_sleep(int t)
Para implementar essa funcionalidade é necessário:
* Criar uma fila de "tarefas adormecidas", separada da fila de tarefas prontas;
* Escrever a função ''task_sleep'', que calcula o instante em que a tarefa atual deverá ser acordada e a suspende na fila de tarefas adormecidas, usando ''task_suspend'';
* Periodicamente, o //dispatcher// deve percorrer a fila de tarefas adormecidas e reativar as tarefas que já podem acordar, usando ''task_awake''.
* Use o controle de preempção para evitar condições de disputa na manipulação da fila de tarefas adormecidas.
Um erro muito frequente neste projeto é colocar a verificação da fila de tarefas adormecidas dentro do tratador de //ticks// de relógio. **Não faça isso**, pois esse tratador representa uma ISR - //Interrupt Service Routine//, que deve ser pequena e muito rápida. Implemente essa verificação como uma função ativada periodicamente pelo **despachante**.
===== Arquivos =====
Os seguintes arquivos são relevantes para este projeto:
* ''kernel/dispatcher.c''
* ''kernel/tcb.h''
* ''test/pingpong-sleep.c'': programa de teste
* ''test/pingpong-sleep.txt'': saída esperada do teste
Na saída, observe que o campo "''t=xxx''" no início de cada linha indica o instante "atual", em milissegundos; verifique se os períodos de "sono" de cada tarefa estão coerentes com os valores de tempo indicados nas linhas da saída.
===== Outras informações =====
* Duração estimada: 6 horas.
* Dependências:
* [[Tarefas cooperativas]]
* [[Despachante de tarefas]]
* [[Preempção por tempo]]
* [[Tarefas que esperam]]