EL68E Sistemas Embarcados
Prof. Douglas RENAUX
© Prof. Dr. Douglas Renaux Arquitetura ARM
Prof. Douglas RENAUX
© Prof. Dr. Douglas Renaux ARM – Histórico
Ano Evento
Desenvolvimento do primeiro RISC comercial na Acorn Computers Ltd (Cambridge – UK) 1984-1985 ARM = Acorn RISC Machine
1990 Fundação da ARM (Advanced RISC Machines Ltd.)
1995 ARM7TDMI
Desenvolvimento do ARM8 em conjunto com a DEC 1996-1998 (adquirida pela Intel que fez o StrongARM)
1997 ARM9
1999 ARM10
2003 ARM11
2005 Cortex M3, R4, A8
2007 Cortex A9 – Multicore
2012 Arquitetura v8 – 32/64 bits (Cortex A50)
2014 Cortex M7 – pipeline superescalar
© Prof. Dr. Douglas Renaux Acorn
BBC Micro 1981
© Prof. Dr. Douglas Renaux Developer Acorn Computers Type 8-bit home computer Release date 1 December 1981 Retail availability 12 years Introductory price £235 Model A, £335 Model B (in 1981)
Discontinued 1994 Units sold over 1.5 million Media Cassette tape, floppy disc (optional), hard disc (rare), Laserdisc (BBC Domesday Project)
Operating system Acorn MOS Power 50 W CPU 2 MHz MOS Technology 6502/6512
Storage capacity 100–800 kB (DFS) 160–1280 kB (ADFS floppy discs)
20 MB (ADFS hard disc) Memory 16–32 kB (Model A/B) 64–128 kB (Model B+) 128 kB (Master)
Plus 32–128 kB ROM, expandable to 272 kB Display PAL/NTSC, UHF/composite/TTL RGB
Graphics 640×256, 8 colours (various framebuffermodes)
78×75, 8 colours (Teletext) Sound Texas Instruments SN76489, 4 channels, mono TMS5220 speech synthesiser with phrase ROM (optional)
Input Keyboard, twin analogue joysticks with fire buttons, lightpen
Connectivity Printer parallel, RS-423 serial, user parallel,Econet (optional), 1 MHz bus, Tube second processor interface
© Prof. Dr. Douglas Renaux Acorn Archimedes - 1987
© Prof. Dr. Douglas Renaux ARM Typical MIPS @ ARM Family ARM Core Feature Arch. MHz
ARM1 ARMv1 ARM1 First implementation
ARMv2 added the MUL (multiply) 4 MIPS @ 8 MHz ARMv2 ARM2 instruction 0.33 DMIPS/MHz
ARM2 Integrated MEMC (MMU), Graphics ARMv2a ARM250 and IO processor. ARMv2a added the 7 MIPS @ 12 MHz SWP and SWPB (swap) instructions.
12 MIPS @ First integrated memory cache. ARM3 ARMv2a ARM3 25 MHz 4 KB unified 0.50 DMIPS/MHz
ARMv3 first to support 32-bit memory 10 MIPS @ ARM60 address space (previously 26-bit) 12 MHz
As ARM60, cache and coprocessor bus 28 MIPS @ ARM600 ARM6 ARMv3 (for FPA10 floating-point unit). 33 MHz
17 MIPS @ ARM610 As ARM60, cache, no coprocessor bus. 20 MHz © Prof. Dr. Douglas Renaux 0.65 DMIPS/MHz ARM700 40 MHz
ARM7 ARMv3 ARM710 As ARM700, no coprocessor bus. 40 MHz
40 MHz ARM710a As ARM710 0.68 DMIPS/MHz
15 MIPS @ 16.8 MHz ARM7TDMI(-S) 3-stage pipeline, Thumb 63 DMIPS @ 70 MHz
As ARM7TDMI, cache 8 KB unified, ARM710T 36 MIPS @ 40 MHz ARM7TDMI ARMv4T MMU As ARM7TDMI, cache 8 KB unified, ARM720T 60 MIPS @ 59.8 MHz MMU
ARM740T As ARM7TDMI, MPU
5-stage pipeline, Thumb, Jazelle DBX, ARM7EJ ARMv5TEJ ARM7EJ-S Enhanced DSP instructions
© Prof. Dr. Douglas Renaux Pipeline
Fonte: ARM
© Prof. Dr. Douglas Renaux ARM Cortex
© Prof. Dr. Douglas Renaux ARM Cortex
© Prof. Dr. Douglas Renaux
© Prof. Dr. Douglas Renaux ARM Cortex
© Prof. Dr. Douglas Renaux
© Prof. Dr. Douglas Renaux Microcontroller profile, most Thumb + some Optional cache, Cortex- Thumb-2,[10] hardware multiply instruction 0.84 no TCM, no M0[9] (optional small), optional system timer, optional DMIPS/MHz MPU bit-banding memory Microcontroller profile, most Thumb + some Optional cache, Cortex- Thumb-2,[10] hardware multiply instruction no TCM, 0.93 M0+[11] (optional small), optional system timer, optional optional MPU DMIPS/MHz ARMv6-M bit-banding memory with 8 regions 136 DMIPS Microcontroller profile, most Thumb + some Optional cache, @ Thumb-2,[10] hardware multiply instruction 0-1024 KB I- 170 MHz,[13]( Cortex- Cortex- (optional small), OS option adds SVC / banked TCM, 0- 0.8 DMIPS/M M M1[12] stack pointer, optional system timer, no bit- 1024 KB D- Hz FPGA- banding memory TCM, no MPU dependent)[1 4]
Optional cache, Microcontroller profile, Thumb / Thumb-2, Cortex- no TCM, 1.25 ARMv7-M hardware multiply and divide instructions, M3[15] optional MPU DMIPS/MHz optional bit-banding memory with 8 regions Microcontroller profile, Thumb / Thumb-2 / DSP / Optional cache, 1.25 Cortex- optional VFPv4-SP single-precision FPU, no TCM, ARMv7E-M DMIPS/MHz M4[16] hardware multiply and divide instructions, optional MPU (1.27 w/FPU) optional bit-banding memory with 8 regions
ARM ARM Family ARM Core Feature Cache (I/D), MMU Typical MIPS @ MHz Architecture
© Prof. Dr. Douglas Renaux Thumb-2 Densidade de código melhora em até 35% em relação ao código ARM. Thumb-2: “melhor de dois mundos” independe de código ARM
© Prof. Dr. Douglas Renaux Fonte: ARM © Prof. Dr. Douglas Renaux Baixo Custo x 8 bits
© Prof. Dr. Douglas Renaux • http://www.embedded-systems.com/underthehood/210101486 © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux
© Prof. Dr. Douglas Renaux ARMv8-A (64 bits)
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux Exynos 5250 com Cortex-A15 dual core
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux 64-bits - AMD Hierofalcon will pack four to eight 64-bit ARM A57 cores clocked up to 2GHz. In addition to new ARM cores, the 28nm chips also feature 10Gbit Ethernet and PCI Express 3.0 on board, which means they should be a good fit for data centres.
21-Out-2013
© Prof. Dr. Douglas Renaux NVIDEA: 192 GPU 4x A15 ou 2x A57
Tegra K1 Lançado em 2014
© Prof. Dr. Douglas Renaux Tegra X1 - 2015
© Prof. Dr. Douglas Renaux NVidia - 2016
© Prof. Dr. Douglas Renaux Qualcomm's Growing 64-bit SoC Lineup Marketing Name Snapdragon 615 Snapdragon 610 Snapdragon 410 Internal Model Number MSM8939 MSM8936 MSM8916
Manufacturing Process 28nm LP 28nm LP 28nm LP
CPU 8 x ARM Cortex A53 4 x ARM Cortex A53 4 x ARM Cortex A53 1.2GHz+
ISA 32/64-bit ARMv8 32/64-bit ARMv8 32/64-bit ARMv8
GPU Qualcomm Adreno 405 Qualcomm Adreno 405 Qualcomm Adreno 306
H.265 Decode Yes Yes No Memory Interface 1 x 64-bit LPDDR2/3 1 x 64-bit LPDDR2/3 1 x 64-bit LPDDR2/3
Integrated Modem 9x25 core, LTE 9x25 core, LTE 9x25 core, LTE Category 4, DC- Category 4, DC- Category 4, DC- HSPA+, DS-DA HSPA+, DS-DA HSPA+, DS-DA
Integrated WiFi Qualcomm VIVE Qualcomm VIVE Qualcomm VIVE 802.11ac 802.11ac 802.11ac
eMMC Interface 4.5 4.5 4.5
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux Fev 29, 2016 – Raspberry Pi 3
© Prof. Dr. Douglas Renaux Cortex-M7 (lançamento 24-Set-2014)
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux RISC x CISC
© Prof. Dr. Douglas Renaux Histórico Computadores Computador = um dispositivo que computa (calcula, processa dados)
© Prof. Dr. Douglas Renaux Gerações de Computadores Geração Descrição 0 Máquinas Mecânicas e Eletromecânicas solução de equações 1 40’s – Válvula ENIAC, Zuse 2 50’s – Transistores Universidade de Manchester IBM 350 3 60’s – Circuitos integrados SSI (portas lógicas) Apolo Guidance Computer (embarcado) IBM System/360 Digital VAX 4 70’s – Microprocessador
5 20?? – ótico, orgânico, computação quântica ??? IA © Prof. Dr. Douglas Renaux Computação Quântica - 5-Out-2015
© Prof. Dr. Douglas Renaux Primeira Geração
Colossus - UK ENIAC - USA
© Prof. Dr. Douglas Renaux Segunda Geração
PDP-1
© Prof. Dr. Douglas Renaux Terceira Geração
VAX 11/780 © Prof. Dr. Douglas Renaux De que forma os projetistas de computadores (arquitetos) utilizaram o aumento significativo de transistores disponibilizados pela evolução rápida da tecnologia de fabricação de circuitos integrados ?
© Prof. Dr. Douglas Renaux CISC Complex Instruction Set Computer o conjunto de instruções
inicialmente simples
avanços tecnológicos (transistores, CIs) permitiram a manufatura de computadores com mais transistores a menor custo
projetistas optaram por conjuntos de instruções cada vez mais complexos
© Prof. Dr. Douglas Renaux CISC Como tornar as instruções mais complexas: aumentar o número de modos de endereçamento endereçamento indireto em memória [[R]] instruções com elevado grau semântico Exemplos do 68000
SBCD: Subtract Decimal with Extend SWAP: Swap register Words CMP2: Compare Register against Upper and Lower Bounds
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux Date of Transistor Manufactu Processor introductio Process Area count rer n
Intel 4004 2,300 1971 Intel 10 µm 12 mm² Intel 8008 3,500 1972 Intel 10 µm 14 mm² Motorola 68,000 1979 Motorola 3.5 μm 44 mm² 68000 Intel 80286 134,000 1982 Intel 1.5 µm 49 mm² Pentium 3,100,000 1993 Intel 0.8 µm 294 mm² ARM 7 578977[9] 1994 ARM 0.5 µm 68.51 mm² ARM 26,000,000[ 2007 ARM 65 nm Cortex-A9 12] AMD 463,000,00 K10 quad- 2007 AMD 65 nm 283 mm² 0[11] core 2M L3 Quad-Core + 1,400,000,000 2012 Intel 22 nm 160 mm² GPU Core i7
Xbox One 5,000,000,000 Microsoft/AMD Main SoC 2013 28 nm 363 mm² Perguntas Qual é, afinal, o objetivo primordial do arquiteto / projetista de computadores ? Dada uma tecnologia de fabricação e uma área de silício (custo), como fazer o melhor aproveitamento possível ? Quais são as conseqüências de um conjunto de instruções complexo ?
© Prof. Dr. Douglas Renaux RISC x CISC RISC CISC Conjunto de instruções reduzido Conjunto de instruções extenso Instruções muito simples Instruções complexas Instruções de tamanho fixo Instruções de tamanho variável Decodificação simplificada Decodificação complexa (tabela) (microcódigo) Execução regular Cada instrução executa a sua maneira Instruções requerem o mesmo Grande variação no número de número de clocks para executar clocks por instrução Possibilita o uso de pipeline Extremamente difícil / impossível o uso de pipeline
© Prof. Dr. Douglas Renaux Pipeline
© Prof. Dr. Douglas Renaux Diferenciais da arquitetura ARM Cortex-M3
© Prof. Dr. Douglas Renaux Instruções Condicionais A maioria das instruções ARM são condicionais só produzem efeito se os flags estiverem setados adequadamente BEQ – Branch on Equal executa um salto caso o bit Z esteja setado As instruções condicionais precisam estar em um “bloco IT” exceto a instrução B (BRANCH = Salto) ex: ADDEQ – executa uma soma caso o bit Z esteja setado
© Prof. Dr. Douglas Renaux Pipeline Na arquitetura Cortex-M, as instruções são executadas de acordo com uma das seqüências abaixo: 1. BUSCA DECODIFICAÇÃO EXECUÇÃO (OPERAÇÃO LÓG./ARIT.)
2. BUSCA DECODIFICAÇÃO EXECUÇÃO (CÁLCULO ENDEREÇO) ACESSO À MEMÓRIA DE DADOS
© Prof. Dr. Douglas Renaux Pipeline No Cortex-M3 o pipeline tem três estágios: 1. BUSCA – leitura da instrução da memória
2. DECODIFICAÇÃO – interpretação do código da instrução e geração dos sinais de controle
3. EXECUÇÃO – operação lógica/aritmética ou acesso a memória de dados
* o estágio de EXECUÇÃO pode ocupar mais de um ciclo de clock
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux Arquitetura ARM
Prof. Douglas RENAUX
© Prof. Dr. Douglas Renaux Módulo 3
A arquitetura Cortex-M3
© Prof. Dr. Douglas Renaux Cortex-M3 internal structure
© Prof. Dr. Douglas Renaux Instruções do Cortex-M0
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux
© Prof. Dr. Douglas Renaux Arquitetura Cortex-M3 Visão geral da Arquitetura:
Registradores Conjunto de instruções Acesso à Memória Interrupções
© Prof. Dr. Douglas Renaux Módulo 4
Conjunto de Instruções Thumb-2
© Prof. Dr. Douglas Renaux Arquitetura Cortex-M3 Cortex-M3 usa a versão ARMv7-M de arquitetura
ARMv7-M Thumb2 Mix de instruções de 16 e 32 bits Não requer alinhamento na memória das instruções de 32 bits
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux infocenter.arm.com
Developer Guides and Articles
Software Development
© Prof. Dr. Douglas Renaux Formato das Instruções Log/Arit
Três operandos explícitos (Rd,Op1,Op2) ADD R0,R1,R2 R0 := R1 + R2 Dois operandos e um implícito (Rd,Op2) ADDS R0,R5 R0 := R0 + R5 Dois operandos (Op1,Op2) CMP R8,R9
© Prof. Dr. Douglas Renaux 1 - Lógicas e Aritméticas Instrução Descrição
ADD, ADDS, ADCS Soma, soma com carry SUB, SUBS Subtrai
RSBS Subtração reversa
MUL Multiplicação: 32b x 32b -> 32b ANDS, ORRS, EORS Operações lógicas: E, OU, OU-EXCL (bit a bit) BICS Operação lógica: E NÃO CMP, CMN Comparação, comparação negada TEQ, TST Teste de bits MOV, MVN Move, move negado
© Prof. Dr. Douglas Renaux Tipo Tamanho Tipo Tamanho char 8 bits [ ] 32 bits short 16 bits struct ptr = 32 bits int 32 bits float 32 bits unsigned 32 bits double 64 bits long 32 bits enum = int long long 64 bits * 32 bits
© Prof. Dr. Douglas Renaux CMP, CMN, TST, MOV, MVN Formatos: CMN Rn,Rm // R0-R7 (soma Rn e Rm) CMP Rn, #imm //R0-R14; 0-255 CMP Rn,Rm TST Rn, Rm // R0-R7 (AND) MOVS Rd, Rm MOVS Rd, #imm // 0-255 MVNS Rd,Rm MOV Rd,Rm
© Prof. Dr. Douglas Renaux Deslocamento (LSLS)
• n >= 32 todos os bits são zerados n >= 33 todos os bits e o carry são zerados • variantes: só LSLS (altera carry) LSLS {Rd},Rm,Rs LSLS {Rd},Rm,#imm • efeito de LSLS Rm, #n é Rm * 2n © Prof. Dr. Douglas Renaux Deslocamento (LSRS)
• n >= 32 todos os bits são zerados n >= 33 todos os bits e o carry são zerados • variantes: só LSRS (altera carry) LSRS {Rd},Rm,Rs LSRS {Rd},Rm,#imm • efeito de LSRS Rm, #n é Rm / 2n © Prof. Dr. Douglas Renaux Deslocamento (ASRS)
n >= 32 todos os bits e o carry recebem cópia do bit 31 variantes: só ASRS (altera carry) ASRS {Rd},Rm,Rs ASRS {Rd},Rm,#imm efeito de ASRS Rm, #n é Rm / 2n
© Prof. Dr. Douglas Renaux Rotação (RORS) / RRX n >= 32 é o mesmo que n-32 variantes: só RORS (altera carry) RORS {Rd},Rm,Rs RORS {Rd},Rm,#imm efeito de LSRS Rm, #n é Rm / 2n (para Rm sem sinal) • n = 32 o valor não é alterado e CY := Rm[31] n = 33 mesmo efeito que RORS com n = 1 • variantes: só RORS (altera carry) RORS {Rm},Rm,Rs • não acessa regs altos • apenas dois operandos © Prof. Dr. Douglas Renaux ARM – Barrel Shifter
LSL : Logical Left Shift ASR: Arithmetic Right Shift
CF Destination 0 Destination CF Multiplication by a power of 2 Division by a power of 2, preserving the sign bit LSR : Logical Shift Right ROR: Rotate Right
...0 Destination CF Destination CF
Division by a power of 2 Bit rotate with wrap around from LSB to MSB RRX: Rotate Right Extended
Destination CF
Single bit rotate with wrap around from CF to MSB © Prof. Dr. Douglas Renaux Operando 2
© Prof. Dr. Douglas Renaux Operando 2 Registrador R4 Registrador e deslocamento R4, LSL #4 R5, ASR #1
Constante: #4 #0xAABB #-2
© Prof. Dr. Douglas Renaux Deslocamentos no Operando 2 Opções: • ASR #n 1 ≤ n ≤ 32
• LSL #n 1 ≤ n ≤ 31
• LSR #n 1 ≤ n ≤ 32
• ROR #n 1 ≤ n ≤ 31
• RRX
© Prof. Dr. Douglas Renaux Constantes no Operando 2 Não é possível definir qualquer valor de constante no Operando 2 Apenas alguns valores podem ser formados: Valores de 8 bits deslocados Valores do tipo 0x00XY00XY Valores do tipo 0xXY00XY00 Valores do tipo 0xXYXYXYXY
© Prof. Dr. Douglas Renaux MULTIPLICAÇÃO-1 MULS Rd,Rn,Rm Rd := Rn x Rm Rm deve ser o mesmo registrador que Rd formato preferido: MULS Rd,Rn R0 – R7 32-bits x 32-bits -> 32-bits em 1 único ciclo de clock afeta N e Z
© Prof. Dr. Douglas Renaux MULTIPLICAÇÃO-2 MUL Rd,Rn,Rm Rd := Rn x Rm formato alternativo: MUL Rd,Rn Registradores exceto SP, PC 32-bits x 32-bits -> 32-bits em 1 único ciclo de clock
© Prof. Dr. Douglas Renaux MULTIPLICAÇÃO-3 MLA Rd,Rn,Rm,Ra Rd := Ra + Rn x Rm
32-bits x 32-bits -> 32-bits em 2 ciclos de clock
© Prof. Dr. Douglas Renaux MULTIPLICAÇÃO-4 MLS Rd,Rn,Rm,Ra Rd := Ra - Rn x Rm
32-bits x 32-bits -> 32-bits em 2 ciclos de clock
© Prof. Dr. Douglas Renaux MULTIPLICAÇÃO-5 UMULL RdLo, RdHi, Rn, Rm RdHi:RdLo := Rn x Rm UMLAL RdLo, RdHi, Rn, Rm RdHi:RdLo := RdHi:RdLo + Rn x Rm SMULL RdLo, RdHi, Rn, Rm RdHi:RdLo := Rn x Rm SMLAL RdLo, RdHi, Rn, Rm RdHi:RdLo := RdHi:RdLo + Rn x Rm 32-bits x 32-bits -> 64-bits em 3 a 5 ciclos de clock
© Prof. Dr. Douglas Renaux DIVISÃO UDIV Rd,Rn,Rm Rd := Rn / Rm SDIV Rd,Rn,Rm Rd := Rn / Rm
32-bits / 32-bits -> 32-bits em 4 ciclos de clock configurável se quer gerar exceção na divisão por zero
© Prof. Dr. Douglas Renaux MOV, MOV.W, MOVT Para simplificar a carga de constantes que não atendem o formato “8-bits com deslocamento”
MOV Ri,#16-bits (equivalente a MOV.W Ri,#16) carrega os 16 bits menos significativos de Ri MOVT Ri,#16-bits carrega os 16 bits mais significativos de Ri
Com 2 instruções pode-se carregar qualquer constante de 32 bits em um registrador !
© Prof. Dr. Douglas Renaux Exercícios 1. Multiplicar o valor inteiro (32-bits) que está em R3 pela constant 9: a) Usando instrução de multiplicação
b) Sem usar multiplicação (sugestão: usar ADD/SUB/shift)
2. Idem, mas multiplicando por 15.
3. Qual a maneira mais eficiente (menos instruções e menos tempo) para fazer as seguintes cargas de constantes: 1. R0 := 0
2. R1 := 200
3. R2 := 0x1234
4. R3 := 0xFFFFFF00 © Prof. Dr. Douglas Renaux 5. R4 := 0xABCDEF00 Instruções que Operam em Bits BFC Rd, #lsb, #w #lsb e #w estão na faixa de 0 a 31 e 1 a 32 Bit-field clear: limpa #w bits a partir de #lsb BFC R0, #4, #8 R0 = 0xFFFF F00F
BFI Rd, Rn, #lsb, #w Bit-field Insert: copia #w bits de Rn:0 para Rd:#lsb BFI R1, R2, #8, #0xC R1 = 0x FFFC DDFF
© Prof. Dr. Douglas Renaux Exercícios 4. Alterar os bits 5 a 9 do registrador R10 para 11001 a) Usando AND/OR/…
b) Usando instruções de bit-field
sua solução deve funcionar para qualquer que seja o valor atual de R10.
© Prof. Dr. Douglas Renaux Instruções que Operam em Bits SBFX Rd, Rn, #lsb, #w #lsb e #w estão na faixa de 0 a 31 e 1 a 32 Extrai campo e faz extensão de sinal: copia #w bits a partir de #lsb para o bit0 de Rd e estende SBFX R0, R1, #4, #8 R0 = 0xFFFF FFBC
UBFX Rd, Rn, #lsb, #w Idem, estendendo com zeros
© Prof. Dr. Douglas Renaux Extend SXTB Rd,Rm // Rd := sign extend Rm[7:0] UXTB Rd,Rm // Rd := zero extend Rm[7:0] SXTH Rd,Rm // Rd := sign extend Rm[15:0] UXTH Rd,Rm // Rd := zero extend Rm[15:0]
R0-R7
© Prof. Dr. Douglas Renaux ADR ADR Rd, label calcula o endereço do label na forma de um offset para o PC Carrega o Rd com o endereço do label
Faixa permitida: PC +/- 4095
Obs: no IAR o label deve estar na região de dados para que o assembler aceite o ADR
© Prof. Dr. Douglas Renaux 2 - Acesso à Memória
© Prof. Dr. Douglas Renaux Acessos Alinhados um acesso à memória de dados é alinhado se: acesso à Word é em endereço múltiplo de 4 acesso à HalfWord é em endereço múltiplo de 2 acesso à Byte é em endereço múltiplo de 1 No Cortex-M0 todos os acessos devem ser alinhados ou causa um HardFault No Cortex-M3 os acessos podem ser desalinhados
© Prof. Dr. Douglas Renaux Instruções de Acesso à Memória de Dados LDR LD LDRD LDM (Load = Leitura) POP
STR ST STRD (Store = Escrita) STM PUSH
© Prof. Dr. Douglas Renaux LDR Lê dado da memória Formatos: LDR Rt,[Rn] LDR Rt,[Rn,#off] LDRB Rt,[Rn,#off] LDRH Rt,[Rn,#off] Restrições: #off: -255..4095 [Rn,#off] outras restrições quando envolve os registradores SP ou PC
© Prof. Dr. Douglas Renaux LDR Lê dado da memória Formatos: LDR Rt,[Rn,Rm] LDRB Rt,[Rn,Rm] LDRH Rt,[Rn,Rm]
LDR Rt,[Rn, Rm, LSL #2] //end = Rn + Rm<<2
© Prof. Dr. Douglas Renaux LDR – Pré e Pós Indexado Pré-Indexado:
• LDR Rd,[Ri,#cte] !
• LDR Rd,[Ri,Rm] !
• Primeiro calcula endereço depois acessa memória
• O ‘!’ indica que o Ri deve ser atualizado com o endereço recém calculado. LDR R2,[R3,#4]!
Pós-Indexado
• LDR Rd,[R ],#cte
• LDR Rd,[Ri],Rm
• Primeiro acessa memória© Prof. Dr. DouglasdepoisRenaux calcula endereço
• Sempre atualiza Ri LDRSB e LDRSH Lê dado da memória e faz extensão de sinal Formatos: LDRSB Rt,[Rn,#off] LDRSH Rt,[Rn,#off] LDRSB Rt,[Rn,Rm] LDRSH Rt,[Rn,Rm]
© Prof. Dr. Douglas Renaux LDR (relativo ao PC) Lê dado da memória O dado está em endereço próximo ao código sendo executado Formatos: LDR Rt,[PC,#100] LDR Rt, label
© Prof. Dr. Douglas Renaux LDRD Lê 64 bits da memória para 2 registradores Usado para carregar inteiros de 64 bits (long long) LDRD Rt, Rt2, label // relativo ao PC LDRD Rt, Rt2, [...] // mesmos modos de // endereçamento que LDR
Rt – word menos significativo (LSW) está no endereço especificado Rt2 – word mais signifivativo (MSW) está no endereço seguinte (+4) © Prof. Dr. Douglas Renaux STR Escreve dado da memória Formatos: STR STRB STRH mesmas regras que para LDR
© Prof. Dr. Douglas Renaux LDM e STM Tranfere múltiplos registradores de/para memória Formatos: LDM R0,{R0,R1,R2} LDM R1!,{R2-R7} STM R0!,{R2-R4}
© Prof. Dr. Douglas Renaux LDM e STM Variantes:
• IA = Increment After – default 1. acessa memória
2. incrementa endereço
• DB = Decrement Before 1. decrementa endereço
2. acessa memória
• EA = Empty Ascending • FD = Full Descending LDM = LDMIA, LDMFD STM = STMIA, STMEA © Prof. Dr. Douglas Renaux PUSH e POP Tranfere múltiplos registradores de/para memória
STMFD sp!, {r0,r1,r3-r5} Formatos: PUSH {r0,r1,r3-r5} PUSH {R0-R7} POP {R1,R3-R6} Full Descending Stack
old SP r5 r4 r3 r1 SP r0 endereço baixo © Prof. Dr. Douglas Renaux FD : Full Descending LDM e STM STMDB sp!, {r0,r1,r3-r5} STMIA sp!, {r0,r1,r3-r5} STMFD sp!, {r0,r1,r3-r5} STMEA sp!, {r0,r1,r3-r5}
SP 0x418 r5 r4 r3 r1 Old SP Old SP r0 r5 0x400 r4 r3 r1 SP r0 0x3e8 DB : Decrement Before IA : Increment After FD : Full Descending EA : Empty Ascending 155 © Prof. Dr. Douglas Renaux Exercício – Acesso à Memória Em C: crie uma struct com 3 campos: um inteiro, um char, e um short e atribua valores a estes campos.
Em assembly: some os 3 campos da struct produzindo um resultado de 32 bits com sinal.
© Prof. Dr. Douglas Renaux Projetos: Parte da avaliação (equipes de 1 ou 2 pessoas)
1. Comunicação por CAN, só 4 placas
2. USB device: HID (p.ex. – mouse)
3. PWM: gerar onda senoidal.
© Prof. Dr. Douglas Renaux 3 - Saltos
© Prof. Dr. Douglas Renaux 3 - Saltos B loopA ; salta para o label LoopA (unica instrução condicional que não precisa IT) BL funC ; chamada de rotina, armazena endereço de retorno em LR BX LR ; retorno de chamada de rotina BLX R0 ; Chamada de rotina BEQ labelD ; Salto condicional
© Prof. Dr. Douglas Renaux Saltos CBZ Rn, label – Testa Rn e salta se 0 CBNZ Rn, label – Testa Rn e salta se não-zero
Restrições: Só saltos para frente até 130 bytes Não pode ser usado em bloco IT Não modifica flags Só R0 a R7
© Prof. Dr. Douglas Renaux Bloco IT Bloco consiste de 1 a 4 instruções condicionais ITxyz cond x,y,z são T ou E (Then ou Else)
ITTE EQ ADDEQ SUBEQ ORRNE
© Prof. Dr. Douglas Renaux Bloco IT A instrução de salto condicional Bcc label (onde cc é uma das condições) não precisa estar num bloco IT
As instruções: IT, CBZ, CBNZ, CPSIE, CPSID NÃO podem estar em bloco IT
Uma instrução que altera PC, só pode estar num bloco IT se for a última. © Prof. Dr. Douglas Renaux Condições No Cortex-M3 as outras instruções podem ir em blocos IT
© Prof. Dr. Douglas Renaux Saltos (limites)
© Prof. Dr. Douglas Renaux Exercício
1)
© Prof. Dr. Douglas Renaux Exercício – continuação MDC 2) Como transformar em subrotina ? 3) Como chamar a partir de outra rotina em assembly ? 4) Como chamar a partir de uma função em C ?
© Prof. Dr. Douglas Renaux Exercício Qual a maneira mais eficiente de implementar um loop com número fixo de execuções, como por exemplo:
for (int i=0; i<10; i++) { // dentro do loop não se usa i a = b<<3 + a; b++; }
© Prof. Dr. Douglas Renaux Módulo 5
Registradores Especiais Modos de Operação Instruções Especiais
© Prof. Dr. Douglas Renaux priviledged © Prof. Dr. Douglas Renaux Pilha (Stack) pode-se trabalhar apenas com MSP o SP corrente sempre é acessado como R13 ou SP O SP está sempre com alinhamento de Word (i.e. endereços múltiplos de 4) Instruções: PUSH - empilha POP - desempilha Full descending
© Prof. Dr. Douglas Renaux Link Register R14 ou LR Armazena o endereço de retorno de uma subrotina Deve ser salvo antes de chamar outra subrotina
© Prof. Dr. Douglas Renaux Contador de Programa PC ou R15 instrução sendo executada + 4 endereço de instrução é sempre par (bit0 = 0) bit0 do PC é usado para indicar modo Thumb após reset e em algumas instruções de salto: BX e BLX
© Prof. Dr. Douglas Renaux Modo
Handler
Thread Nível de Não-Privilegiado Privilegiado Main (Principal) Privilégio
Processo
Pilha
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux Stack: selecionado pelo bit1 de CONTROL 0 = main; 1 = process (este stack só pode ser usado em modo Thread) Modo: selecionado pelo IPSR 0 = Thread; >0 exception Privilégio: bit 0 do CONTROL (0 = privilegiado, 1 = não-privilegiado) no Cortex-M0 é sempre privilegiado (sem restrição)
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux xPSR
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux IPSR
IPSR Exception number != IRQ Number (Table 320) © Prof. Dr. Douglas Renaux CONTROL
CONTROL instruções MSR e MRS após MSR usar ISB para garantir que o novo stack será usado © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux PRIMASK
PRIMASK só pode ser escrito em modo privilegiado instruções CPSID e CPSIE, MSR e MRS © Prof. Dr. Douglas Renaux Modo Privilegiado No modo Privilegiado o código tem acesso a TODOS os recursos. No modo NÃO-Privilegiado o código NÃO tem acesso à: instruções como CPS que permitiriam alterar FAULTMASK e PRIMASK maioria dos registradores do System Control
© Prof. Dr. Douglas Renaux 4 - Outros
© Prof. Dr. Douglas Renaux BKPT BKPT #imm #imm é um valor de 0 a 255 entrada no estado de depuração esta instrução é utilizada por debugers
instrução não deve ser usada por programadores
© Prof. Dr. Douglas Renaux CPS Change Processor State altera o PRIMASK Formatos: CPSID i // desabilita IRQs CPSIE i // habilita IRQs
© Prof. Dr. Douglas Renaux DMB — The Data Memory Barrier (DMB) completa transações pendentes antes de realizar outra transação. DSB — The Data Synchronization Barrier (DSB) completa transações pendentes antes de executar a próxima instrução. ISB — The Instruction Synchronization Barrier (ISB) garante que o efeito das transações efetuadas seja percebido antes da próxima instrução.
© Prof. Dr. Douglas Renaux Exemplos de Uso Tabela de vetores: usar DMB entre uma alteração no vetor e a habilitação da IRQ correspondente. Alteração no código: usar uma ISB logo após a instrução que altera o código. Alteração no mapa de memória: usar um DSB imediatamente após a instrução que altera o mapa de memória.
© Prof. Dr. Douglas Renaux MSR, MRS MSR – Move to Special Reg from Register MSR special_reg, Rn MRS – Move to Register from Special Reg MRS Rd, special_reg Special Reg: APSR, IPSR, EPSR, IEPSR, IAPSR, EAPSR, PSR, MSP, PSP, PRIMASK, or CONTROL Rd, Rn – não podem ser SP ou PC
© Prof. Dr. Douglas Renaux NOP Não realiza nenhuma operação Pode ser elimininada no pipeline (i.e. pode ser executado em tempo 0) Uso: alinhamento de código em fronteira de word ou double-word
© Prof. Dr. Douglas Renaux SEV Send Event Formato: SEV
Informa da ocorrência de um evento Seria usado com WFE que não existe no LPC11xx
© Prof. Dr. Douglas Renaux SVC Chamada ao Supervisor (S.O.) Formato SVC #imm // 0 .. 255 Gera uma exceção do tipo SVC A ISR pode ler o valor de #imm para identificar o serviço solicitado
© Prof. Dr. Douglas Renaux WFI Wait for Interrupt Formato: WFI entra em modo de baixo consumo até que: exceção IRQ, mesmo que mascarada por PRIMASK solicitação de DEBUG
© Prof. Dr. Douglas Renaux Módulo 6
Acesso à Memória
© Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux © Prof. Dr. Douglas Renaux Memória – Processadores 13xx
© Prof. Dr. Douglas Renaux Módulo 7
Exceções/Interrupções
© Prof. Dr. Douglas Renaux Interrupções
Interrupções são uma forma eficiente de se responder às demandas solicitadas pelos periféricos. Alternativa é polling: desperdício de consultas atendimento mais demorado
212 Estrutura típica de Interrupção
Peripheral 1 IRQ
Interrupt Microprocessor Controller Core P2 (e.g Cortex-M) P3
P4
Pn
213 Interrupções Princípio de funcionamento durante a execução de um programa, um sinal de hardware (IRQ = Interrupt Request) é ativado. um controlador de interrupções percebe o sinal, verifica se está habilitado (desmascarado) e sua prioridade e então informa o processador da existência de um pedido de interrupção pendente o processador verifica se as interrupções estão habilitadas e finaliza a execução da instrução corrente SALVAMENTO DE CONTEXTO (registradores, palavra de status) [em alguns casos] - muda o ponteiro de pilha para IRQ_STACK busca no vetor de interrupção: identifica quem é a rotina responsável pelo atendimento daquela interrupção específica execução da ISR (parte do salvamento de contexto pode ser feito aqui) informa ao periférico solicitante que a IRQ foi atendida informa ao controlador de interrupção que o atendimento finalizou (EOI) RECUPERA CONTEXTO dá seguimento a execução do programa que foi interrompido
214 Interrupções É um processo complexo Qualquer falha em algum passo causa uma parada total do sistema Depuração difícil, principalmente porque é um evento assíncrono
Um programador só é realmente um programador de sistemas embarcados quando sabe trabalhar bem com o atendimento de interrupções. Quando se usa RTOS, em geral, passa-se ao RTOS a responsabilidade de tratar as IRQs.
215 Controlador de Interrupção Em geral são vetorizados: detectam automaticamente qual dos pedidos de interrupção ativo é o mais prioritário, consultam a tabela de endereços de ISR (vetor de interrupção) e entregam ao processador o endereço da ISR. portanto, a CPU só precisa ler o endereço da ISR e executar a partir dali
No Cortex-M: maior eficiência obtida pelo atendimento totalmente realizado pelo HW. 216 Desabilitando o Atendimento de IRQs Também chamado de mascaramento de IRQs No controlador de interrupções é possível mascarar / desmascarar IRQs específicas: p.ex. mascarar apenas a IRQ da UART2 No processador é possível mascarar / desmascarar o atendimento de interrupções por completo.
217 Teste e Depuração Teste e Depuração de ISRs é uma atividade complexa. Quando finalmente se consegue atender à primeira interrupção: o teste NÃO acaba aqui !!! atender a segunda IRQ do mesmo periférico também requer teste e depuração p.ex. esquecer de enviar um EOI impede o atendimento do pedido seguinte. Importante testar situações de stress: vários pedidos simultâneos de periféricos distintos várias repetições de pedidos de interrupção do mesmo periférico
218 Como registrar uma ISR num Cortex-M3 Basta colocar o nome da ISR na tabela de vetores de exceção localizada no endereço 0 da memória.
229 Como registrar uma ISR num Cortex-M3 Cortex-M: o vetor de interrupções fica na memória do processador a partir do endereço 0. basta armazenar a tabela com os endereços das ISRs nesta região de memória.
230 Interrupções - Conceitos
Latência: tempo entre o pedido de interrupção (ativação do sinal IRQ) até o início da execução da ISR: HW: detecção, processamento no Cont. IRQ tempo de finalização da instrução corrente tempo que as IRQs estão desabilitadas . outras ISR em execução (aninhamento x prioridade) . no device driver . no RTOS . na aplicação Tempo de Resposta (pior caso): Somar: Pior caso da Latência Pior caso do tempo de execução da ISR.
231 Exceções Qualquer solicitação para mudança do fluxo normal de um programa. interrupção detecção de falha / erro (p.ex. acesso desalinhado)
© Prof. Dr. Douglas Renaux Exceções Estados Inativo (inactive) = não ativo nem pendente Pendente (pending) = aguardando atendimento (p.ex. pedido de interrupção – irq – de periférico) Ativo (active) = em atendimento pode haver mais de uma interrupção em atendimento (interrupções aninhadas – nested) Ativo e Pendente = interrupção em atendimento e outro pedido da mesma fonte está pendente
© Prof. Dr. Douglas Renaux 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
© Prof. Dr. Douglas Renaux Configurável: prioridade de 0 (default) a 3 Prioridades: valor menor significa maior prioridade PRIMASK: pode mascarar as IRQ com prioridade configurável
© Prof. Dr. Douglas Renaux O LSb deve ser 1 indicando que a rotina de tratamento é em Thumb O IAR coloca o bit0 em 1 automaticamente para todos os labels criados em Thumb
© Prof. Dr. Douglas Renaux Atendimento Um atendimento de exceção ocorre quando: existe uma exceção pendente com prioridade suficiente (*); e o processador está em modo Thread; ou a exceção pendente é de prioridade maior que a exceção sendo atendida (preempção)
(*) prioridade suficiente significa prioridade maior do que o limite estabelecido no PRIMASK
© Prof. Dr. Douglas Renaux Atendimento (2) Stacking – salva o estado O SP está alinhado em double-word se necessário pula um word antes de começar o empilhamento
© Prof. Dr. Douglas Renaux Atendimento (3) O processador lê do vector_table o endereço do handler; LR := EXC_RETURN (ver próximo slide) após o stacking, a execução se dá a partir do handler, a exceção passa ao status de ativa Se durante o stacking ocorreu outra exceção de maior prioridade então esta é atendida (late-arriving exception)
©© Prof. Prof. Dr.Dr. DouglasDouglas RenauxRenaux Atendimento (4)
© Prof. Dr. Douglas Renaux Retorno de Exceção Ocorre quando uma instrução escreve no PC um dos valores de EXC_RETURN As instruções que podem ser usadas para retorno de exceção são POP e BX
© Prof. Dr. Douglas Renaux Tratamento de Faltas Todas as faltas causam HardFault Trava se a falta ocorre no handler da NMI ou HardFault Faltas: SVC BKPT fora de depuração (i.e. não conectado ao IAR) erro de acesso a memória (erro de barramento) em LD ou ST tentativa de execução em área XN tentativa de execução causando erro de barramento erro de barramento em acesso ao vector_table tentativa de execução de instrução inválida tentativa de execução em modo ARM (T=0) LD ou ST desalinhado
© Prof. Dr. Douglas Renaux Hard Faults
© Prof. Dr. Douglas Renaux Módulo 8
ATPCS
© Prof. Dr. Douglas Renaux ATPCS ARM-Thumb Procedure Call Std
Passagem de parâmetros:
- primeiros parâmetros em R0 .. R3 demais parâmetros pela pilha
- retorno: R0 ou R1:R0
© Prof. Dr. Douglas Renaux ATPCS – Tipos de Dados
Tipo Tamanho Tipo Tamanho char 8 bits [ ] 32 bits short 16 bits struct ptr = 32 bits int 32 bits float 32 bits unsigned 32 bits double 64 bits long 32 bits enum = int long long 64 bits * 32 bits
© Prof. Dr. Douglas Renaux ATPCS Quem tem a obrigação de salvar o valor dos registradores caso interesse manter este valor após a chamada de uma função ?
- rotina chamada: deve salvar R4 – R11 antes de alterar
- R0 – R3,R12 podem ser livremente utilizados pela rotina chamada
© Prof. Dr. Douglas Renaux Código de Entrada e Saída de Função PUSH {R4-R7,LR}
… POP {R4-R7,LR} MOV PC,LR
PUSH {R4-R7,LR}
… POP {R4-R7,PC}
© Prof. Dr. Douglas Renaux Exercício – continuação MDC 2) Como transformar em subrotina ? 3) Como chamar a partir de outra rotina em assembly ? 4) Como chamar a partir de uma função em C ?
© Prof. Dr. Douglas Renaux Exercício de Alinhamento C: struct s { char a; short b; char c; int d; };
#pragma pack(2) #pragma pack() © Prof. Dr. Douglas Renaux