Página 1 de 1

Exeção :HardFault_handler

MensagemEnviado: 20 Jun 2011 01:34
por davenir
Boa noite Amigos.

Estou com um probleminha em um LPC1766, tenho o programa abaixo, onde eu tenho a leitura de um acelerometro atravez do A/D e apos isso executo um calculo para determinar o angulo de inclinação do aceletrometro.

To da vez que o calculo vai ser executado acontece uma exeção: HardFault_handler. e o programa fica travado no vetor de exeção. Estou trabalhando com o complidador uViosin V4.12. o programa todo é escrito em C++;

Desculpe pela pessima identação mas este é meu primeiro tópico, a formatação se perdeu ao colar o código.


volatile unsigned long Cont15ms=0;
volatile unsigned long Cont1s=0;
volatile unsigned short Flag1s, Flag15ms;

extern "C"
{

void SysTick_Handler()
{
Cont15ms++;
if(Cont15ms>15)
{
Flag15ms=1;
Cont15ms=0;
}

Cont1s++;
if(Cont1s>1000)
{
Flag1s=1;
Cont1s=0;
}

}
}


extern "C"
{
void HardFault_Handler(void )//CPU fica travada neste ponto
{


}
}



int main(void)
{


unsigned int AnguloLimiteX=60,AnguloLimiteY=60;


unsigned int ContAmostra;
unsigned char teste[15];
unsigned int Cont1Seg=0x5000;
unsigned int ContADC=500;




FiltroInclinometroX=0;
FiltroInclinometroY=0;



LPCPort.ConfiguraPino(PIO0_27);
LPCPort.ConfigIOPin(PIO0_27,1);
LPCPort.EscrevePino(PIO0_27,1);

init_calibration_val_dir(32768000);

Sistema.ConfiguraCPUClock();

SysTick_Config(0x176FF);
LPCPort.ConfiguraPino(PIO2_06);
LPCPort.ConfigIOPin(PIO2_06,1);
LPCPort.EscrevePino(PIO2_06,1);


Display.InicializaLcd();
Display.SetBackLite(7);
Display.ChaveLCD(1);
Display.Clr(0x00);


LPCPort.EscrevePino(PIO2_06,0);


teste[0]='Y';
teste[1]=0;
Display.GDispPixStrAt(90,1,teste, 5,1);
teste[0]='X';
teste[1]=0;
Display.GDispPixStrAt(25,1,teste, 5,1);


Display.GDispPixStrAt(80,50,teste, 5,1);
Display.DesenhaRetangulo(64,1, 64,63,1);
Display.DesenhaRetangulo(1,48, 127,63,1);

while(1)
{


if (Flag1s==1)//Rotina executada a cada 1 segundo
{
MostraDataHora();
Flag1s=0;

FiltroInclinometroX+= (double)ADC.LeADC(1);
FiltroInclinometroY+= (double)ADC.LeADC(2);

FiltroInclinometroX*=0.0008056640625;//neste ponto acontece a exeçao e trava o programa
FiltroInclinometroY*=0.0008056640625;
FiltroInclinometroX-=1.65;
FiltroInclinometroY-=1.65;
FiltroInclinometroX/=0.462;
FiltroInclinometroY/=0.462;
FiltroInclinometroY=asin(FiltroInclinometroY);
FiltroInclinometroX=asin(FiltroInclinometroX);

FiltroInclinometroX*=57.295779513082320876798154814105;
FiltroInclinometroY*=57.295779513082320876798154814105;

FiltroInclinometroX+=1; //corrreção de hardware
FiltroInclinometroY-=3;

inttostr(teste,(int)FiltroInclinometroX,0x20);
Display.GDispPixStrAt(15,18,teste, 8,1);
inttostr(teste,(int)FiltroInclinometroY,0x20);
Display.GDispPixStrAt(80,18,teste, 8,1);


}

}
} :D :D

Re: Exeção :HardFault_handler

MensagemEnviado: 20 Jun 2011 01:43
por Rodrigo_P_A
davenir escreveu:Boa noite Amigos.

Estou com um probleminha em um LPC1766, tenho o programa abaixo, onde eu tenho a leitura de um acelerometro atravez do A/D e apos isso executo um calculo para determinar o angulo de inclinação do aceletrometro.

To da vez que o calculo vai ser executado acontece uma exeção: HardFault_handler. e o programa fica travado no vetor de exeção. Estou trabalhando com o complidador uViosin V4.12. o programa todo é escrito em C++;

Desculpe pela pessima identação mas este é meu primeiro tópico, a formatação se perdeu ao colar o código.


