Moderadores: 51, guest2003, Renie, gpenga
Byte meu_byte[ 1 ] ; // Ocupa 4 bytes
Byte meu_byte[ 2 ] ; // Ocupa 4 bytes
Byte meu_byte[ 3 ] ; // Ocupa 4 bytes
Byte meu_byte[ 4 ] ; // Ocupa 4 bytes
Byte meu_byte[ 5 ] ; // Ocupa 8 bytes
Byte meu_byte[ 6 ] ; // Ocupa 8 bytes
Byte meu_byte[ 7 ] ; // Ocupa 8 bytes
Byte meu_byte[ 8 ] ; // Ocupa 8 bytes
Byte meu_byte[ 9 ] ; // Ocupa 12 bytes
Byte meu_byte[ 25 ] ; // Ocupa 28 bytes
+---+---+---+---+
2000h | | | | |
+---+---+---+---+
2004h | | | | |
+---+---+---+---+
2008h | | | | |
+---+---+---+---+
200Ch | | | | |
+---+---+---+---+
2010h | | | | |
+---+---+---+---+
char var1 ;
short int var2 ;
short int var3 ;
long int var4 ;
Francesco escreveu:Uma informação importante para processadores de 32 bits é que não é possível fracionar endereços para uma palavra inteira. Explico, suponha a memória abaixo:
(cortei)
Francesco escreveu:Por isso é importante se preocupar na hora de alocar a memória. Colocar primeiramente as variáveis de 32 bits, em seguida as de 16 bits e terminar com as de 8 bits.
Uma informação importante para processadores de 32 bits é que não é possível fracionar endereços para uma palavra inteira. Explico, suponha a memória abaixo:
Code:
+---+---+---+---+
2000h | | | | |
+---+---+---+---+
2004h | | | | |
+---+---+---+---+
2008h | | | | |
+---+---+---+---+
200Ch | | | | |
+---+---+---+---+
2010h | | | | |
+---+---+---+---+
Quando você aloca as variáveis na seguinte sequência:
Code:
char var1 ;
short int var2 ;
short int var3 ;
long int var4 ;
O primeiro var1 fica no endereço 2000h, o segundo var2 fica no 2001h e ocupa o 2002h também. No entanto o var3 não fica no 2003h, pois ele não cabe na primeira palavra. Ele vai para 2004h e 2005h.
Var4 também não cabe após var3, então ele é alocado em 2008h.
Por isso é importante se preocupar na hora de alocar a memória. Colocar primeiramente as variáveis de 32 bits, em seguida as de 16 bits e terminar com as de 8 bits.
chipselect escreveu:Não existe nenhuma opção de alinhamento de memória nos compiladores para ARM?
unsigned int get_int(const unsigned int *ptr)
{
return *ptr;
}
ldr r0, [r0, #0]
bx lr
typedef struct __attribute__((packed))
{
unsigned int value;
} pqp;
unsigned int get_int(const pqp *ptr)
{
return ptr->value;
}
ldrb r3, [r0, #0]
ldrb r2, [r0, #1]
ldrb r1, [r0, #2]
orr r3, r3, r2, asl #8
ldrb r0, [r0, #3]
orr r3, r3, r1, asl #16
orr r0, r3, r0, asl #24
bx lr
Usuários navegando neste fórum: Bing [Bot] e 1 visitante