ARM, originalmente Acorn RISC Machine, e depois Advanced RISC Machine, é uma família de arquiteturas RISC desenvolvida pela empresa britânica ARM Holdings. Tais arquiteturas são licenciadas pela ARM para outras empresas, que implementam-nas em seus próprios produtos. A ARM também desenvolve chips que utilizam tal arquitetura e que são licenciados para uso exclusivo de outras empresas em seus produtos.

A ARM Holdings publica periodicamente atualizações para suas arquiteturas, todas elas com espaço de endereçamento de 32 bits (apenas chips pré-ARMv3, feitos antes da ARM Holdings ser formada, como no Acorn Archimedes, tinham espaços de endereçamento menores) e aritmética de 32 bits; instruções para chips da ARM possui tamanho fixo de 32 bits, mas versões mais recentes também suportam instruções de tamanho variável para melhorar a densidade de código. Alguns cores também providenciam a execução em hardware de bytecode Java. A arquitetura ARMv8-A, anunciada em Outubro de 2011, suporta ainda endereçamento de 64 bits e aritmética de 64 bits, com instruções de tamanho fixo de 32 bits.

Com 230 bilhões de chips produzidos até 2022, a arquitetura ARM é mais popular.

Histórico Resultado do projeto inovador de um bem sucedido fabricante britânico de computadores chamado Acorn Computer Group. Inicialmente desenvolvido pela Acorn Computers Limited de Cambridge, Inglaterra, entre outubro de 1983 e abril de 1985, foi o primeiro processador RISC desenvolvido para uso comercial. Projeto baseado no processador Berkeley RISC I. O Núcleo ARM se manteve basicamente com o mesmo tamanho durante sua evolução. ARM2 tinha 30,000 transistores, enquanto o ARM6 evoluiu para apenas 35,000. Em 2009 alguns fabricantes de netbooks utilizaram processadores Arm em seus produtos para concorrer com o Atom da Intel.

Em 1985 surgiram os primeiros exemplares do microprocessador ARM1 (Acorn RISC Machine 1) e, no ano seguinte, a versão comercial ARM2. Esses microprocessadores possuíam um barramento de dados de 32 bits e outro de endereços de 26 bits (que permitiam endereçar até 64MB de memória). Incluíam também um conjunto de 16 registradores de 32 bits, sendo um deles destinado ao contador de programa e bits de estado do processador. As versões iniciais dos microprocessadores ARM (ARM2 e ARM3) foram utilizadas nos primeiros computadores RISC pessoais (Archimedes 300, 400 e 500) fabricados pela Acorn.

Em 1990, a Acorn Computer Group, a Apple Computer e a VLSI Technology uniram-se para formar a ARM Limited (Advanced RISC Machines), e em 1991 foi lançada a primeira versão comercial, o ARM6, juntamente com o primeiro microprocessador da ARM, o ARM610. Os principais conceitos por trás da arquitetura ARM são a simplicidade, baixo custo e baixo consumo.

Atualmente, a ARM Limited não fabrica chips, apenas desenvolve o projeto e licencia o uso de suas CPUs (a sua propriedade intelectual) para que outros fabricantes (como Cirrus Logic, STMicroelectronics, NXP, Texas Instruments, Atmel, Samsung, Sharp, Qualcomm, Nvidia, etc) possam produzir ou alterar as CPUs. Outubro/1983, a Acorn Computers LTDA desenvolve o primeiro processador ARM. 26 de abril de 1985 protótipos do ARM são fabricados pela VLSI Technilogy e são utilizados pela primeira vez em BBC Micros: primeiro processador RISC a ser comercializado. 80's, os ARMs são utilizados nos desktops da Acorn (BBC MAster e Acorn Archimedes). 80's, é criada uma versão estática, o ARM2aS. Fim 80's, visando uma versão totalmente estática, a Apple junta-se a Acorn para desenvolver novas versões do ARM. Novembro/1990, a AdvancedRM LTDA é fundada resultante de uma junção da Acorn com a Apple Computer e a VLSI Technology. 1991, são lançados os primeiros do ARM6. 1995, DEC e ARM lançam o StrongARM. (Intel compra DEC e ganha o StrongARM de "presente"). 1998, ARM LTDA é introduzida nas bolsas de Londres e NASDAQ. Ao longo dos anos 90, ARM torna-se líder no mercado de processadores embarcados de alto desempenho e baixo consumo de energia.

