Você está na página 1de 61

MEEC – Mestrado em Engenharia

Eletrónica e de Computadores
1º Ano – 1º Semestre – Ano Letivo 2013/2014

Sistemas Embebidos
e de Tempo-Real
Prof. Nuno Peixoto
(npeixoto@ipca.pt)

Desenvolvimento de Software
para Sistemas Embebidos
S. E. Tempo-Real
Sumário

Introdução
Ambientes de Desenvolvimento (IDEs)
Fluxo de Desenvolvimento de Software
Estruturas de Software
Tipos de dados em C
I/Os e Acesso aos Periféricos
Hardware Abstraction Layer (HAL) – Cortex
Microcontroller Software Interface Standard
(CMSIS)
Primeiro Projeto com CMSIS-Core no MDK-ARM
Biblioteca CMSIS-DSP
MEEC Prof. Nuno Peixoto 2
S. E. Tempo-Real
Introdução

No contexto do desenvolvimento de software


para sistemas embebidos será utilizado como
exemplo o processador ARM Cortex-M4F

MEEC Prof. Nuno Peixoto 3


S. E. Tempo-Real
Introdução

O processador ocupa cerca de 10% da área de


silício do microcontrolador
O microcontrolador possui, para além do
processador, uma série de periféricos tais como:
 Memória de código (flash)
 Memória de dados (SRAM)
 Barramentos internos
 Geradores de sinal de relógio (PLLs)
 Reguladores de tensão e de controlo de energia
 IOs, ADCs, DACs, timers, interfaces de
comunicação, circuitos de teste e debug, etc.
MEEC Prof. Nuno Peixoto 4
S. E. Tempo-Real
Introdução

Exemplo do microcontrolador STM32F407VGT6

Clicar aqui

MEEC Prof. Nuno Peixoto 5


S. E. Tempo-Real
Introdução

Em relação ao processador, os aspetos mais


importantes estão relacionados com
 Modo de execução do código
• Privilegiado
• Não-privilegiado
 Exceções e interrupções
 Mapa de memória
 Gestão de energia
Todos os acessos são efetuados através da
escrita e leitura em registos cujos endereços
estão presentes no mapa de memória
MEEC Prof. Nuno Peixoto 6
S. E. Tempo-Real
Introdução

Cada fabricante coloca no microcontrolador os


seus próprios periféricos juntamente com o
processador
 Os periféricos são configurados por intermédio
de escrita nos registos correspondentes, os
quais estão descritos no modelo de memória
apresentado no datasheet do fabricante
 A maioria dos fabricantes de microcontroladores
oferece um conjunto de ficheiros cabeçalho
(ficheiros *.h) e bibliotecas com funções de nome
intuitivo para escrever nos registos corretos de
cada periférico – device drivers
MEEC Prof. Nuno Peixoto 7
S. E. Tempo-Real
Ambientes de Desenvolvimento (IDEs)

Existem vários ambientes integrados de


desenvolvimento, alguns deles livres
 Keil Microcontroller Development Kit (MDK-ARM)
 ARM DS-5 (Development Studio 5)
 IAR Systems (Embedded Workbench for ARM
Cortex-M)
 Red Suite from Code Red Technologies
(acquired by NXP in 2013)
 Mentor Graphics Sourcery CodeBench (formerly
CodeSourcery Sourcery gþþ)
 mbed.org
MEEC Prof. Nuno Peixoto 8
S. E. Tempo-Real
Ambientes de Desenvolvimento (IDEs)

Existem vários ambientes integrados de


desenvolvimento, alguns deles livres
 Altium Tasking VX-toolset for ARM Cortex-M
 Rowley Associates (CrossWorks)
 Coocox
 Texas Instruments Code Composer Studio (CCS)
 Raisonance RIDE
 Atollic TrueStudio
 GNU Compiler Collection (GCC)
 mikroElektronika mikroC
 Arduino
MEEC Prof. Nuno Peixoto 9
S. E. Tempo-Real
Ambientes de Desenvolvimento (IDEs)

