Академический Документы
Профессиональный Документы
Культура Документы
2
MEEC – SISTR
2017/2018
O que vamos fazer?
3
MEEC – SISTR
2017/2018
Um Sistema Operativo?
● Um sistema operativo
no Cortex-M3?
● Não é um sistema
operativo convencional;
● Usaremos um sistema
operativo de tempo real
desenvolvido
especificamente para
aplicações embebidas,
neste caso para o
Cortex-M3.
4
MEEC – SISTR
2017/2018
Sistema Operativo
● Num sistema operativo (SO) clássico tal como o Linux, Windows, Mac, etc:
● O sistema operativo é instalado primeiro e de seguida são instaladas as aplicações
separadamente;
● O SO inicia e só depois as aplicações são iniciadas;
● O computador é completamente controlado pelo SO, o kernel não pode se parado;
● Neste caso as aplicações não podem bloquear o SO (ou pelo menos não deviam).
5
MEEC – SISTR
2017/2018
Sistema Operativo de Tempo Real
6
MEEC – SISTR
2017/2018
Arquitetura típica de um RTOS
application
User
RTOS
Hardware
CPU Peripherals
7
MEEC – SISTR
2017/2018
Características típicas num RTOS
8
MEEC – SISTR
2017/2018
Exemplos e aplicações
● Áreas de aplicação:
– Robótica (Ex: Mars Pathfinder);
– Telecomunicações (Ex: routers)
– Equipamento médico (Ex: pacemaker);
– Aviónica (Ex: Sistemas de navegação);
– Automóvel (Ex: Injeção de combustível);
– ...
9
MEEC – SISTR
2017/2018
Porquê o FreeRTOS?
● Principais características:
– Várias arquiteturas suportadas (ARM, AVR, PIC, 8051, MSP430, Renesas, etc.);
– Funciona em microcontroladores com poucos recursos (tais como microcontroladores
de 8 bits com 8 KiB de memória ou menos em alguns casos);
– Suportadas várias ferramentas de desenvolvimento (incluindo o GCC);
– Projetos configurados para cada microcontrolador/ambiente de desenvolvimento;
– Open source (licença GPL modificada), podendo ser usado em aplicações comerciais;
– Grande comunidade de utilizadores (não há suporte técnico – apenas na versão
comercial).
10
MEEC – SISTR
2017/2018
Versões de software usadas
11
MEEC – SISTR
2017/2018
FreeRTOS
12
MEEC – SISTR
2017/2018
Caso de estudo
13
MEEC – SISTR
2017/2018
Introdução ao FreeRTOS
14
MEEC – SISTR
2017/2018
Estrutura ficheiros do FreeRTOS
FreeRTOS
Licens
Ficheiros usados e
por
Common todos os exemplos Include Ficheiros .h
Alocadores de
Demo_port 2 Lista de todos os
exemplos disponíveis
MemMang memória
... tasks.c
17
MEEC – SISTR
2017/2018
Nomes das macros FreeRTOS
18
MEEC – SISTR
2017/2018
Tipos de dados usados
19
MEEC – SISTR
2017/2018
Partes importantes no FreeRTOS
● Tarefa
– Rotina que isoladamente desempenha uma função qualquer (p.e. ler dados de
um sensor);
● Prioridade
– Nível de importância de uma dada tarefa face às outras;
● Escalonador (ou kernel)
– Algoritmo que gere as tarefas que vão correr mediante a sua prioridade;
● Tarefa Idle
– Tarefa criada aquando do arranque do escalonador;
– Tarefa executada sempre que não há mais nada para fazer;
– Tem a prioridade mais baixa.
● Tick counter
– Contador de ticks que é incrementado a uma cadência fixa;
– Contém o número de ticks que passaram desde que o escalonador foi iniciado;
– Cada tick corresponde a uma base de tempo conhecida.
20
MEEC – SISTR
2017/2018
Criação de uma aplicação
● main.c
– Criação das tarefas, arranque do escalonador, etc…
● FreeRTOSConfig.h
22
MEEC – SISTR
2017/2018
Configuração do FreeRTOS (II)
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) – Especificado em words.
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) ) – RAM disponível para o kernel do RTOS.
#define configMAX_TASK_NAME_LEN ( 16 ) – Tamanho máximo do nome atribuído a cada tarefa.
#define configUSE_16_BIT_TICKS 0 – Usar (1) ou não (0) 16 bit no registo que conta o número de ticks
que passaram desde que o kernel foi iniciado.
#define configIDLE_SHOULD_YIELD 1 – Quando as tarefas tem a mesma prioridade que a tarefa de idle,
se o CPU é ou não dividido por todas duas de igual forma(1), ou se as tarefas com a mesma prioridade de idle
têm mais tempo de CPU disponível (0);
#define configUSE_MUTEXES 1 – Ativar (1) ou não (0) a funcionalidade mutex.
● Nota: Existem outras configuração possíveis que serão consideradas à medida que vão sendo necessárias.
23
MEEC – SISTR
2017/2018
LED pisca – função main
Criar as
/* Create the tasks */
tarefas
xTaskCreate( prvFlashTask1, "Flash1", configMINIMAL_STACK_SIZE,
NULL, 1, &HandleTask1);
Iniciar o
/* Start the scheduler. */
Escalonador
vTaskStartScheduler();
/* Will only get here if there was not enough heap space to create the idle
task. */
Fim
return 0;
}
24
MEEC – SISTR
2017/2018
LED pisca – hardware setup
static void prvSetupRCC( void )
{
/* RCC configuration - 72 MHz */
...
}
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
25
MEEC – SISTR
2017/2018
LED pisca – Tarefa
static void prvFlashTask1( void *pvParameters )
{
for( ;; ) Início
{
/* Block 1 second. */
VTaskDelay( ( TickType_t ) 1000 / portTICK_RATE_MS ); Bloqueia
1 segudo
}
}
26
MEEC – SISTR
2017/2018
Criação de tarefas
● BaseType_t xTaskCreate( pdTASK_CODE pvTaskCode, const char * const
pcName, unsigned short usStackDepth, void *pvParameters, UBaseType_t
uxPriority, xTaskHandle *pvCreatedTask );
● Retorna:
– pdPass no caso de sucesso na criação da tarefa
– errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY no caso de não criar a tarefa.
● Exemplo:
#include “task.h”
TaskHandle_t xHandle;
BaseType_t xReturn;
27
MEEC – SISTR
2017/2018
Task Control Block (TCB)
28
MEEC – SISTR
2017/2018
Implementação de uma tarefa
{
/* Initialization code goes here. */
Inicializações
for( ;; )
{
/* Task application code goes here. */ Executar a
tarefa
}
/* Tasks must be an infinite loop it should
never get here. */
}
29
MEEC – SISTR
2017/2018
Suspensão de uma tarefa
30
MEEC – SISTR
2017/2018
Controlo de ciclo de uma tarefa
31
MEEC – SISTR
2017/2018
Controlo de ciclo - vTaskDelay
● A função vTaskDelay permite fazer um delay numa tarefa por um determinado
tempo (em ticks):
– void vTaskDelay( TickType_t xTicksToDelay );
● xTicksToDelay é o número de ticks que se pretende esperar
● portTICK_RATE_MS pode ser usado para transformar tempo num número de ticks:
– const TickType_t xTicksToDelay = 1000 / portTICK_RATE_MS;
● A variável xTicksToDelay terá o número de ticks equivalente a 1000 ms.
● Exemplo:
for( ;; )
{
/* the function will block here for 1000 ms. */
vTaskDelay( 1000 / portTICK_RATE_MS);
/* do some stuff here every 1000 ms. */
/* … */
}
32
MEEC – SISTR
2017/2018
Problemas vTaskDelay (I)
T1 T1
t t1 t2 Time
T1 T1
t t1 t2 Time
1000 ms 1000 ms
– void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, TickType_t
xTimeIncrement )
● pxPreviousWakeTime contém o valor do tempo em que a função desbloqueou a última vez;
● xTimeIncrement contém o valor do período de quando a função deverá desbloquear novamente.
34
MEEC – SISTR
2017/2018
Exemplo vTaskDelayUntil
for( ;; )
{
/* The function will block here for 1000 ms. */
vTaskDelayUntil( &xLastExecutionTime, 1000 / portTICK_RATE_MS);
35
MEEC – SISTR
2017/2018
Escalonador do FreeRTOS
36
MEEC – SISTR
2017/2018
Escalonamento das tarefas (I)
37
MEEC – SISTR
2017/2018
Escalonamento das tarefas (II)
Task 3
execution
Task 2
execution
Task 1
execution
t1 t2 time tn
38
MEEC – SISTR
2017/2018
Escalonador do FreeRTOS
40
MEEC – SISTR
2017/2018
Mudança de contexto
42
MEEC – SISTR
2017/2018
Systick no FreeRTOS
/* Setup the systick timer to generate the tick interrupts at the required
frequency. */
__attribute__(( weak )) void vPortSetupTimerInterrupt( void )
{ Escalonador
...
/* Configure SysTick to interrupt at the requested rate. */
Configurar
portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
Interrupção
Systick
/* Enable SysTick interrupt*/
portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT |
Ativar
portNVIC_SYSTICK_INT_BIT | Interrupção
portNVIC_SYSTICK_ENABLE_BIT; Systick
}
43
MEEC – SISTR
2017/2018
Rotina de interrupção do SysTick
44
MEEC – SISTR
2017/2018
Systick handler no FreeRTOS
void xPortSysTickHandler( void )
{
Systick
/* The SysTick runs at the lowest interrupt priority, so when this Handler
interrupt executes all interrupts must be unmasked. There is
therefore no need to save and then restore the interrupt mask
value as its value is already known. */ Incrementar
tick counter
( void ) portSET_INTERRUPT_MASK_FROM_ISR();
{
/* Increment the RTOS tick. */
if( xTaskIncrementTick() != pdFALSE ) Ativar
Mudança S
{ de Interrupção
/* A context switch is required. Context switching is contexto? PendSV
performed in the PendSV interrupt. Pend the PendSV interrupt. */
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; N
}
}
portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); Fim
}
45
MEEC – SISTR
2017/2018
Mudança de contexto no PendSV
47
MEEC – SISTR
2017/2018
Estados de uma tarefa
48
MEEC – SISTR
2017/2018
Prioridade de uma tarefa
49
MEEC – SISTR
2017/2018
Alteração da prioridades
50
MEEC – SISTR
2017/2018
Escalonador preemptivo
Task 3
execution
Task 2
execution
Task 1
execution
t1 t2 t3 t4 t5 t6 t7 time
– Em t1 a tarefa 1 iniciou;
– Em t2 a tarefa 2 está pronta a correr por isso a tarefa 1 foi suspensa e tarefa 2 iniciou;
– Em t3 a tarefa 2 terminou a sua execução e a tarefa 1 retomou a sua execução;
– Em t4 a tarefa 1 terminou e a tarefa 3 iniciou;
– Em t5 a tarefa 2 está pronta por isso a tarefa 3 foi suspensa;
– Em t6 a tarefa 2 terminou a sua execução e a tarefa 3 retomou a sua execução.
51
MEEC – SISTR
2017/2018
Escalonador não preemptivo
Task 3
execution
Task 2
execution
Task 1
execution
t1 t2 t3 t4 t5 t6 t7 time
● O FreeRTOS pode ser configurado para ser preemptivo ou não no
ficheiro FreeRTOSConfig.h (configUSE_PREEMPTION).
52
MEEC – SISTR
2017/2018
Starvation de uma tarefa
53
MEEC – SISTR
2017/2018
Funções relativas ao escalonador
54
MEEC – SISTR
2017/2018
Outras funções
55
MEEC – SISTR
2017/2018
Macros
● taskENTER_CRITICAL
– Permite definir o início de uma zona de código onde não podem
existir mudanças de contexto.
● taskEXIT_CRITICAL
– Marca o fim da zona de código onde não podem ocorrer
mudanças de contexto.
● taskDISABLE_INTERRUPTS
– Desativa todas as interrupções.
● taskENABLE_INTERRUPTS
– Ativa todas as interrupções.
56
MEEC – SISTR
2017/2018
Tick hook
57
MEEC – SISTR
2017/2018
Idle hook
58
MEEC – SISTR
2017/2018
FreeRTOS API
59
MEEC – SISTR
2017/2018
Referências
60
MEEC – SISTR
2017/2018