Arquitetura 32-bits A arquitetura ARM 32-bits, como a ARMv7-A, foi a arquitetura mais amplamente utilizada em dispositivos móveis em 2011

Desde 1995, o ARM Architecture Reference Manual tem sido a principal fonte de documentação sobre a arquitetura de processador ARM e conjunto de instruções, distinguindo interfaces que todos os processadores ARM são necessários para suportar (como semântica de instruções) de detalhes de implementação que podem variar. A arquitetura evoluiu ao longo do tempo, e a versão sete da arquitetura, ARMv7, define três "perfis" de arquitetura:

Perfil-A, o perfil "Aplicativo", implementado por núcleos de 32 bits na série Cortex-A e por alguns núcleos não-ARM Perfil-R, o perfil "Real-time", implementado por núcleos da série Cortex-R Perfil-M, o perfil "Microcontrolador", implementado pela maioria dos núcleos da série Cortex-M

Embora os perfis de arquitetura tenham sido definidos pela primeira vez para o ARMv7, o ARM definiu posteriormente a arquitetura ARMv6-M (usada pelo Cortex M0 / M0 + / M1) como um subconjunto do perfil do ARMv7-M com menos instruções.

Modos do CPU Exceto no perfil-M, a arquitetura ARM de 32 bits especifica vários modos de CPU, dependendo dos recursos de arquitetura implementados. A qualquer momento, a CPU pode estar em apenas um modo, mas pode alternar modos devido a eventos externos (interrupções) ou programaticamente.

Modo Usuário: O único modo não privilegiado Modo FIQ: Um modo privilegiado que é inserido sempre que o processador aceita uma solicitação de interrupção rápida (Fast Interrupt Requests) Modo IRQ: Um modo privilegiado que é inserido sempre que o processador aceita uma interrupção. Modo Supervisor (SVC): Um modo privilegiado inserido sempre que a CPU é reinicializada ou quando uma instrução SVC é executada. Modo de anulação: Um modo privilegiado que é inserido sempre que ocorre uma exceção de anulação automática ou anulação de dados. Modo indefinido: Um modo privilegiado que é inserido sempre que ocorre uma exceção de instrução indefinida. Modo Sistema (ARMv4 e acima): O único modo privilegiado que não é inserido por uma exceção. Ele só pode ser inserido executando uma instrução que grava explicitamente os bits de modo do CPSR (Current Program Status Register) de outro modo privilegiado (não do modo de usuário). Modo monitor (ARMv6 e ARMv7 Security Extensions, ARMv8 EL3): Um modo monitor é introduzido para suportar a extensão TrustZone em núcleos ARM. Modo Hyp (ARMv7 Virtualization Extensions, ARMv8 EL2): Um modo de hipervisor que suporta os requisitos de virtualização de Popek e Goldberg para a operação não segura da CPU. Modo thread (ARMv6-M, ARMv7-M, ARMv8-M): Um modo que pode ser especificado como privilegiado ou não privilegiado, enquanto o MSP (Main Stack Pointer) ou PSP (Process Stack Pointer) é usado, também pode ser especificado em Registro de controle com acesso privilegiado. Este modo é projetado para tarefas do usuário em ambiente RTOS, mas é tipicamente usado em bare-metal para super loop. Modo do manipulador (ARMv6-M, ARMv7-M, ARMv8-M): Um modo dedicado para tratamento de exceções (exceto o RESET que é tratado no modo Thread). O modo manipulador sempre usa o MSP e funciona em nível privilegiado.

Conjunto de Instruções A implementação original (e subsequente) do ARM foi programada sem microcódigo, como o muito mais simples processador de 8 bits 6502 usado nos microcomputadores Acorn anteriores.

A arquitetura ARM de 32 bits (e a arquitetura de 64 bits em sua maior parte) inclui os seguintes recursos do RISC:

Arquitetura Load/Store Não há suporte para acessos de memória não alinhados na versão original da arquitetura. O ARMv6 e posterior, exceto algumas versões de microcontroladores, suportam acessos desalinhados para instruções de load/store de meia palavra e única palavra com algumas limitações, sem nenhuma atomicidade garantida. Arquivo de registro uniforme de 16 × 32 bits [incluindo o contador de programa (Program counter), ponteiro de pilha (Stack pointer) e o registro de link (Link register)]. Largura fixa de instruções de 32 bits para facilitar a decodificação e o pipelining, ao custo da redução da densidade do código. Mais tarde, o conjunto de instruções Thumb adicionou instruções de 16 bits e aumentou a densidade do código. Principalmente execuções em um único ciclo de clock.

