Baixe o app para aproveitar ainda mais
Prévia do material em texto
PSI3441 – Arquitetura de Sistemas Embarcados Escola Politécnica da Universidade de São Paulo Prof. Gustavo Rehder – grehder@lme.usp.br Prof. Sergio Takeo – kofuji@usp.br Prof. Antonio Seabra – acseabra@lsi.usp.br 2017 - Registradores, Memória - Instruções de Desvio PSI3441 – Arquitetura de Sistemas Embarcados - Registradores 3 Registradores no ARM Cortex M0+ Arquitetura “Load-Store” Memória (Grande e Lenta) Registrador de Propósito Geral (Pequena e Rápida) C o n tr o le Operando 2 ALU Registrador de Dados Endereço da Memória Contador de Programa Registrador de Instrução Operando 1 Operação 0 1 2 3 4 5 6 7 8 9 R0 R1 R2 R3 R4 Socrative 4 Registradores de Propósito Geral – ARM Cortex M0+ 32 Bits Normalmente usado com sistemas operacionais Algumas instruções (Thumb – 16 bits) só conseguem acessar esses registradores Guarda o endereço de retorno de uma função Indica o topo ou fundo do Stack Depende do modo de operação do processador Indica o endereço da instrução atual. Pode ser lido ou escrito. A escrita serve para fazer desvios (loops while, for, if) 5 Program Status Register (xPSR) • Formado por 3 registradores – Aplicação (APSR) – Contém flags do ALU (Bits 28-31) – Interrupção (IPSR) – Contém o número da ISR (Interrupt Service Routine) em execução (Bits 0-5) – Execução (EPSR) – Contém o bit T - estado do Thumb (Bit 24) 6 APSR • N (Bit 31) – Flag setado resultado Negativo • Z (Bit 30) – Flag setado resultado Zero ou de mesmo valor em uma comparação • C (Bit 29) – Flag setado “Carry” (vai 1) do resultado de soma • V (Bit 28) – Flag setado oVerflow do resultado de soma ou subtração 7 Operações com os Flags do PSR • ADC Rd, Rn, Op2 ;Rd=Rn+Op2+C Não atualiza flags • ADCS Rd, Rn, Op2 ; Rd=Rn+Op2+C Atualiza flags • ADD Rd, Rn, Op2 ;Rd=Rn+Op2 Não atualiza flags • ADDS Rd, Rn, Op2 ;Rd=Rn+Op2 Atualiza flags • AND Rd, Rn, Op2 ;Rd=Rn&Op2 Não atualiza flags • ANDS Rd, Rn, Op2 ;Rd=Rn&Op2 Atualiza flag • ASR Rd, Rm, Rn ;Rd=Rm>>Rn Não atualiza flags • ASRS Rd, Rm, Rn ;Rd=Rm>>Rn Não atualiza flags Outros – BIC/BICS, LSL/LSLS, LSR/LSRS, MOV/MOVS, ORN/ORNS, ORR/ORRS, ROR/RORS, RRX/RRXS, RSB/RSBS, SBC/SBCS, 8 Link Register LR (R14) • Guarda o valor do Program Counter (PC) quando uma função é chamada e permite o retorno da função para a próxima instrução a ser executada PSI3441 – Arquitetura de Sistemas Embarcados - Memória – RAM (Stack e Heap) e Flash (instruções/código, tabelas) 1 0 Memória no ARM Cortex M0+ Memória (Grande e Lenta) Registrador de Propósito Geral (Pequena e Rápida) C o n tr o le Operando 2 ALU Registrador de Dados Endereço da Memória Contador de Programa Registrador de Instrução Operando 1 Operação 0 1 2 3 4 5 6 7 8 9 R0 R1 R2 R3 R4 8 Bits 32 Bits Socrative 1 1 Memória no ARM Cortex M0+ 32 Bits 8 Bits 1 2 Tipo de dado e alocação na memória 1 3 Onde os dados são armazenados? Código 1 4 Onde os dados são armazenados? 0x0000 0000 0x1FFF F000 0x0001 FFFF 0x2000 3000 /* Highest address of the user mode stack */ _estack = 0x20003000; /* end of m_data */ __SP_INIT = _estack; /* Generate a link error if heap and stack don't fit into RAM */ __heap_size = 0x00; /* required amount of heap */ __stack_size = 0x0400; /* required amount of stack */ Definição do Stack e Heap no CodeWarrior Qual o valor do registrador SP ao ligar o µControlador? 1 5 Exemplo do ARM Cortex M0+ no CodeWarrior Obs.: Mais informação sobre como é feita a divisão de memória no arquivo .map da pasta FLASH no CW 0x0000 0000 0x1FFF F000 0x0001 FFFF 0x2000 3000 1 6 O que é o Stack? • LIFO – Last-in First-out • Armazenagem temporária – Dados locais – Endereços de retorno de funções – Passar parâmetros entre funções • Tamanho dos dados é pré-determinado • Acesso rápido • Gerenciamento de memória automático • Instruções Push e Pop Dados Existem só enquanto a função está sendo executada 1 7 Push e Pop • push {R1} STR R1,[R13] ;armazena R1 no stack, SUB R13,R13,#4 ;e decrementa Stack Pointer (R13) em 4 bytes • pop {R1} ADD R13,R13,#4 ; incrementa SP LDR R1, [R13] ;e carrega o valor do topo do stack para R1 SP SP SP SP SP SP SP SP SP SP (R13) 1 8 O que acontece? Declaração de vetores ou matrizes muito grandes char hugeArray[1000000000000000]; Operações Recursivas int foo(int x) { if (x <= 0) return x; return foo(x - 1); } Ou 1 9 Para que usar o Heap? • Armazenagem de dados – Variáveis globais • Não é gerenciada automaticamente • Alocação de memória é feita utilizando malloc() ou calloc() • Memória alocada pode ser redimensionada utilizando realloc() • É necessário desalocar a memória usando free() • Memória pode se tornar fragmentada PSI3441 – Arquitetura de Sistemas Embarcados 2017 - Instruções de Desvio 2 1 Branch (B) – Desvio incondicional • B <Rótulo> – Executa um desvio do fluxo sequencial das instruções – Rótulo aponta para um endereço a partir do qual o programa continuará, isto é, o endereço do rótulo é copiado no Program Counter (PC) – O endereço do desvio deve estar próximo (2 kb) 2 2 Branch (B) – Desvio incondicional Exemplo: MOV R0, #0 ; coloca 0 em R0 MAIN: ; Rótulo MAIN SUB SP, SP,#4 ; Decrementa Stack Pointer STR R0, [SP] ; Armazena R0 no Stack B FUNC ; Desvio para função FUNC. PC Endereço de FUNC MOV R1, #3 ; coloca 3 em R1 FUNC: ; Rótulo FUNC ADD R0, R0, #1 ; Soma 1 ao valor de R0 e armazena em R0 B MAIN ; Desvio para MAIN O que acontece com esse código? Qual o valor de R1? Stack Overflow !! R1? 2 3 Branch and Link (BL) – Desvio incondicional com link de retorno • BL <Rótulo> – Executa um desvio do fluxo sequencial das instruções – Rótulo aponta para um endereço a partir do qual o programa continuará, isto é, o endereço do rótulo é copiado no Program Counter (PC) – Antes do desvio, o endereço do PC é copiado para o Link Register (LR) – O endereço do desvio deve estar próximo (16 Mb) 2 4 Branch and Exchange (Bx) – Desvio incondicional • Bx Rn – Executa um desvio do fluxo sequencial das instruções – O registrador Rn aponta para um endereço a partir do qual o programa continuará, isto é, o endereço do Rn é copiado no Program Counter (PC) 2 5 Exemplo: BL e Bx O que acontece com esse código? Qual o valor de R1? Exemplo: MOV R0, #0 ; coloca 0 em R0 MAIN: ; Rótulo MAIN SUB SP, SP,#4 ; Decrementa Stack Pointer STR R0, [SP] ; Armazena R0 no Stack BL FUNC ; RL =PC e PC Endereço de FUNC MOV R1, #3 ; coloca 3 em R1 FUNC: ; Rótulo FUNC ADD R0, R0, #1 ; Soma 1 ao valor de R0 e armazena em R0 Bx RL ; Desvio para MAIN Erro – Falta de instrução!! R1=3 2 6 Exemplo: BL e Bx Exemplo: MOV R0, #0 ; coloca 0 em R0 MAIN: ; Rótulo MAIN SUB SP, SP,#4 ; Decrementa Stack Pointer STR R0, [SP] ; Armazena R0 no Stack BL FUNC ; RL =PC e PC Endereço de FUNC MOV R1, #3 ; coloca 3 em R1 LOOP: ; Rótulo LOOP B LOOP ; Loop infinito FUNC: ; Rótulo FUNC ADD R0, R0, #1 ; Soma 1 ao valor de R0 e armazena em R0 Bx RL ; Desvio para MAIN 2 7 Exercício • Comente cada linha do código e mostre como mudam os registradores e o stack ao executar este programa. Otimize o programa usando PUSH e POP. LDR R13,=0xFF8 LDR R0,=0x125 LDR R1,=0x144 MOV R2,#0x56 BL FUNC ADD R3,R0,R1 ADD R3,R3,R2LOOP: B LOOP FUNC: STR R0,[R13] SUB R13,R13,#4 STR R1,[R13] SUB R13,R13,#4 STR R2,[R13] SUB R13,R13,#4 MOV R0,#0 MOV R1,#0 MOV R2,#0 ADD R13,R13,#4 LDR R2,[R13] ADD R13,R13,#4 LDR R1,[R13] ADD R13,R13,#4 LDR R0,[R13] BX LR 2 8 Auxílio • R13 Stack Pointer (SP) • R14 Link Register (LR) • BL Program Counter (PC) = LR antes do desvio • Bx Rn Copia o valor de Rn para PC • push {R1} equivalente a: STR R1,[R13] SUB R13,R13,#4 • pop {R1} equivalente a: ADD R13,R13,#4 LDR R1, [R13] 2 9 Push e Pop realmente otimizam o código? • Quando ciclo de máquina cada instrução usa? • http://infocenter.arm.com/help/index.jsp?topic=/c om.arm.doc.set.cortexm/index.html
Compartilhar