Existem ainda kits de desenvolvimento para


testar as capacidades do microcontrolador
 Um desses exemplos é o kit de desenvolvimento
STM32F4DISCOVERY
Adaptador de
Microcontrolador debug: STLink

MEEC Prof. Nuno Peixoto 10


S. E. Tempo-Real
Ambientes de Desenvolvimento (IDEs)

Ao longo desta apresentação serão utilizados


como exemplo:
 Ambiente de desenvolvimento:
• Keil Microcontroller Development Kit (MDK-ARM)
 Kit de desenvolvimento:
• STM32F4DISCOVERY
– Contém o microcontrolador STM32F407VGT6
» Contém o processador ARM Cortex-M4F

MEEC Prof. Nuno Peixoto 11


S. E. Tempo-Real
Fluxo de Desenvolvimento de Software

O fluxo de desenvolvimento com um ambiente


integrado de desenvolvimento (IDE) envolve
 Criação de um projeto
• Localização do código fonte
• Sistema alvo do código compilado (target)
• Opções de compilação
• Configurações de memória
• Muitos IDEs têm um assistente parta esta tarefa

MEEC Prof. Nuno Peixoto 12


S. E. Tempo-Real
Fluxo de Desenvolvimento de Software

O fluxo de desenvolvimento com um ambiente


integrado de desenvolvimento (IDE) envolve
 Adição de ficheiros ao projeto
• Código fonte
• Caminhos para ficheiros cabeçalho
• Caminhos para ficheiros de bibliotecas
• Ficheiros cabeçalho e bibliotecas de software
• Ficheiros da camada de abstração ao hardware
disponibilizados pelos fabricantes
– Código de inicialização
– Device drivers
– Sistema Operativo Tempo-Real (RTOS)
MEEC Prof. Nuno Peixoto 13
S. E. Tempo-Real
Fluxo de Desenvolvimento de Software

O fluxo de desenvolvimento com um ambiente


integrado de desenvolvimento (IDE) envolve
 Configurar as opções do projeto
• Otimizações do compilador
• Mapeamento da memória
• Ficheiros de output com a imagem binária
• Opções relacionadas com o download do código
para a memória flash do microcontrolador
• Opções relacionadas com o debug

MEEC Prof. Nuno Peixoto 14


S. E. Tempo-Real
Fluxo de Desenvolvimento de Software

O fluxo de desenvolvimento com um ambiente


integrado de desenvolvimento (IDE) envolve
 Compilar e “linkar” o código fonte
• Compila cada ficheiro de código fonte e
transforma-o em código objeto
• Liga os vários ficheiros objeto de modo a criar
uma imagem binária da aplicação no formato
requerido pela ferramenta de download do código
para a memória flash do microcontrolador

MEEC Prof. Nuno Peixoto 15


S. E. Tempo-Real
Fluxo de Desenvolvimento de Software

O fluxo de desenvolvimento com um ambiente


integrado de desenvolvimento (IDE) envolve
 Programação da memória flash
• Aqui é necessário um adaptador de debug como o
STLink, no caso do kit utilizado como exemplo
 Executar o programa em modo debug
• Aqui o IDE assume um papel fundamental, pois,
em função das suas ferramentas poderá permitir
analisar completamente o estado do processador
e da aplicação
• Pode permitir mesmo parar o processador (halt)
com os chamados break points
MEEC Prof. Nuno Peixoto 16
S. E. Tempo-Real
Fluxo de Desenvolvimento de Software

No caso da STM32F4DISCOVERY tem-se o STLink


MEEC Prof. Nuno Peixoto 17
S. E. Tempo-Real
Fluxo de Desenvolvimento de Software

Compilação do código fonte

Normalmente é
o código de
startup
fornecido pelo
fabricante do
MCU

MEEC Prof. Nuno Peixoto 18


S. E. Tempo-Real
Fluxo de Desenvolvimento de Software

Compilação do código fonte com GNU GCC

MEEC Prof. Nuno Peixoto 19


S. E. Tempo-Real
Fluxo de Desenvolvimento de Software

