vtrx escreveu:Eu sempre confundo ,quando vou analisar algum comportamento estranho no código, como o compilador separa alguns espaços de memória.
u16 Buf[100];
Quando uma rotina utiliza xx = Buff[0],o programa utilizou a posição 0 e 1,correto?
Então na verdade o programa utiliza de espaço em RAM 200 bytes,certo?
você está confundindo a arquitetura de 32 bits com os tipos de dados que podem ser manipulados pela CPU.
A arquitetura é de 32 bits, porém ele manipula 1 byte, 2 bytes (u16 ) ou 4 bytes ( u32 ou word ) cada um chama de um jeito, eu prefiro usar notação uint8_t uint16_t uint32_t etc...
Essa sua variável aí é de 16 bits, então usa 2 bytes, e o endereçamento de memória é por byte e não pelo tamanho da palavra ( 32 bits ) da arquitetura.
Agora algo interessante acontece, sugiro que você faça o teste abaixo:
- Código: Selecionar todos
void main()
{
volatile int i;
for ( ;; )
{
seta_pino();
for ( i=0;i<200;i++ ) {
}
zera_pino();
for ( i=0;i<200;i++ ) {
}
}
}
- Código: Selecionar todos
void main()
{
volatile uint8_t i;
for ( ;; )
{
seta_pino();
for ( i=0;i<200;i++ ) {
}
zera_pino();
for ( i=0;i<200;i++ ) {
}
}
}
Declare as rotinas seta_pino / zera_pino
Ligue o osciloscópio.
Rode um, depois o outro.
Acredito que o segundo código vai ser mais lento, devido a forma que a CPU trata dados com 32 bits e com menos bits, devido a arquitetura do processador.
A CPU trata o acesso à memória é diferente, quando acessamos dados de 8 bits/16bits/32bits .