Baixe o app para aproveitar ainda mais
Prévia do material em texto
1César Ofuchi – ofuchi@utfpr.edu.br Arquitetura Cortex-M (Adaptado do Prof. Hugo Vieira Neto/Prof. Douglas Renaux) César Yutaka Ofuchi ofuchi@utfpr.edu.br 2César Ofuchi – ofuchi@utfpr.edu.br Referências • Joseph Yiu – The definitive guide to the arm córtex-M3 (second edition) – Capítulos 3, 7 e 8 3César Ofuchi – ofuchi@utfpr.edu.br 3 Sumário • CMSIS • Registradores Especiais • Memória • Exceções 4César Ofuchi – ofuchi@utfpr.edu.br CMSIS – Cortex Microcontroller System Interface Standard 5César Ofuchi – ofuchi@utfpr.edu.br Principais Componentes • CMSIS-CORE – API para núcleos e periféricos Cortex-M • CMSIS-Driver – Drivers genéricos para interface com periféricos (pilhas de comunicação, sistemas de arquivos, interfaces gráficas, …) • CMSIS-DSP – Biblioteca de funções para processamento digital de sinais em ponto fixo (q7, q15 e q31) e ponto flutuante (32 bits) • CMSIS-RTOS – API para sistemas operacionais em tempo real 6César Ofuchi – ofuchi@utfpr.edu.br Registradores MSP = main SP Kernel do S.O. Exceções PSP = process SP Aplicações (threads) PRIMASK Desabilita interrupções CONTROL Seleciona modo Seleciona pilha Nível de acesso privilegiado 7César Ofuchi – ofuchi@utfpr.edu.br SP - Stack Pointer • Pode-se trabalhar apenas com o MSP • O SP atual é acessado como R13 ou SP • O SP sempre está alinhado em 32 bits – 2 bits menos significativos são sempre 0 – Ex. endereços múltiplos de 4 • Instruções: – PUSH (empilha) – POP (desempilha) • Full descending stack Decimal Binário 0 00000 4 00100 8 01000 12 01100 16 10000 20 10100 24 11000 28 11100 8César Ofuchi – ofuchi@utfpr.edu.br LR - Link Register • Acessado como R14 ou LR • Armazena o endereço de retorno de uma subrotina • Deve ser salvo antes de se chamar outra subrotina 9César Ofuchi – ofuchi@utfpr.edu.br PC - Contador de Programa • Acessado como R15 ou PC • PC contém endereço da instrução sendo executada + 2 ou +4 (dependendo do tamanho da instrução atual) • O endereço de uma instrução é sempre par (bit0 = 0) • Bit0 do PC é usado para indicar modo Thumb após reset e em algumas instruções de salto: BL e BLX • Bit0 = 0 ARM • Bit0 = 1 Thumb Decimal Binário 0 0000 2 0010 4 0100 6 0110 8 1000 10César Ofuchi – ofuchi@utfpr.edu.br Registradores Especiais • Program Status Registers (xPSR): – Application Program Status Register (APSR) – RW – Interrupt Program Status Register (IPSR) – RO – Execution Program Status Register (EPSR) – RO • Acesso por meio de instruções específicas: • Assembly – MRS R0, APSR – MSR APSR, R0 • C – apenas leitura (API CMSIS) – __get_PSR() – __get_IPSR() 10 11César Ofuchi – ofuchi@utfpr.edu.br Program Status Registers (PSR) 12César Ofuchi – ofuchi@utfpr.edu.br Interrupt Program Status Register (IPSR) • “Exception number” é diferente de “(CMSIS) IRQ number 16+”! Somar 16 13César Ofuchi – ofuchi@utfpr.edu.br Registradores Especiais - Interrupções • Interrupt Mask Registers (Acesso somente em nível privilegiado) – PRIMASK (1bit): usado para habilitar/desabilitar todas as interrupções e exceções (exceto NMI e Hard Fault) – FAULTMASK(1bit): usado para habilitar/desabilitar exceções de falta – BASEPRI(8 bits): define o mascaramento de interrupções abaixo de um limiar de prioridade • Acesso pelas Instruções MRS, MSR e Change Processor State CPSE e CPSD (Enable e Disable) I (Interrupt) ou F (Fault) Exemplo MSR: Escreve 1 em PRIMASK para desabilitar TODAS as interrupções MOV R0, #1 MSR PRIMASK, R0 Exemplo CPSE e CPSD: Enable/Disable das interrupções CPSIE I //Clear Primask (Enable interrupts and configurable fault handlers) CPSID F // Set PRIMASK (Disable interrupts and ALL Fault Handlers) Funções CMSIS em C __disable_irq(); __enable_irq() Funções CMSIS em C __set_PRIMASK(1) e __get_PRIMASK() 14César Ofuchi – ofuchi@utfpr.edu.br Registradores Especiais - Interrupções • BASEPRI define um limiar de prioridade para execução de interrupções Exemplo Assembly MOV R0, #0x60 //não executa IRQ acima de 0x60 MSR BASEPRI, R0 Funções CMSIS em C __set_BASEPRI(uint32_t) uint32_t __get_BASEPRI() 15César Ofuchi – ofuchi@utfpr.edu.br Registradores Especiais – CONTROL • CONTROL – Bit 1: define o ponteiro de pilha (0:MSP ou 1:PSP) – Bit 0: define o nível de acesso (0: Privilegiado ou 1: Não Privilegiado) • O bit 0 possui acesso de escrita apenas em nível privilegiado – uma vez em nível usuário, a única forma de retornar ao nível privilegiado é por meio de uma interrupção. • Acesso pelas instruções MRS e MSR – Usar instrução ISB após a instrução MSR para garantir uso imediato da nova pilha Funções CMSIS em C void __set_CONTROL(uint32_t) uint32_t __get_CONTROL() __set_PSP/MSP(uint32_t) uint32_t __get_PSP/MSP() Ex: __set_CONTROL(0x0); __ISB(); Valor Bit 1 Bit 0 Status 0x0 0 0 Priv. MSP 0x1 0 1 Não priv. MSP 0x2 1 0 Priv. PSP 0x3 1 1 Não Priv. PSP 16César Ofuchi – ofuchi@utfpr.edu.br Exercícios (Anotar e apresentar) Utilizando o kit LPC Xpresso + placa base e o workspace “Código Exemplo da placa”, recompilar e iniciar a depuração do projeto “oled_periph”. • Com o depurador parado no início da função main, verifique: – Qual stack pointer esta sendo usado? – No modo disassembly veja como os endereços de instrução estão espaçados – Adicione o código asm("MOV R0,PC"); e verifique se o endereço da instrução PC no depurador é o mesmo de R0. • Faça um step into na função SystemCoreClockUpdate() – Qual o valor de LR na saída da função? – Qual o valor do próximo endereço de instrução no programa main? É o mesmo que o LR apontou anteriormente? • Coloque um breakpoint no corpo da função SysTick_Handler e execute até parar nele: – Qual Stack Pointer é usado? – Qual a situação do Registrador CONTROL? – Qual o valor de LR ? Há uma instrução válida neste endereço ? 17César Ofuchi – ofuchi@utfpr.edu.br Modos, Privilégios e Pilhas Handler Thread Exemplos SysTick_Handler ADC_IRQHandler TIMER16_0_IRQHandler Stack: MSP Privilégio: Priv. Stack: MSP ou PSP Privilégio: Priv. Ou Não Priv. Exceções Código “Normal” CONTROL [1] - Stack CONTROL [0] - Privilégio 18César Ofuchi – ofuchi@utfpr.edu.br Modos, Privilégios e Pilhas • Thread Mode / Handler Mode – Modo Thread: execução normal de aplicações – Modo Handler: exceções ou interrupções • Operação privilegiada / não privilegiada – Modo Thread: pode ser privilegiada ou não – Modo Handler: sempre privilegiada • Main Stack / Process Stack – Ambas as pilhas possuem seu próprio ponteiro – Exceções sempre utilizam MSP em modo Handler – Aplicações (modo Thread) utilizam MSP ou PSP 19César Ofuchi – ofuchi@utfpr.edu.br Privilégios • No nível Privilegiado o código tem acesso a TODOS os recursos. • No nível Não Privilegiado o código NÃO tem acesso a: – Instruções como CPS que permitiriam alterar FAULTMASK e PRIMASK – A maioria dos registradores do System Control Block, SysTick, NVIC 20César Ofuchi – ofuchi@utfpr.edu.br Exemplo 1 Stack: MSP Privilégio: Priv. Stack: MSP Privilégio: Priv. Ex: __set_CONTROL(0x0); __ISB(); Valor Bit 1 Bit 0 Status 0x0 0 0 Priv. MSP 0x1 0 1 Não priv. MSP 0x2 1 0 Priv. PSP 0x3 1 1 Não Priv. PSP Handler Thread Exceções Código “Normal” μC convencional 21César Ofuchi – ofuchi@utfpr.edu.br Exemplo 2 Stack: MSP Privilégio: Priv. Stack: PSP Privilégio: Priv. Ex: __set_CONTROL(0x2); __ISB(); Valor Bit 1 Bit 0 Status 0x0 0 0 Priv. MSP 0x1 0 1 Não priv. MSP 0x2 1 0 Priv. PSP 0x3 1 1 Não Priv. PSPHandler Thread Exceções Código “Normal” Ex: Proteção para Stack do Sistema Operacional 22César Ofuchi – ofuchi@utfpr.edu.br Exemplo 3 Stack: MSP Privilégio: Priv. Stack: PSP Privilégio: Não Priv. Ex: __set_CONTROL(0x3); __ISB(); Valor Bit 1 Bit 0 Status 0x0 0 0 Priv. MSP 0x1 0 1 Não priv. MSP 0x2 1 0 Priv. PSP 0x3 1 1 Não Priv. PSP Handler Thread Exceções Código “Normal” Ex: Proteção para Stack do Sistema Operacional Thread não tem acesso a periféricos diretamente 23César Ofuchi – ofuchi@utfpr.edu.br Modos, Privilégios e Pilhas 24César Ofuchi – ofuchi@utfpr.edu.br Modos e Privilégios 33César Ofuchi – ofuchi@utfpr.edu.br Exceções 34César Ofuchi – ofuchi@utfpr.edu.br Eventos Causadores • Exceções podem ser causadas por eventos internos ou externos ao processador 35César Ofuchi – ofuchi@utfpr.edu.br Eventos Causadores->Modos • Modo Thread após Reset • Modo Handler após qualquer outro tipo de exceção 36César Ofuchi – ofuchi@utfpr.edu.br Visão Geral Interna – Cortex-M • NVIC (Nested Vector Interrupt Controller) – Suporte a múltiplas fontes de interrupção (Interrupções externas IRQs, System Exceptions) – Tratamento eficiente de interrupções aninhadas e Arquitetura flexível (configuração de prioridades) – Suporte intrínseco a RTOS (SysTick) 37César Ofuchi – ofuchi@utfpr.edu.br Visão Geral Interna – Cortex-M • Arquitetura de interrupções com baixa latência • Algumas instruções com múltiplos ciclos de execução podem ser interrompidas – EX: Divisão, LDM, STM • Entrada/saída de interrupções controlada por hardware – Salvamento e restauração de contexto (STACKING) realizado automaticamente – Tratamento de chegada tardia (late arriving) de interrupções com maior prioridade – Tratamento de interrupções pendentes sem restauração/ salvamento completo de contexto (tail-chaining) 38César Ofuchi – ofuchi@utfpr.edu.br Tipos de Exceções • Cortex-M suporta até 255 interrupções System Exception (Core) Interrupções Externas (periféricos) -16 -1 0 239 1 15 16 255 Exception Number IRQ Number • Primeiros 16 são System Exceptions – CMSIS define essas interrupções como negativas – Definidas pelo ARM Core • Os 239 restantes são interrupção de periféricos – Interrupções de periféricos começa em 0 – Definido pelo fabricante do chip (Ex. NXP) Exception Number = IRQ Number + 16 39César Ofuchi – ofuchi@utfpr.edu.br Tipos de Exceção • Reset – reinício da execução (modo Thread) (-3) • NMI - prioridade (-2) • HardFault – prioridade (-1) falha genérica: representa todas as classes de falhas que não foram tratadas • SVC – causada pela instrução SVC (Supervisor Call) • PendSV – solicitação de serviço (p.ex. chaveamento de contexto) • SysTick – gerado pelo system timer • IRQ – pedido de interrupção feito por periférico 40César Ofuchi – ofuchi@utfpr.edu.br Tipos de Exceção por Falta • MemManageFault: faltas no acesso a memória detectadas pela MPU – se desabilitada, escala para HardFault • BusFault: outros tipos de falta no barramento de memória que não as do tipo MemManage • UsageFault: faltas não relacionadas ao barramento de memória (ex. instrução indefinida ou estado inválido) 41César Ofuchi – ofuchi@utfpr.edu.br Tipos de Exceção e suas propriedades Joseph Yiu pag. 35 S y s te m E x c e p ti o n s In te rr u p ç ã o P o r p e ri fé ri c o F ix a s 42César Ofuchi – ofuchi@utfpr.edu.br Exemplo LPC13xx.h 43César Ofuchi – ofuchi@utfpr.edu.br Estados das Exceções • Inativo: nem pendente nem ativo • Pendente: a exceção foi gerada, mas ainda não foi processada - (ex. pedido de interrupção de periférico) • Ativo: o processamento da exceção foi iniciado, mas ainda não foi completado - Pode haver mais de uma interrupção em atendimento (interrupções aninhadas – NESTED) • Ativo e Pendente: a exceção está sendo processada e existe uma exceção pendente da mesma fonte 44César Ofuchi – ofuchi@utfpr.edu.br Processo de Interrupção/Exceção • Stacking: – Barramento de dados – Salva Contexto(8 Registradores ) na Stack E x e c u ç ã o e m P a ra le lo • Vector Fetch – Barramento de endereços – Busca endereço da rotina (handler) na tabela de vetores de exceção • Atualização de registradores (SP,LR, PC,xPSR) – SP atualiza devido ao stacking – IPSR atualiza para a exceção ocorrida – PC atualiza para endereço na tabela de vetores – LR atualiza para um número de retorno “mágico” EXC_RETURN • Execução do Handler • Unstacking/ Atualização de registradores/retorno 45César Ofuchi – ofuchi@utfpr.edu.br Stacking • Ocorre salvamento automático de contexto (stacking)na entrada, bem como recuperação automática de contexto (unstacking)na saída • Porque esses registradores??? Padrão de linguagem C para chamada de função ATPCS 46César Ofuchi – ofuchi@utfpr.edu.br Tabela de Vetores de Exceção S y s te m E x c e p ti o n s Valor para inicializar Main Stack Pointer (MSP) Valor para inicializar Program Counter(PC) Void SysTick_Handler(){ … } Void Reset_Handler(){ … } 47César Ofuchi – ofuchi@utfpr.edu.br Exception Handlers (Rotina de Tratamento de Excessão) • ISR (Interrupt Service Routine) – Rotina de Tratamento de Interrupção para IRQ 0 até IRQ 57 (LPC13xx.h) usados em periféricos • Fault Handler – Rotina de Tratamento de Falta para HardFault • System Handler – Rotina de Tratamento de Exceções do Sistema para NMI, PendSV, SVC, SysTick 48César Ofuchi – ofuchi@utfpr.edu.br Retorno de Exceções • Ocorre quando uma instrução escreve no PC um dos valores de EXC_RETURN • Instruções usadas para retorno de exceção: – LDR PC, ... – LDM/POP incluindo PC – BX LR (preferencial) 49César Ofuchi – ofuchi@utfpr.edu.br Definições Importantes • Preempção: uma exceção de maior prioridade pode causar preempção de uma rotina de tratamento (handler) em execução • Retorno: ocorre ao término da execução da rotina de tratamento (handler), caso: – Não exista exceção pendente com prioridade suficiente para ser atendida – A rotina que terminou não seja de uma exceção com chegada tardia (late arriving) 50César Ofuchi – ofuchi@utfpr.edu.br Definições Importantes • Tail-chaining (encadeamento): se ao término de uma handler existir uma exceção pendente apta a ser tratada então não se executa a sequência de restauração/salvamento de contexto (POP/PUSH) 51César Ofuchi – ofuchi@utfpr.edu.br Definições Importantes • Late arriving (chegada tardia): mecanismo que acelera preempção caso uma exceção de maior prioridade ocorra durante o salvamento de contexto (PUSH) – nesse caso a exceção de maior prioridade é atendida primeiro e em seguida, por tail-chaining, a de menor prioridade. IRQ1 chegou atrasado - mas tem maior prioridade - Arm Cortex não faz stacking novamente 52César Ofuchi – ofuchi@utfpr.edu.br Exercícios (anotar e apresentar) Utilizando o kit LPC Xpresso + placa base e o arquivo “example_modos_excecoes.c”, rebuild all em todos os projetos e iniciar a depuração. 1. Ambientação com o código -Abra o Terminal I/O (View Terminal I/O) e os Registradores -Rode o programa e veja as mensagens -Use o Joystick para gerar interrupções - Coloque um breakpoint em Systick_Handler e PIOINT2_IRQHandler, o que acontece com a stack?? 2. Descomente o código para registradores especiais e troque os modos.- O que ocorre em cada modo com relação ao SP e ao LR. - Ocorre algum problema? Qual? - Clique com o botão direito nas funções em C (especiais) e faça um comando Go ToDefinition, quais outras funções estão disponíveis? 3. Descomente o código para interrupções. - Teste os commandos para habilitar/desabilitar interrupções vistos em aula.
Compartilhar