Definição de 16bits numa Array

Programação C em geral

Moderadores: 51, guest2003

Definição de 16bits numa Array

Mensagempor vtrx » 24 Fev 2021 09:50

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?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Definição de 16bits numa Array

Mensagempor cfreund » 24 Fev 2021 11:01

Se o uC for 8bits, é isso aí.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Definição de 16bits numa Array

Mensagempor denis » 24 Fev 2021 11:05

Bom dia

Os compiladores (no geral) geram um arquivo .map
Se você declarou este array não sendo local, vai conseguir ver ele no map, inclusive o tamanho dele em bytes e a posição na RAM.
denis
Byte
 
Mensagens: 257
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: Definição de 16bits numa Array

Mensagempor vtrx » 24 Fev 2021 11:23

cfreund escreveu:Se o uC for 8bits, é isso aí.

É o STM32F103.
Entendi o que voce disse.
É que o STM que estou usando tem 20k de ram,o código é simples e usa trêz Array,uma com 8100,outra com 1000 e uma com 800.
Se eu aumentar o valor da de 8100 mais uns 100 bytes,o compilador gera erro (Keil).
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Definição de 16bits numa Array

Mensagempor eletroinf » 24 Fev 2021 12:47

se for 16 bit, 8100*2 bytes, mais os outros espaços de memória que tu mencionou e possivelmente outros adicionais já preenchem os 20 k de memória. Além disso tem o espaço de memória reservado ao stack.
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Definição de 16bits numa Array

Mensagempor vtrx » 24 Fev 2021 13:02

eletroinf escreveu:se for 16 bit, 8100*2 bytes, mais os outros espaços de memória que tu mencionou e possivelmente outros adicionais já preenchem os 20 k de memória. Além disso tem o espaço de memória reservado ao stack.

Mesmo sendo um ARM32 a RAM seria de 8 em 8 bits?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Definição de 16bits numa Array

Mensagempor eletroinf » 24 Fev 2021 13:09

Veja na primeira página do datasheet...
Sim, são posições de 8 bit.
Você não está autorizado a ver ou baixar esse anexo.
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Definição de 16bits numa Array

Mensagempor vtrx » 24 Fev 2021 14:11

eletroinf escreveu:Veja na primeira página do datasheet...
Sim, são posições de 8 bit.

Então esta explicado o limite de RAM no código,caso minguem conteste :mrgreen:
Onde no datasheet especifica que é de 8 em 8?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Definição de 16bits numa Array

Mensagempor Rodrigo_P_A » 24 Fev 2021 19:16

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 .
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Definição de 16bits numa Array

Mensagempor vtrx » 24 Fev 2021 23:31

Olá.
Achei que internamente a memória era endereçada com um range maior que 8 bits por causa da arquitetura e por ser interna.
Esses comentários me ajudaram a entender porque os 20K de RAM ,no programa,chegaram no limite 'implicitamente'.
Com esse conceito acho que vai ser mais fácil implementar o acesso a memória externa RAM SPI .
Utilizando uma RAM externa SPI,a velocidade de acesso vai ser muito inferior ou não em relação a interna ao micro?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Definição de 16bits numa Array

Mensagempor denis » 25 Fev 2021 08:46

vtrx escreveu:Olá.
Achei que internamente a memória era endereçada com um range maior que 8 bits por causa da arquitetura e por ser interna.
Esses comentários me ajudaram a entender porque os 20K de RAM ,no programa,chegaram no limite 'implicitamente'.
Com esse conceito acho que vai ser mais fácil implementar o acesso a memória externa RAM SPI .
Utilizando uma RAM externa SPI,a velocidade de acesso vai ser muito inferior ou não em relação a interna ao micro?


Com certeza acessar uma memória externa vai demorar mais do que a interna.

Veja o exemplo abaixo, lendo 8 bytes de uma Flash externa via SPI com clock de 600kHz.
Tudo isso gasta perto de 192us.

https://ibb.co/g7Y75WB
Você não está autorizado a ver ou baixar esse anexo.
denis
Byte
 
Mensagens: 257
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x