Sistemas Embebidos I Licenciatura em Eng. de Electrónica e Telecomunicações e de Computadores Licenciatura em Engenharia Informática e de Computadores Mestrado em Engenharia Informática e de Computadores © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos II. Arquitectura ARM 1. Perspectiva histórica Arquitectura RISC desenvolvida na ACORN Computers Limited em Cambridge entre 1983 e 1985. A arquitectura foi usada no desenvolvimento do primeiro processador RISC para fins comerciais. Em 1990 foi fundada a ARM Limited com o intuito de melhorar e explorar a comercialização da arquitectura ARM, tendo sido adoptado como modelo de negócio o licenciamento da propriedade intelectual (IP cores). Actualmente a arquitectura ARM é líder de mercado, detendo 25% do mercado de vendas de IP cores de microprocessadores e sendo responsável por 32% do volume de vendas de microprocessadores (dados de 2005 da ARM). A arquitectura ARM é usada em áreas tão diversas como redes de computadores, indústria automóvel, sistemas de segurança ou consumo doméstico. © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 2 II. Arquitectura ARM 2. Caracterização da arquitectura Arquitectura RISC com organização Load-Store e 3(5) andares de pipeline. Conjunto de instruções reduzido e de dimensão fixa (32-bit): Instruções aritméticas e lógicas com 3 endereços (2 operandos e destino); Utilização do segundo operando com deslocamento/rotação; Transferências de dados múltiplas entre registos e a memória; Organização de memória nos formatos big-endian e little-endian (por definição); Execução condicional de todas as instruções; Execução de instruções em 1(2) ciclos de relógio; Possibilidade de expansão do conjunto de instruções através do uso de um coprocessador. Espaço de endereçamento de 4GB que inclui o mapeamento de periféricos para E/S. 16 registos de 32-bit para uso geral. © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 3 II. Arquitectura ARM 2. Caracterização da arquitectura © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 4 II. Arquitectura ARM 3. Modelo de programação Banco de registos de 32-bit com 16 registos: 13 registos de 32-bit de uso geral (R0-R12). Stack Pointer (SP) situa-se no registo R13. Link Register (LR) situa-se no registo R14. Program Counter (PC) situa-se no registo R15. Current Program Status Register (CPSR) Registo de 32-bit onde é guardado o estado interno do processador, composto pelo modo de execução, estado das flags e bits de controlo das interrupções. 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 N Z C V - - - - oVerflow Carry Zero Negative - - - - - - - - - - - - - - - - I F T Modo Interrupção Interrupção Prioritária Conjunto de instruções Thumb Modo de funcionamento do processador O estado do processador é definido pelos 15 registos de uso geral em modo user, pelo PC e pelo CPSR. © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 5 II. Arquitectura ARM 4. Conjunto de instruções Na arquitectura ARM as instruções são agrupadas em três classes: Instruções de processamento de dados Modificam o valor dos registos por aplicação de um operador lógico/aritmético a um ou dois operandos contidos em registos e guardam o resultado da operação num outro registo. Exemplos: ADD, SUB, MUL, AND, OR e MOV. Instruções de transferência de dados Permitem a transferência de informação de um registo/posição de memória/porto de E/S para um outro destino sem procederem a qualquer alteração dos dados. Exemplos: LDR, LDMIA e STR. Instruções de controlo Afectam o valor do PC possibilitando a alteração da sequência normal de instruções, de uma forma condicional ou incondicional, para além de permitirem definir a próxima instrução a ser executada. Exemplos: B, BEQ, BNE e BL. © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 6 II. Arquitectura ARM 4. Conjunto de instruções Cada instrução é codificada com um conjunto de 32-bit especificando código de operação; o(s) operando(s) a usar; a localização onde deverá ser guardado o resultado da operação; a condição que deve ser verificada para a sua execução. Quase todas as instruções permitem actualizar o estado das flags do processador (N, Z, C e V), bastando para tal acrescentar o sufixo S ao opcode da instrução. Esta abordagem torna possível a preservação do estado das flags do processador em blocos de código extensos. Todas as instruções podem ser executadas de uma forma condicional através da especificação de um sufixo. Esta opção de projecto possibilita: o desenvolvimento de um conjunto de instruções mais reduzido para a mesma funcionalidade pretendida; o aumento do desempenho do processador; redução do número de saltos em programas. © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 7 II. Arquitectura ARM 4. Conjunto de instruções Lista de condições disponíveis: Opcode Mnemónica Interpretação Flag(s) actualizadas 0000 EQ Igual / Igual a zero Z=1 0001 NE Diferente Z=0 0010 CS/HS Carry a ‘1’ / Superior ou igual (números s/ sinal) C=1 0011 CC/LO Carry a ‘0’ / Inferior (números s/ sinal) C=0 0100 MI Menor / Negativo N=1 0101 PL Maior / Positivo ou zero N=0 0110 VS Overflow V=1 0111 VC Sem overflow V=0 1000 HI Superior (números s/ sinal) C = 1 and Z = 0 1001 LS Inferior ou igual (números s/ sinal) C = 0 or Z = 1 1010 GE Superior ou igual (números c/ sinal) N=V 1011 LT Inferior (números c/ sinal) N≠V 1100 GT Superior (números c/ sinal) Z = 0 and N = V 1101 LE Inferior ou igual (números c/ sinal) Z = 1 or N ≠ V 1110 AL Sempre Qualquer 1111 NV Nunca Nenhuma © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 8 II. Arquitectura ARM 4. Conjunto de instruções: processamento de dados As instruções de processamento de dados dividem-se em quatro subclasses: Operações aritméticas Realizam operações aritméticas (soma e subtracção), com ou sem carry, sobre dois operandos inteiros representados a 32-bit, com ou sem sinal. Exemplos: ADD r0, r1, r2 SUB r0, r1, #1 RSB r0, r1, r2 ADC r0, r1, r2 SBC r1, r1, r2 RSC r0, r1, r2 Operações lógicas Realizam operações lógicas (and, or, xor) bit a bit sobre dois operandos de 32-bit. Exemplos: AND r0, r1, r2 ORR r0, r1, #0xF EOR r0, r1, r2 Transferência de dados entre registos Copiam o conteúdo do registo fonte, 32-bit, para o registo destino. Exemplos: MOV r0, r1 MVN r0, r1, LSL r2 Comparações Actualizam o valor das flags do processador com o resultado da comparação do conteúdo de dois registos. Exemplos: CMP r1, r2 TST r1, r2 CMN r1, r2 © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos TEQ r1, r2 9 II. Arquitectura ARM 4. Conjunto de instruções: processamento de dados As instruções de manipulação de dados têm tipicamente 3 endereços que são independentes e podem ser repetidos na mesma instrução: <opcode>{<cond>}{S} <Rd>, <Rn>, <oper2> <oper2> := <Rm> | <Rm>, {<shift_type> <Rs>} | <Rm>, {<shift_type> #<shift_imm>} | #<imm32> O primeiro endereço (Rd) identifica o registo de destino; O segundo endereço (Rn) identifica o registo que contém o primeiro operando; O terceiro endereço (oper2) identifica a origem do segundo operando, que pode ser um registo, o valor guardado num registo após deslocamento ou uma constante. O valor da constante é especificado na forma m ROR 2n, em que 0≤m≤255 e 0≤n≤15. O deslocamento pode ser lógico ou aritmético, incluindo ou não a flag de carry (rotação). O número de bits a deslocar especificado pelo conteúdo de um registo, 8-bit MSB, ou por uma constante de 5-bit. © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 10 II. Arquitectura ARM 4. Conjunto de instruções: processamento de dados Formas de deslocamento/rotação: 31 0 31 0 31 0 0 0 0 0 LSL, #1 31 ASR, #1 0 0 0 LSR, #2 0 31 RO R, #1 0 31 1 C 1 1 C ASR, #1 © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 0 0 RRX, #1 11 II. Arquitectura ARM 4. Conjunto de instruções: processamento de dados Casos particulares: Algumas instruções de processamento de dados têm apenas 2 endereços, suprimindo o endereço do registo de destino (comparações) ou do primeiro operando (transferência de dados entre registos); O registo r15 ou program counter (PC) ● Só pode ser usado como endereço de operando se o segundo operando não for deslocado com base num valor guardado num dos registos de uso geral; ● Quando usado como endereço de operando fornece o valor da instrução actual adicionado de 8, dada a arquitectura com 3 andares de pipeline do processador; ● Quando usado como endereço de destino permite alterar a sequência de instruções do programa (semelhante a uma instrução de controlo); ● Quando é acrescentado o sufixo S ao opcode de uma instrução que tenha r15 como endereço destino, é executada uma instrução atómica que não só altera o valor de r15 como ainda copia o valor de SPSR para CPSR. © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 12 II. Arquitectura ARM 4. Conjunto de instruções: processamento de dados Forma de codificação das instruções: 31 28 27 26 25 24 cond 00 # 21 20 19 opcode S 16 15 Rn 12 11 0 Rd 2º operando Registo destino Registo 1º operando Definir como instrução condicional Função aritmética/lógica 11 1 8 7 0 #rot constante 8-bit Rotação por valor imediato 11 7 #shift 6 5 Sh 4 3 0 0 Rm Rotação por valor imediato 0 Rotação por valor imediato Rotação por valor imediato 11 8 Rs © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 7 0 6 5 Sh 4 1 3 0 Rm 13 II. Arquitectura ARM 4. Conjunto de instruções: processamento de dados Resumo das instruções de processamento de dados: Opcode Mnemónica Significado 0000 AND E lógico bit-a-bit Rd := Rn AND Op2 0001 EOR OU-EXCLUSIVO lógico bit-a-bit Rd := Rn EOR Op2 0010 SUB Subtracção Rd := Rn - Op2 0011 RSB Subtracção com comutação de operandos Rd := Op2 – Rn 0100 ADD Adição Rd := Rn + Op2 0101 ADC Adição com Carry 0110 SBC Subtracção com Carry Rd := Rn - Op2 + C – 1 0111 RSC Subtracção com Carry e comutação de operandos Rd := Op2 - Rn + C – 1 1000 TST Teste Scc entre Rn AND Op2 1001 TEQ Teste de equivalência Scc entre Rn EOR Op2 1010 CMP Comparação Scc entre Rn - Op2 1011 CMN Comparação com negação do segundo operando Scc entre Rn + Op2 1100 ORR OU lógico bit-a-bit 1101 MOV Cópia 1110 BIC 1111 MVN © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos Efeito Rd := Rn + Op2 + C Rd := Rn OR Op2 Rd := Op2 Rd := Rn AND NOT Op2 Cópia com negação Rd := NOT Op2 14 II. Arquitectura ARM 4. Conjunto de instruções: controlo de execução O processador executa tipicamente as instruções de um programa de forma sequencial. Para trocar a ordem de execução do programa para um outro ponto é necessário alterar o valor de PC através de instruções de: Salto indirecto Permite carregar o PC com o conteúdo de um registo de uso geral. Exemplos: SUB r15, r1, #1 MOV r15, r1 ADD r15, r1, r2 Salto incondicional/condicional Permite carregar o PC com o valor de uma constante positiva/negativa de 24-bit, em que o valor da constante é relativo à instrução que está a ser executada. A execução da instrução pode ou não ser condicional mediante a inclusão do sufixo da condição. Exemplos: B xpto1 BEQ xpto2 BGT xpto3 Salto com ligação São usadas nas chamadas a rotinas/funções, pelo que para além de terem um funcionamento semelhante às instruções de salto incondicional/condicional fazem ainda a cópia do valor de PC para o LR. Exemplos: BL xpto4 BLNE xpto5 BLLT xpto6 © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 15 II. Arquitectura ARM 4. Conjunto de instruções: controlo de execução As instruções de controlo de execução têm assim apenas um endereço que identifica o endereço da próxima instrução a executar, que pode ser o valor guardado num registo ou uma constante (24-bit): <opcode>{<cond>} <oper> <opcode> := <B> | <BX> | <BL> | <BLX> <oper> := <Rm> | #<imm24> Forma de codificação das instruções: 31 28 27 cond 25 24 23 101 L 0 valor imediato Guardar PC em LR constante 24-bit com sinal © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 16 II. Arquitectura ARM 4. Conjunto de instruções: controlo de execução Resumo das instruções de controlo de execução: Tipo Salto Interpretação Utilização Típica B Incondicional Executar salto sempre BAL Sempre Executar salto sempre BEQ Igual BNE Diferente BPL Maior Resultado positivo ou nulo BMI Menor Resultado negativo BCC Flag de Carry a ‘0’ BLO Inferior BCS Flag de Carry a ‘1’ Operação aritmética gerou carry-out BHS Superior ou igual Resultado da comparação sem sinal é valor superior ou igual BVC Flag de overflow a ‘0’ Resultado da operação com sinal não gerou overflow BVS Flag de overflow a ‘1’ Resultado da operação com sinal gerou overflow BGT Superior BGE Superior ou igual BLT Menor BLE Menor ou igual BHI Superior BLS Igual ou inferior Comparação de igualdade ou teste de resultado a 0 Comparação de desigualdade ou teste de resultado não 0 Operação aritmética não gerou carry-out Resultado da comparação sem sinal é valor inferior Resultado da comparação com sinal é valor superior Resultado da comparação com sinal é valor superior ou igual Resultado da comparação com sinal é valor inferior Resultado da comparação com sinal é valor inferior ou igual Resultado da comparação sem sinal é valor superior Resultado da comparação sem sinal é valor inferior ou igual © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 17 II. Arquitectura ARM 4. Conjunto de instruções: transferência de dados A arquitectura ARM permite a transferência de dados entre a memória e os registos de três formas distintas: Transferência de dados de/para um registo Permitem copiar o conteúdo de um registo para uma posição de memória, no caso da instrução store, ou de uma posição de memória para um registo de uso geral, no caso da operação load. Exemplos: LDR r0, [r1] LDRB r0, [r1] LDRH r0, [r1] STR r0, [r1] STRB r0, [r1] STRH r0, [r1] Transferência de dados de/para múltiplos registos Permitem executar as instruções store e load para mais do que uma posição de memória/registo, até ao máximo de 16, com uma única instrução. Exemplos: LDMIA r0, {r1,r2,r5} LDMDB r0, {r13,r14} STMDB r0, {sp,pc} STMIA r0, {r2,ip} © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 18 II. Arquitectura ARM 4. Conjunto de instruções: transferência de dados A arquitectura ARM suporta 3 modos de endereçamento distintos para leitura/escrita de dados em memória: Endereçamento indirecto por registo É especificado um registo cujo conteúdo indica o endereço efectivo de memória onde os dados se encontram, no caso de uma leitura, ou onde devem ser guardados, no caso de uma escrita. Exemplos: LDR r0, [r1] STRB r0, [r1] Endereçamento indexado A instrução especifica um valor que deve ser adicionado ao registo base para se obter o endereço efectivo de memória onde os dados se encontram, no caso de uma leitura, ou onde devem ser guardados, no caso de uma escrita. A arquitectura ARM permite que o valor a adicionar seja um valor imediato, portanto codificado na própria instrução, ou o conteúdo de um registo. Exemplos: LDRH r0, [r1],#4 STR r0, [r1,r2] STRB r0, [r1,r2, LSL #1] Endereçamento relativo É um caso particular do endereçamento indexado que utiliza um valor imediato e o PC como registo base para gerar o endereço efectivo. © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 19 II. Arquitectura ARM 4. Conjunto de instruções: transferência de dados As instruções de transferência de dados têm 2 endereços que indicam o registo fonte/destino e o registo que contém o endereço de memória destino/fonte (registo base) para as instruções store e load, respectivamente : <opcode>{<cond>}{<data>} <Rd>, <address> <opcode> := LDR | STR <data> := H | B | SH | SB <address> := [<Rn>{, <offset>}]{!} | [<Rn>], <offset> <offset> := {+ | -} <Rm> {, <shift_type> #<shift_imm>} | #<imm12> O primeiro endereço (Rd) identifica o registo de destino/fonte; O segundo endereço (address) identifica a origem do segundo operando, que pode ser um registo, o valor guardado num registo com pré ou pós-indexação ou uma constante. Quando se usa pós-indexação, o valor do registo base é actualizado com o deslocamento. Quando se usa pré-indexação, é necessário acrescentar ! para actualizar o valor do registo base com o deslocamento. © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 20 II. Arquitectura ARM 4. Conjunto de instruções: transferência de dados Forma de codificação das instruções de transferências de dados: 31 28 27 26 25 24 23 22 21 20 19 cond 01 # P U B W L 16 15 Rn 12 11 0 Rd offset Registo fonte/destino Registo base Load / Store Actualização do registo base Unsigned byte / word Crescente / decrescente Pré / pós-actualização 11 0 1 constante 12-bit 11 0 7 #shift 6 5 Sh 4 0 3 0 Rm Constante para deslocamento Tipo de deslocamento Registo para deslocamento © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 21 II. Arquitectura ARM 4. Conjunto de instruções: transferência de dados Utilização de variáveis Na arquitectura ARM, o carregamento do valor de variáveis em registos de uso geral é conseguido mediante a combinação dos modos de endereçamento indirectos e relativo, visto não ser possível incluir o endereço em memória das variáveis (32-bit) nos 32-bit que codificam as instruções. O modo de endereçamento indirecto é utilizado para obter o conteúdo da posição de memória referente à variável, no caso de uma leitura, ou para guardar o valor da variável na sua posição de memória correspondente, no caso de uma escrita. Exemplos: LDR r0, [r1] STRB r0, [r1] O modo de endereçamento relativo é utilizado para carregar o endereço de memória referente à variável num registo de uso geral. Dada a existência de apenas 12-bit para a codificação do valor imediato no código das instruções, deve declarar-se numa vizinhança de ±4kB da instrução que acede à memória uma constante com o endereço em memória da variável a aceder. Exemplos: LDR r1, var_address © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 22 II. Arquitectura ARM 4. Conjunto de instruções: transferência de dados As instruções de transferência de dados múltiplos têm 1 endereço que indica o registo que contém o endereço de memória destino/fonte (registo base) para copiar/actualizar os conteúdos dos registos especificados na instrução: <opcode>{<cond>}{<mode>} <Rd>{!}, <reglist + pc> <opcode> := LDM | STM <mode> := IA | IB | DA | DB | FD | EA | FA | ED O primeiro endereço (Rd) identifica o registo de destino/fonte; O campo reglist identifica o conjunto de registos cujo conteúdo deve ser copiado para memória, no caso da instrução store, ou actualizado a partir da memória, no caso da instrução load. Este campo indica apenas os registos a usar pela instrução, e nunca a ordem pela qual são escritos/lidos. O campo mode indica o modo como o registo base deve ser actualizado em cada acesso à memória: antes (B) ou após (A) do acesso e incrementado (I) ou decrementado (D). Para actualizar o valor do registo base com o último endereço de memória preenchido/lido é necessário acrescentar !. © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 23 II. Arquitectura ARM 4. Conjunto de instruções: transferência de dados Modos de actualização do registo base Antes Depois Antes Depois r9 r9 r5 r1 r0 r5 r1 r0 r9 r9 STMIA r9!, {r0, r1, r5} STMIB r9!, {r0, r1, r5} Antes r9 Depois r9 © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos Depois r9 r5 r1 r0 STMDA r9!, {r0, r1, r5} Antes r5 r1 r0 r9 STMDB r9!, {r0, r1, r5} 24 II. Arquitectura ARM 4. Conjunto de instruções: transferência de dados Forma de codificação das instruções de transferências de dados múltiplas: 31 28 27 cond 25 24 23 22 21 20 19 100 P U S W L 16 15 Rn 0 lista de registos Registo base Load / Store Actualização do registo base Repôr PSR Crescente / decrescente Pré / pós-actualização 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 pc lr sp ip fp r10 r9 r8 r7 r6 r5 r4 r3 r2 r1 r0 © 2008- 2013, Tiago Miguel Dias ADEETC - Secção de Arquitecturas e Sistemas Operativos 25