Para compensar o design mais simples, comparado com processadores como o Intel 80286 e o Motorola 68020, alguns recursos de design adicionais foram usados:

A execução condicional da maioria das instruções reduz a sobrecarga de ramificação e compensa a falta de um branch predictor. As instruções aritméticas alteram os códigos de condição apenas quando desejado. 32-bit barrel shifter pode ser usado sem penalidade de desempenho com a maioria das instruções aritméticas e cálculos de endereço. Tem poderosos modos de endereçamento indexados. Um registrador de link suporta chamadas de função de folha rápida. Um subsistema de interrupção simples, mas rápido, de 2 níveis de prioridades, trocou os bancos de registradores.

Instruções aritméticas O ARM inclui operações aritméticas inteiras para adicionar, subtrair e multiplicar; Algumas versões da arquitetura também suportam operações de divisão.

O ARM suporta multiplicações de 32 bits × 32 bits com resultado de 32 bits ou resultado de 64 bits, embora os núcleos Cortex-M0 / M0 + / M1 não suportem resultados de 64 bits. Alguns núcleos ARM também suportam multiplicações de 16 bits × 16 bits e 32 bits × 16 bits.

As instruções de divisão são incluídas apenas nas seguintes arquiteturas ARM:

As arquiteturas ARMv7-M e ARMv7E-M sempre incluem instruções de divisão. A arquitetura ARMv7-R sempre inclui instruções de divisão no conjunto de instruções Thumb, mas opcionalmente em seu conjunto de instruções de 32 bits. A arquitetura ARMv7-A inclui opcionalmente as instruções de divisão. As instruções podem não ser implementadas ou implementadas apenas no conjunto de instruções Thumb, ou implementadas nos conjuntos de instruções Thumb e ARM, ou implementadas se as Extensões de Virtualização estiverem incluídas. (Link para a refêrencia quebrado)

Registradores + Registradores nos modos do CPU usr sys svc abt und irq fiq R0 R1 R2 R3 R4 R5 R6 R7 R8 R8_fiq R9 R9_fiq R10 R10_fiq R11 R11_fiq R12 R12_fiq R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14 R14_svc R14_abt R14_und R14_irq R14_fiq R15 CPSR SPSR_svc SPSR_abt SPSR_und SPSR_irq SPSR_fiq

Registradores R0 a R7 são os mesmos em todos os modos de CPU; eles nunca são acumulados.

Registradores R8 a R12 são os mesmos em todos os modos de CPU, exceto no modo FIQ. O modo FIQ possui seus próprios registros R8 a R12.

R13 e R14 são colocados em todos os modos de CPU privilegiados, exceto o modo de sistema. Ou seja, cada modo que pode ser inserido devido a uma exceção tem seu próprio R13 e R14. Esses registradores geralmente contêm o ponteiro da pilha e o endereço de retorno das chamadas de função, respectivamente.

Pseudônimo:

R13 também é conhecido como SP, o Stack Pointer. R14 também é conhecido como LR, o registro de links. R15 também é referido como PC, o contador de programas.

O Registro de Status do Programa Atual (CPSR) possui os seguintes 32 bits.

M (bits 0–4) são os bits do modo do processador. T (bit 5) é o bit de estado do Thumb. F (bit 6) é o bit de desabilitação do FIQ. I (bit 7) é o bit de desativação do IRQ. A (bit 8) é o bit de desativação de anulação de dados imprecisos. E (bit 9) é o bit de endianidade de dados. IT (bits 10–15 e 25–26) são os bits de estado if-then. GE (bits 16-19) é o maior que ou igual a bits. DNM (bits 20–23) são os não modifique bits. J (bit 24) é o bit de estado Java. Q (bit 27) é o bit de overflow pegajoso. V (bit 28) é o bit de overflow. C (bit 29) é o bit transportar / emprestar / estender. Z (bit 30) é o bit zero. N (bit 31) é o negativo / menor que bit.

Características da arquitetura