Ferramentas que se podem encontrar no IDE


 Compilador de C
 Linker
 Assembler
 Programador da memória flash
 Debugger
 Simulador
 Outras ferramentas
• Conversão de formatos binários, por exemplo

MEEC Prof. Nuno Peixoto 20


S. E. Tempo-Real
Estrutura de Software

Existem várias formas de se construir o fluxo do


programa para uma aplicação
 Polling
 Dirigido à interrupção (Interrupt-driven)
 Dirigido à interrupção com Polling
 Multitarefa (Multi-tasking)

MEEC Prof. Nuno Peixoto 21


S. E. Tempo-Real
Estrutura de Software

Polling
 Apenas para aplicações muito simples
 O processador espera até que os dados estejam
prontos para processar e processa-os voltando a
esperar
 Pode ser expandido para suportar vários
processos através daquilo a que se chama de
um super-loop
• Testa flags e executa o processo se estiverem
ativas

MEEC Prof. Nuno Peixoto 22


S. E. Tempo-Real
Estrutura de Software

Polling
 Desvantagens
• Quando as aplicações são mais complexas esta
técnica apresenta problemas severos de resposta
– Não consegue gerir prioridades
– Pode ter tempos de respostas demasiado lentos para
determinados periféricos
• Torna-se extremamente difícil manter o código
quando necessita de lidar com diversos periféricos
• Há um desperdício de energia imenso, já que o
processador está sempre a executar instruções
para, pelo menos, testar as flags

MEEC Prof. Nuno Peixoto 23


S. E. Tempo-Real
Estrutura de Software

Polling

MEEC Prof. Nuno Peixoto 24


S. E. Tempo-Real
Estrutura de Software

Polling num super-loop

MEEC Prof. Nuno Peixoto 25


S. E. Tempo-Real
Estrutura de Software

Dirigido à interrupção (Interrupt-driven)


 O processador só executa o código quando o
periférico o sinalizar
• Durante o restante tempo o processador pode ser
colocado num estado de poupança de energia
(sleep mode)
 Pode-se definir diferentes prioridades, em função
do tipo de dispositivo periférico
• Os tempos de resposta a um periférico crítico é
menor quando comparado com o polling

MEEC Prof. Nuno Peixoto 26


S. E. Tempo-Real
Estrutura de Software

Dirigido à interrupção

MEEC Prof. Nuno Peixoto 27


S. E. Tempo-Real
Estrutura de Software

Dirigido à interrupção com Polling


 O serviço ao dispositivo periférico é efetuado em
duas fases
• Na primeira fase é servida a interrupção e
atualizada uma flag
• O processador sai do modo de sleep e executa o
restante código no ciclo principal ficando outra vez
no modo sleep no final da execução
 Este tipo de técnica permite responder
rapidamente aos periféricos e ao mesmo tempo
poupar nos gastos de energia

MEEC Prof. Nuno Peixoto 28


S. E. Tempo-Real
Estrutura de Software

Dirigido à interrupção com Polling

MEEC Prof. Nuno Peixoto 29


S. E. Tempo-Real
Estrutura de Software

Multitarefa
 Quando as aplicações são mais complexas uma
estrutura de programa, mesmo com interrupções,
não é capaz de gerir os requisitos de
processamento
• Isto porque certas tarefas podem demorar muito
tempo a ser concluídas
• A única forma é executá-las de forma concorrente,
escalonando-as ao longo do tempo
• Pode-se implementar essa estrutura manualmente,
mas a complexidade é elevadíssima
• Solução: RTOS
MEEC Prof. Nuno Peixoto 30
S. E. Tempo-Real
Estrutura de Software

Multitarefa
 O RTOS é utilizado para escalonar as diferentes
tarefas, que são no fundo funções
 O RTOS proporciona mecanismos de
sincronização
• Semáforos
• Mutexes
 O RTOS proporciona mecanismos de
comunicação
 Um timer proporciona a chamada do escalonador
de tarefas que permite escolher a tarefa a executar
MEEC Prof. Nuno Peixoto 31
S. E. Tempo-Real
Estrutura de Software

