Exeção :HardFault_handler

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Exeção :HardFault_handler

Mensagempor davenir » 20 Jun 2011 01:34

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
davenir
 
Mensagens: 2
Registrado em: 17 Nov 2006 11:37
Localização: Caxias do Sul /RS

Re: Exeção :HardFault_handler

Mensagempor Rodrigo_P_A » 20 Jun 2011 01:43

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

Re: Exeção :HardFault_handler

Mensagempor davenir » 20 Jun 2011 12:54

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?
davenir
 
Mensagens: 2
Registrado em: 17 Nov 2006 11:37
Localização: Caxias do Sul /RS

Mensagempor RobL » 20 Jun 2011 14:20

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!!!
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor Silvio51 » 20 Jun 2011 19:09

Eu experimentaria diminuir a Magnitude deste floats... nem sei como o compilador esta fazendo pra alocar isto...
Silvio51
Byte
 
Mensagens: 383
Registrado em: 02 Nov 2006 14:04
Localização: Brasil


Voltar para ARM

Quem está online

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

x