volatile unsigned long Cont15ms=0;
volatile unsigned long Cont1s=0;
volatile unsigned short Flag1s, Flag15ms;

extern "C"
{

void SysTick_Handler()
{
Cont15ms++;
if(Cont15ms>15)
{
Flag15ms=1;
Cont15ms=0;
}

Cont1s++;
if(Cont1s>1000)
{
Flag1s=1;
Cont1s=0;
}

}
}


extern "C"
{
void HardFault_Handler(void )//CPU fica travada neste ponto
{


}
}



int main(void)
{


unsigned int AnguloLimiteX=60,AnguloLimiteY=60;


unsigned int ContAmostra;
unsigned char teste[15];
unsigned int Cont1Seg=0x5000;
unsigned int ContADC=500;




FiltroInclinometroX=0;
FiltroInclinometroY=0;



LPCPort.ConfiguraPino(PIO0_27);
LPCPort.ConfigIOPin(PIO0_27,1);
LPCPort.EscrevePino(PIO0_27,1);

init_calibration_val_dir(32768000);

Sistema.ConfiguraCPUClock();

SysTick_Config(0x176FF);
LPCPort.ConfiguraPino(PIO2_06);
LPCPort.ConfigIOPin(PIO2_06,1);
LPCPort.EscrevePino(PIO2_06,1);


Display.InicializaLcd();
Display.SetBackLite(7);
Display.ChaveLCD(1);
Display.Clr(0x00);


LPCPort.EscrevePino(PIO2_06,0);


teste[0]='Y';
teste[1]=0;
Display.GDispPixStrAt(90,1,teste, 5,1);
teste[0]='X';
teste[1]=0;
Display.GDispPixStrAt(25,1,teste, 5,1);


Display.GDispPixStrAt(80,50,teste, 5,1);
Display.DesenhaRetangulo(64,1, 64,63,1);
Display.DesenhaRetangulo(1,48, 127,63,1);

while(1)
{


if (Flag1s==1)//Rotina executada a cada 1 segundo
{
MostraDataHora();
Flag1s=0;

FiltroInclinometroX+= (double)ADC.LeADC(1);
FiltroInclinometroY+= (double)ADC.LeADC(2);

FiltroInclinometroX*=0.0008056640625;//neste ponto acontece a exeçao e trava o programa
FiltroInclinometroY*=0.0008056640625;
FiltroInclinometroX-=1.65;
FiltroInclinometroY-=1.65;
FiltroInclinometroX/=0.462;
FiltroInclinometroY/=0.462;
FiltroInclinometroY=asin(FiltroInclinometroY);
FiltroInclinometroX=asin(FiltroInclinometroX);

FiltroInclinometroX*=57.295779513082320876798154814105;
FiltroInclinometroY*=57.295779513082320876798154814105;

FiltroInclinometroX+=1; //corrreção de hardware
FiltroInclinometroY-=3;

inttostr(teste,(int)FiltroInclinometroX,0x20);
Display.GDispPixStrAt(15,18,teste, 8,1);
inttostr(teste,(int)FiltroInclinometroY,0x20);
Display.GDispPixStrAt(80,18,teste, 8,1);


}

}
} :D :D



verifique o tamanho da HEAP consigurada no seu programa, geralmente no arquivo startup.

se você está usando C++ obrigatoriamente tem que usar alocação dinâmica, e deve estar dando falta de memória

Re: Exeção :HardFault_handler

MensagemEnviado: 20 Jun 2011 12:54
por davenir
Ja havia verificado a questão do heap, aumentei o valor para 0x1FFF, mas não resolveu. Verifiqui tambem a possibilidade de algum periférico não estar alimentado(no caso o AD e o SysTick), mas está tudo certo.

Poderia ser alguma coisa com as variaveis do tipo double que estou utilizando?

MensagemEnviado: 20 Jun 2011 14:20
por RobL
Verifique através do VECTPC o PC que causa a falha.

Note que aumentar a heap em certos casos piora, pois a heap nasce de baixo para cima e o stack de cima para baixo. A colisão destes pode ser o seu problema e dá exatamente essa falha (não é a única). Pode ter operações grandes demais.
Se for por aí, o jeito é reduzir suas alocações por códigos mais enxutos, incluindo tipos mais enxutos, porém, mais trabalhoso.

Pense no mundo real, nem sempre precisamos de números nos quais os instrumentos de medida não conseguem medir!!!

MensagemEnviado: 20 Jun 2011 19:09
por Silvio51
Eu experimentaria diminuir a Magnitude deste floats... nem sei como o compilador esta fazendo pra alocar isto...