Multitarefa

MEEC Prof. Nuno Peixoto 32


S. E. Tempo-Real
Tipos de dados em C

A linguagem de programação C suporta vários


tipos de dados standard
 No entanto, a forma como um dado é
representado irá depender muito da arquitetura
do processador e do compilador utilizado
 Em diferentes arquiteturas de computador um
inteiro poderá ser de 8, 16 ou 32 bits
• Na arquitetura ARM é de 32 bits
• Na arquitetura ARM existem várias referências
aos tamanhos dos dados tais como BYTE, HALF
WORD, WORD e DOUBLE WORD
• Este tipo de designação vem do assembly
MEEC Prof. Nuno Peixoto 33
S. E. Tempo-Real
Tipos de dados em C

Tipos de dados na arquitetura ARM

MEEC Prof. Nuno Peixoto 34


S. E. Tempo-Real
I/Os e Acesso aos Periféricos

A maioria dos dispositivos periféricos


encontrados no MCU são específicos do
fabricante
Para aceder a esses dispositivos torna-se
necessário consultar o datasheet do fabricante
para entender como lidar com os mesmos
Os periféricos estão mapeados na memória
pelo que os seus registos estão acessíveis
através da mesma
Pode-se assim usar apontadores para aceder
aos registos dos dispositivos periféricos
MEEC Prof. Nuno Peixoto 35
S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Tipicamente, antes de se aceder a um


determinado dispositivo periférico é necessário
um processo de inicialização
O conjunto de passos correspondentes a este
processo de inicialização poderão ser os
seguintes
 Programar o circuito de relógio
 Configurar o modo de operação
• Aqui inclui-se a multiplexagem, por exemplo, e
características elétricas tais como tipo de saída
em coletor aberto ou resistências de pull-up
MEEC Prof. Nuno Peixoto 36
S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Conjunto de passos correspondentes ao


processo de inicialização de um dispositivo
periférico (continuação)
 Configurar o dispositivo periférico
• Configurar uma série de registos que nos
microcontroladores de 32 bits é substancialmente
maior quando comparado com MCUs de 8 ou 16
bits
• Pode sempre utilizar-se o código dos drivers
disponibilizado pelo fabricante
 Configurar as interrupções
• Configurar os registos do módulo NVIC
MEEC Prof. Nuno Peixoto 37
S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Exemplo de configuração das GPIOs do MCU


STM32F407VGT6
 De acordo com o manual tem-se por cada I/O
vários registos de 32 bits
• 4 registos de configuração
– GPIOx_MODER, GPIOx_OTYPER, GPIOxOSPEEDR,
GPIOx_PUPDR
• 2 registos de dados
– GPIOx_IDR, GPIOx_ODR
• Um registo set/reset
– GPIOx_BSRR

MEEC Prof. Nuno Peixoto 38


S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Exemplo de configuração das GPIOs do MCU


STM32F407VGT6
 De acordo com o manual tem-se por cada I/O
vários registos de 32 bits (continuação)
• Um registo de locking
– GPIOx_LCKR
• 2 registos de funções alternativas
– GPIOx_AFRH
– GPIOx_AFRL

MEEC Prof. Nuno Peixoto 39


S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Estrutura básica de uma GPIO

MEEC Prof. Nuno Peixoto 40


S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Exemplo da configuração do pino PD12, que


liga ao LED verde do kit de desenvolvimento
 Configuração
• Configurar o registo GPIOD_MODER nas
posições 25 e 24 com [01] – saída
#define GPIOD_MODER (*((volatile unsigned long *) (0x40020C00)))
GPIOD_MODER &= ~(1 << 25);
GPIOD_MODER |= 1 << 24;

MEEC Prof. Nuno Peixoto 41


S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Exemplo da configuração do pino PD12, que


liga ao LED verde do kit de desenvolvimento
 Configuração
• Configurar o registo GPIOD_PUPDR nas posições
25 e 24 com [00] – push-pull (PP)
#define GPIOD_PUPDR (*((volatile unsigned long *) (0x40020C0C)))

