Considerando o código a seguir, responda:(0,25 pontos)
#include <p18f4550.h>
// CONFIGURATION
#pragma config FOSC=HS
//TASKS PROTOTYPES
void vTASKO(void);
void vTASK1(void);
void vTASK2(void);
void main( void ){
//Configurações da serial
TXSTAbits.BRGH=1;
xTaskCreate(vTASK0,(const charconst)“T0”, configMINIMAL_STACK_SIZE, NULL,(tskIDLE_PRIORITY+1), NULL);
xTaskCreate(vTASK1,(const char
const)“T1”, configMINIMAL_STACK_SIZE, NULL,(tskIDLE_PRIORITY+1), NULL);
xTaskCreate(vTASK2,(const char*const)“T2”, configMINIMAL_STACK_SIZE, NULL,(tskIDLE_PRIORITY+2), NULL);
vTaskStartScheduler();
}
void vTASK0(void){
while(1){
while (TXSTAbits.TRMT0) {}
TXREG=‘0’;
while (TXSTAbits.TRMT
0) {}
TXREG=0x0D;
while (TXSTAbits.TRMT0) {}
TXREG=0x0A;
}}
void vTASK1(void){
while(1){
while (TXSTAbits.TRMT
0) {}
TXREG=‘1’;
while (TXSTAbits.TRMT0) {}
TXREG=0x0D;
while (TXSTAbits.TRMT
0) {}
TXREG=0x0A;
}}
void vTASK2(void){
while(1){
while (TXSTAbits.TRMT0) {}
TXREG=‘2’;
while (TXSTAbits.TRMT
0) {}
TXREG=0x0D;
while (TXSTAbits.TRMT==0) {}
TXREG=0x0A;
vTaskDelay(10/portTICK_RATE_MS);
}}


Ocorre Starvation com uma ou mais tasks? Se sim, explique detalhadamente.

Passo 1

O enunciado nos dá três tarefas FreeRTOS em um PIC 18F 4550:
\bullet vTASK 0 e vTASK 1 têm prioridade \(tskIDLE_PRIORITY +1\).
\bullet vTASK 2 tem prioridade \(tskIDLE_PRIORITY +2\) e faz um vTaskDelay(\(10\)/\(portTICK_RATE_MS\)) a cada iteração.
Todas as tasks fazem busy-wait no bit TXSTAbits.TRMT antes de escrever em TXREG. Queremos ver se alguma task fica permanentemente sem rodar (starvation).

Passo 2

Definição de starvation em escalonamento preemptivo: uma tarefa de prioridade menor nunca chega a executar porque tarefas de prioridade igual ou superior monopolizam a CPU sem jamais liberar voluntariamente.

Passo 3

Analisando vTASK 2 (prioridade mais alta):
-- Ela é preemptiva sobre vTASK 0/vTASK 1 sempre que sair de vTaskDelay.
-- Após imprimir \text{‘}2\text{’}+C R+LF, faz vTaskDelay( 10/ \text{portTICK\_RATE\_MS}), ficando bloqueada \sim 10 ms.
Logo, vTASK 2 não impede que as de menor prioridade rodem durante seus 10 ms de bloqueio. Não há starvation de vTASK 0 nem vTASK 1 por vTASK 2.

Passo 4

Analisando vTASK 0 e vTASK 1 (mesma prioridade):
– Nenhuma chama vTaskDelay, vTaskYIELD ou qualquer API de bloqueio FreeRTOS; apenas busy-wait em TXSTAbits.TRMT, que não é blocking do RTOS, e imediatamente volta a rodar.
– Com time slicing habilitado (\(configUSE_TIME_SLICING =1\), default do FreeRTOS), o kernel faz context switch entre tasks de mesma prioridade a cada tick, e vTASK 0 e vTASK 1 se alternam, sem starvation nenhuma.
– Se time slicing estiver desabilitado (\(configUSE_TIME_SLICING =0\)), tarefas de mesma prioridade só cedem CPU se bloquearem voluntariamente. Como nenhuma o faz, a primeira criada (vTASK 0) roda infinitamente, e vTASK 1 fica permanentemente pronta mas sem CPU \to starvation de vTASK 1.

Passo 5

Conclusão:
\bullet vTASK 2 não é starvation nem é starved, pois faz vTaskDelay.
\bullet vTASK 0 e vTASK 1 compartilham CPU via time slicing se este estiver habilitado (sem starvation).
\bullet Se o projeto desabilitar time slicing, vTASK 0 monopoliza e vTASK 1 sofre starvation.

Resposta

Sim. vTASK 1 só fica starved se o projeto tiver \texttt{configUSE\_TIME\_SLICING = 0}, pois vTASK 0 e vTASK 1 têm mesma prioridade e nenhuma faz bloqueio do kernel, então a primeira criada monopoliza a CPU e impede vTASK 1 de executar. Se o time slicing estiver habilitado (config =1), não há starvation.

Exercícios relacionados