Página 1 de 1

Minha Falta de atenção

MensagemEnviado: 25 Jan 2014 16:48
por vtrx
Estou postando uma besteira de falta de atenção minha.
4 horas sem saber porque uma certa rotina trava o sistema quando carregava muitos bytes.
Era só comentar a rotina e funcionava normal.
Pensei que era o tamanho do Buffer na RAM,mas era apenas 4608 bytes num micro com 20k.
As vezes a rotina funcionava 'pela metade',as vezes travava tudo.
Achei que era a temporização do SD CARD,mas testando a velocidade com poucos bytes,gravava e lia normalmente.
Oque podia ser?
Não tenho experiencia com SD CARDs,então podia ser qualquer coisa no programa.
Foi aí que depois de muitas horas(que Noob eu..)percebí algo.
Veja uma das rotinas que ficava 'doida';
Código: Selecionar todos
  unsigned char SD_Image_1[511];
   u8 Imagem_Buf[4607];
   u32 sd_size;
......
void Grava_SD(void)
   {
   u8  i,m;
   u16  Bloco;
   u16 Ponto;

   Bloco = 80;
   Ponto = 0;

for(m=0;m<9;m++)
   {
       for(i=0;i<512;i++)
         {
            SD_Image_1[i] = picture[Ponto];
            Ponto++;
         }
      SD_WriteSingleBlock(Bloco,SD_Image_1);
      Bloco++;
   }

   }
//................

Fácil o problema,não é?
O compilador(Keil)não me alertou em nada...

Re: Minha Falçta de atenção

MensagemEnviado: 25 Jan 2014 19:02
por Rodrigo_P_A
Olhando rápido a variável i é de 1 byte é vc colocou pra contar até 512

Re: Minha Falçta de atenção

MensagemEnviado: 25 Jan 2014 20:48
por vtrx
Então Rodrigo,tive que vasculhar todo o código até chegar a este erro.
Isto foi o suficiente para o programa se perder.
O keil poderia dar um aviso,tipo 'out of range'.
Agora eu sei porque na maioria dos códigos,as variáveis são declaradas individualmente,mesmo sendo do mesmo tipo.
Isso ajuda a evitar erros.

Re: Minha Falçta de atenção

MensagemEnviado: 26 Jan 2014 07:11
por andre_luis
Você certamente já deve ter conferido isso, mas não custa nada confirmar, mas verificou se os Warnings e Erros estão desabilitados ?


+++

Re: Minha Falçta de atenção

MensagemEnviado: 26 Jan 2014 09:09
por cfreund
Muito difícil algum compilador alertar isso.

Sua rotina faz apenas um teste: "i < 512"

Se vc fizer "i = 512", é bem provável que irá alertar.

Re: Minha Falçta de atenção

MensagemEnviado: 26 Jan 2014 09:11
por cfreund
Tem mais um erro no seu código:

unsigned char SD_Image_1[512];

Você definiu um array com 511 bytes (0~510). No for você está escrevendo de 0 até 511.

Re: Minha Falçta de atenção

MensagemEnviado: 26 Jan 2014 09:49
por tcpipchip
Também você teve falta a atenção ao escrever o título do tópico :)

Re: Minha Falçta de atenção

MensagemEnviado: 26 Jan 2014 11:31
por vtrx
unsigned char SD_Image_1[512];

Você definiu um array com 511 bytes (0~510). No for você está escrevendo de 0 até 511.


A Imagem só é apresentada corretamente se eu definir SD_Image_1 com [511],pois no looping ,SD_Image_1, começa com 0 até 511(i<512 = 511),isto são 512 bytes,um bloco do SD, pois zero é a primeira posição.

As opções no Keil estão habilitadas e posso ver os Warnning,menos da variavel.
Outro comportamento que ajudou a me confundir mais ainda,é que pela variavel estar definida errada,a sequencia do programa não 'obedecia' a sequencia de erro,tipo,a rotina que causava o travamento,era a quinta rotina visual a ser executada no sistema,mas ela trava o sistema logo no inicio.

Também você teve falta a atenção ao escrever o título do tópico :)

Estava com sono,e meu dedo estava inchado de teclar e por isso pressionou o L e Ç juntos...
ADM,altera pra mim!

Re: Minha Falçta de atenção

MensagemEnviado: 26 Jan 2014 11:55
por cfreund
vtrx escreveu:A Imagem só é apresentada corretamente se eu definir SD_Image_1 com [511],pois no looping ,SD_Image_1, começa com 0 até 511(i<512 = 511),isto são 512 bytes,um bloco do SD, pois zero é a primeira posição.


Pense mais um pouquinho!

Você está escrevendo 512 bytes em um array de 511 bytes.

Você não tem que mexer no loop. Apenas altere o tamanho do array para 512, como eu te disse. Isso não irá fazer seu programa parar de funcionar, irá prevenir erros, pois você vai deixar de sobrescrever outra variável.

Re: Minha Falta de atenção

MensagemEnviado: 26 Jan 2014 13:06
por vtrx
Você está escrevendo 512 bytes em um array de 511 bytes.


Definr[511],eu acesso a posição 0 e a 511,pois está definida em 511 e a posição variavel[511]é acessada,logo quanto é de 0 a 511,contando com 0?
Se eu definir 512,não estarei disperdiçando 1 byte??

Um byte para microcontrolador é significante.

Re: Minha Falta de atenção

MensagemEnviado: 26 Jan 2014 18:05
por andre_luis
vtx,


Essa declaração, cria um array de 0 a 510:

Código: Selecionar todos
     unsigned char SD_Image_1[511];


Esse comando abaixo, acessa a variável acima do endereço 0 ao 511:

Código: Selecionar todos
            for(i=0;i<512;i++)
               {
               SD_Image_1[i] = picture[Ponto];


Ou seja, conforme o Cláudio mencionou acima, vai haver uma violação do byte seguinte ao array.


+++

Re: Minha Falta de atenção

MensagemEnviado: 26 Jan 2014 19:27
por vtrx
Ja resolví os dois problemas(variavel de tamanho errado(i) e conversão de numero para texto para GLCD(printf)).
Pode apagar oque achar conveniente...