GPIOD_PUPDR &= ~(3 << 24);

MEEC Prof. Nuno Peixoto 42


S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Como se pode ver a configuração (não


completada) é baseada em operações de AND
e OR com máscaras de 32 bits para escrever
por apontador nas posições de memória onde
residem os registos do periférico
 Esta abordagem, apesar de correta, é
extremamente difícil e muito propícia a erro, no
entanto, é a abordagem comum, em qualquer
MCU
• Para efetuar estas operações de forma mais
simples vai-se utilizar os drivers disponibilizados
pelo fabricante
MEEC Prof. Nuno Peixoto 43
S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Os drivers dos fabricantes não passam de


estruturas de dados que englobam todos os
registos de um determinado periférico do MCU
e um conjunto de funções que permitem alterar
essas estruturas de dados
 Os endereços são definidos através de
constantes baseadas na diretiva #define
 As alterações são efetuadas por apontador para
um estrutura de dados cujas variáveis são na
verdade os offsets dos registos

MEEC Prof. Nuno Peixoto 44


S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Exemplo para as GPIOs do porto D


#define PERIPH_BASE ((uint32_t) 0x40000000)
#define AHB1_PERIPH_BASE (PERIPH_BASE + 0x20000)
#define GPIOD_BASE (AHB1_PERIPH_BASE + 0x0C00)
#define GPIOD ((GPIO_Typedef *) GPIOD_BASE)

void GPIO_reset(GPIO_Typedef* GPIOx)


{
GPIOx->MODER = 0;
(...)
}

Chamar no código a função seria simplesmente


GPIO_reset(GPIOD);

MEEC Prof. Nuno Peixoto 45


S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Exemplo para as GPIOs do porto D


(continuação)
typedef struct
{
volatile uint32_t MODER // 0x00
volatile uint32_t OTYPER; // 0x04
volatile uint32_t OSPEEDER; // 0x08
volatile uint32_t PUPDR; // 0x0C
volatile uint32_t IDR; // 0x10
volatile uint32_t ODR; // 0x14
volatile uint32_t BSRR; // 0x18
volatile uint32_t LCKR; // 0x1C
volatile uint32_t AFRL; // 0x20
volatile uint32_t AFRH; // 0x24
} GPIOD_Typedef;

MEEC Prof. Nuno Peixoto 46


S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Existem vários periféricos num MCU, mas


normalmente não são tão ricos como o GUI
presente num Desktop
Por este motivo as operações de debug são
bem mais complexas!
Para efetuar operações de debug podem ser
utilizados LCDs, LEDs, botões, a porta série
Melhor ainda será utilizar o Instrumentation
Trace Macrocell (ITM) que comunica com o
software de debug e permite ler registos, a
memória, bem como parar a execução
MEEC Prof. Nuno Peixoto 47
S. E. Tempo-Real
I/Os e Acesso aos Periféricos

Utilização da UART para comunicar com o PC


via USB

MEEC Prof. Nuno Peixoto 48


S. E. Tempo-Real
CMSIS

Introdução ao CMSIS
 Foi desenvolvido pela ARM para proporcionar
aos fabricantes de microcontroladores e de
software uma infraestrutura de software
consistente para o desenvolvimento de soluções
para a família de processadores Cortex-M
• Mais de 15 fabricantes de MCUs
– Alguns providenciam FPGAs e ASICs
• Mais de 10 toolchains disponíveis
• Mais de 30 sistemas operativos!
• Bibliotecas adicionais para stack TCP/IP, codecs,
USB, etc.
MEEC Prof. Nuno Peixoto 49
S. E. Tempo-Real
CMSIS

Introdução ao CMSIS
 É uma camada de abstração do hardware (HAL
– Hardware Abstraction Layer)
 Permite efetuar o interface ao processador e aos
periféricos de forma simples e reutilizável,
mesmo para diferentes processadores Cortex-M
• Extremamente útil pois permite reduzir o tempo de
aprendizagem no que diz respeito à programação
do microcontrolador
 É um standard que terceiros utilizam para efetuar
