Página 1 de 1

Definição de 16bits numa Array

MensagemEnviado: 24 Fev 2021 09:50
por vtrx
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?

Re: Definição de 16bits numa Array

MensagemEnviado: 24 Fev 2021 11:01
por cfreund
Se o uC for 8bits, é isso aí.

Re: Definição de 16bits numa Array

MensagemEnviado: 24 Fev 2021 11:05
por denis
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.

Re: Definição de 16bits numa Array

MensagemEnviado: 24 Fev 2021 11:23
por vtrx
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).

Re: Definição de 16bits numa Array

MensagemEnviado: 24 Fev 2021 12:47
por eletroinf
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.

Re: Definição de 16bits numa Array

MensagemEnviado: 24 Fev 2021 13:02
por vtrx
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?

Re: Definição de 16bits numa Array

MensagemEnviado: 24 Fev 2021 13:09
por eletroinf
Veja na primeira página do datasheet...
Sim, são posições de 8 bit.

Re: Definição de 16bits numa Array

MensagemEnviado: 24 Fev 2021 14:11
por vtrx
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?

Re: Definição de 16bits numa Array

MensagemEnviado: 24 Fev 2021 19:16
por Rodrigo_P_A
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 .

Re: Definição de 16bits numa Array

MensagemEnviado: 24 Fev 2021 23:31
por vtrx
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?

Re: Definição de 16bits numa Array

MensagemEnviado: 25 Fev 2021 08:46
por denis
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