Minha Falta de atenção

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Minha Falta de atenção

Mensagempor vtrx » 25 Jan 2014 16:48

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...
Editado pela última vez por andre_luis em 26 Jan 2014 12:13, em um total de 1 vez.
Razão: correção do título
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Minha Falçta de atenção

Mensagempor Rodrigo_P_A » 25 Jan 2014 19:02

Olhando rápido a variável i é de 1 byte é vc colocou pra contar até 512
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Minha Falçta de atenção

Mensagempor vtrx » 25 Jan 2014 20:48

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

Re: Minha Falçta de atenção

Mensagempor andre_luis » 26 Jan 2014 07:11

Você certamente já deve ter conferido isso, mas não custa nada confirmar, mas verificou se os Warnings e Erros estão desabilitados ?


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Minha Falçta de atenção

Mensagempor cfreund » 26 Jan 2014 09:09

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.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Minha Falçta de atenção

Mensagempor cfreund » 26 Jan 2014 09:11

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.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Minha Falçta de atenção

Mensagempor tcpipchip » 26 Jan 2014 09:49

Também você teve falta a atenção ao escrever o título do tópico :)
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: Minha Falçta de atenção

Mensagempor vtrx » 26 Jan 2014 11:31

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

Re: Minha Falçta de atenção

Mensagempor cfreund » 26 Jan 2014 11:55

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.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Minha Falta de atenção

Mensagempor vtrx » 26 Jan 2014 13:06

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

Re: Minha Falta de atenção

Mensagempor andre_luis » 26 Jan 2014 18:05

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.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Minha Falta de atenção

Mensagempor vtrx » 26 Jan 2014 19:27

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


Voltar para ARM

Quem está online

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

x