o interface entre o seu middleware e o
processador
MEEC Prof. Nuno Peixoto 50
S. E. Tempo-Real
CMSIS

Objetivos
 Aumentar a reutilização de software
 Aumentar a compatibilidade do software
 Facilidade na aprendizagem
 Independência da toolchain
 Código aberto

MEEC Prof. Nuno Peixoto 51


S. E. Tempo-Real
CMSIS

Composição do CMSIS
 CMSIS-Core
• Conjunto de APIs para acesso ao processador
Cortex-M
– Utilizada para desenvolver aplicações ou middleware
 CMSIS-DSP
• Permite criar aplicações que necessitam de
operações do DSP, tais como filtros e FFT
 CMSIS-SVD (System View Description)
• Ficheiro XML com descrição dos periféricos do
MCU
– Ótimo para os fabricantes de MCUs
MEEC Prof. Nuno Peixoto 52
S. E. Tempo-Real
CMSIS

Composição do CMSIS (continuação)


 CMSIS-RTOS
• Especifica uma API para sistemas operativos
embebidos para os MCUs Cortex-M
 CMSIS-DAP (Debug Access Port)
• É uma referência para adaptadores de debug
• Suporta USB e JTAG, bem como protocolos série
para efetuar operações de debug

MEEC Prof. Nuno Peixoto 53


S. E. Tempo-Real
CMSIS

CMSIS-Core
 Inclui definições standard para acesso aos
periféricos do processador
 Inclui funções e estruturas de dados para acesso
aos registos dos seguintes periféricos
• NVIC (Nested Vector Interrupt Controller)
• Timer SysTick
• MPU (Memory Protection Unit)
• SCB (System Control Block)

MEEC Prof. Nuno Peixoto 54


S. E. Tempo-Real
CMSIS

CMSIS-Core
 Inclui definições standard dos nomes das
funções associadas aos vetores das exceções e
das interrupções
• Desta forma os nomes das rotinas de serviço às
interrupções estão já declaradas, basta definir a
função com o código que se pretende executar
– Assim o código é portável entre diferentes
processadores da série Cortex-M
 Inclui funções para inicialização do sistema como
a SystemInit()
• Serve para iniciar relógios e efetuar configurações
MEEC Prof. Nuno Peixoto 55
S. E. Tempo-Real
CMSIS

Estrutura do CMSIS-Core

MEEC Prof. Nuno Peixoto 56


S. E. Tempo-Real
CMSIS

Utilização do CMSIS-Core
 Adicionar os ficheiros com o código fonte da
inicialização
• É dependente da toolchain
– Estes ficheiros têm o nome system_<device>.c
 Adicionar ficheiros específicos dos fabricantes
para acesso aos periféricos (opcional)
 No caso da toolchain MDK-ARM existe um
assistente ao criar um novo projeto que permite
ativar os componentes que se prefere, já com
avisos de dependências
• Torna a o processo muito simples e intuitivo
MEEC Prof. Nuno Peixoto 57
S. E. Tempo-Real
CMSIS

Utilização do CMSIS-Core
 É também necessário adicionar ficheiros com
código fonte específico do processador
• Por exemplo, core_cm4.c para o Cortex-M4
 Adicionar ficheiros cabeçalho com as definições
dos endereços dos vários registos
• <device>.h
• system_<device>.h
• core_cm4.h

MEEC Prof. Nuno Peixoto 58


S. E. Tempo-Real
CMSIS

Exemplo do nome
do device:
stm32f4xx

MEEC Prof. Nuno Peixoto 59


S. E. Tempo-Real
CMSIS

Estrutura de ficheiros que contêm


 Nomes dos registos do núcleo e periféricos
 Funções para aceder aos periféricos
 Código de inicialização e configuração do sistema

MEEC Prof. Nuno Peixoto 60


S. E. Tempo-Real
CMSIS

Exemplo do assistente no MDK-ARM

MEEC Prof. Nuno Peixoto 61

Você também pode gostar