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 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, (optional), 1 MHz bus, Tube second processor interface

© Prof. Dr. Douglas Renaux - 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 – 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