Hi JuroV,
I still have the same problem, I don't know what is going on whit my program. I had a lot of tasks:
const TASK_TEMPLATE_STRUCT MQX_template_list[] =
{
//Task number, Entry point, Stack, Pri, String, Auto?
//{ 1, HVAC_Task, 1100, 9, "HVAC", MQX_AUTO_START_TASK},
// { 2, Switch_Task, 600, 10, "Switch", MQX_AUTO_START_TASK},
// { 3, Shell_Task, 1400, 12, "Shell", MQX_AUTO_START_TASK},
// { 4, Logging_task, 1900, 11, "Logging", MQX_AUTO_START_TASK},
// { 5, USB_task, 1700L, 8L, "USB", MQX_AUTO_START_TASK},
// { 6, Tx_Task, 900L, 7L, "TX task", 0, 0, 0},
// { 7, Rx_Task, 900L, 7L, "RX task", 0, 0, 0},
// { 8, Main_Task, 800L, 8L, "Main task", MQX_AUTO_START_TASK},
// { 9, ADC_task, 800L, 8L, "ADC Init", MQX_AUTO_START_TASK},
{10, GPT_task, 2000L, 10L, "GPT Init", MQX_AUTO_START_TASK},
// {11, DMA_task, 600L, 8L, "DMA Init", MQX_AUTO_START_TASK},
// { 12, QSPI_task, 2000L, 10L, "QSPI Init", MQX_AUTO_START_TASK},
// { 13, CFM_task, 1000L, 10L, "CFM Init", MQX_AUTO_START_TASK},
{ 0, 0, 0, 0, 0, 0}
};
As you can see, I commented most of them to leave only GPT_task active. The problem continues, therefore I believe the this task is causing it.
I believe the interrupts from GPT module are causing the problem because when the application crashes the "MQX Check for errors"shows me there has been an overflow from the Interrupt Stack...
First I tried to increase the amount of stack for interrupts but I stoped since I don't know how could a few interrupts consume all of the stack available, specially when I have empty ISR.
This is the task code:
void GPT_task(){ /* Body */ indice = 0; //uint_8 algo = 0; GPT_Initialize( 0, (pointer)MY_GPT_C0F_ISR); /* GPT_Initialize( 1, (pointer)MY_GPT_C1F_ISR); GPT_Initialize( 2, (pointer)MY_GPT_C2F_ISR); GPT_Initialize( 3, (pointer)MY_GPT_C3F_ISR);*/ for(indice = 0; indice < 26 ;indice++) key[indice ] = 0x55; indice = 0; while(1) { if(indice >= 26) { printf("Tarjeta Leida"); indice = 0; } _time_delay(10); }} /* EndBody */ This is the Initialize function (which I wrote) I am calling from MQX libraries:
uint_32 GPT_Initialize( uint_8 tim_num, pointer isr){ /* Body */ uint_8 algo; volatile PSP_INTERRUPT_TABLE_INDEX index; VMCF5225_STRUCT_PTR reg_ptr = _PSP_GET_IPSBAR(); //Controlar registros del Micro volatile GPT_REG_STRUCT_PTR gpt_reg_ptr; // Estructura para controlar GPT void (_CODE_PTR_ result)(pointer); uint_32 return_code = GPT_OK; gpt_reg_ptr = (pointer)(&((VMCF5225_STRUCT_PTR)_PSP_GET_IPSBAR())->GPT); gpt_reg_ptr->GPTSCR1 &= ~MCF_GPT_GPTSCR1_GPTEN; //Detener el timer gpt_reg_ptr->GPTPACTL &= 0xFC; gpt_reg_ptr->GPTSCR2 &= 0x7F; switch(tim_num) { case(0): reg_ptr->GPIO.PTAPAR = 0x55;//Todos funcion primaria gpt_reg_ptr->GPTDDR &= ~0xF1; gpt_reg_ptr->GPTIOS &= ~0xF1; gpt_reg_ptr->GPTSCR1 = 0x00; gpt_reg_ptr->GPTCTL2 |= MCF_GPT_GPTCTL2_EDG0A; gpt_reg_ptr->GPTCTL2 &= ~MCF_GPT_GPTCTL2_EDG0B; gpt_reg_ptr->GPTSCR2 = MCF_GPT_GPTSCR2_PR(1); reg_ptr->GPIO.PTAPAR &= ~0x03; reg_ptr->GPIO.PTAPAR |= MCF_GPIO_PTAPAR_PTAPAR0(1); result = _int_install_isr (MCF5225_INT_TIMA_C0F, (void (_CODE_PTR_))isr, (pointer)gpt_reg_ptr); if(result == NULL) { return_code = _task_get_error(); } algo = 0; while(algo < 0xFF) { algo++; } if ( _mcf5225_int_init(MCF5225_INT_TIMA_C0F, GPT_C0F_INT_LEVEL, GPT_C0F_INT_SUBLEVEL, TRUE) != MQX_OK) { return (GPT_INT_ENABLE_FAILED); } gpt_reg_ptr->GPTIE &= 0x0F; gpt_reg_ptr->GPTIE |= MCF_GPT_GPTIE_CI0; break; case(1): reg_ptr->GPIO.PTAPAR = 0x55; gpt_reg_ptr->GPTDDR &= ~0xF2; gpt_reg_ptr->GPTIOS &= ~0xF2; gpt_reg_ptr->GPTSCR1 = 0x00; gpt_reg_ptr->GPTCTL2 |= MCF_GPT_GPTCTL2_EDG1A; gpt_reg_ptr->GPTCTL2 &= ~MCF_GPT_GPTCTL2_EDG1B; gpt_reg_ptr->GPTSCR2 = MCF_GPT_GPTSCR2_PR(1); reg_ptr->GPIO.PTAPAR &= ~0x0C; reg_ptr->GPIO.PTAPAR |= MCF_GPIO_PTAPAR_PTAPAR1(1); result = _int_install_isr (MCF5225_INT_TIMA_C1F, (void (_CODE_PTR_))isr, (pointer)gpt_reg_ptr); if(result == NULL) { return_code = _task_get_error(); } if ( _mcf5225_int_init(MCF5225_INT_TIMA_C1F, GPT_C1F_INT_LEVEL, GPT_C1F_INT_SUBLEVEL, TRUE) != MQX_OK) { return (GPT_INT_ENABLE_FAILED); } gpt_reg_ptr->GPTIE &= 0x0F; gpt_reg_ptr->GPTIE |= MCF_GPT_GPTIE_CI1; break; case(2): reg_ptr->GPIO.PTAPAR = 0x55; gpt_reg_ptr->GPTDDR &= ~0xF4; gpt_reg_ptr->GPTIOS &= ~0xF4; gpt_reg_ptr->GPTSCR1 = 0x00; gpt_reg_ptr->GPTCTL2 |= MCF_GPT_GPTCTL2_EDG2A; gpt_reg_ptr->GPTCTL2 &= ~MCF_GPT_GPTCTL2_EDG2B; gpt_reg_ptr->GPTSCR2 = MCF_GPT_GPTSCR2_PR(1); reg_ptr->GPIO.PTAPAR &= ~0x30; reg_ptr->GPIO.PTAPAR |= MCF_GPIO_PTAPAR_PTAPAR2(1); result = _int_install_isr (MCF5225_INT_TIMA_C2F, (void (_CODE_PTR_))isr, (pointer)gpt_reg_ptr); if(result == NULL) { return_code = _task_get_error(); } if ( _mcf5225_int_init(MCF5225_INT_TIMA_C2F, GPT_C2F_INT_LEVEL, GPT_C2F_INT_SUBLEVEL, TRUE) != MQX_OK) { return (GPT_INT_ENABLE_FAILED); } gpt_reg_ptr->GPTIE &= 0x0F; gpt_reg_ptr->GPTIE |= MCF_GPT_GPTIE_CI2; break; case(3): reg_ptr->GPIO.PTAPAR = 0x55; gpt_reg_ptr->GPTDDR &= ~0xF8; gpt_reg_ptr->GPTIOS &= ~0xF8; gpt_reg_ptr->GPTSCR1 = 0x00; gpt_reg_ptr->GPTCTL2 |= MCF_GPT_GPTCTL2_EDG3A; gpt_reg_ptr->GPTCTL2 &= ~MCF_GPT_GPTCTL2_EDG3B; gpt_reg_ptr->GPTSCR2 = MCF_GPT_GPTSCR2_PR(1); reg_ptr->GPIO.PTAPAR &= ~0xC0; reg_ptr->GPIO.PTAPAR |= MCF_GPIO_PTAPAR_PTAPAR3(1); result = _int_install_isr (MCF5225_INT_TIMA_C3F, (void (_CODE_PTR_))isr, (pointer)gpt_reg_ptr); if(result == NULL) { return_code = _task_get_error(); } if ( _mcf5225_int_init(MCF5225_INT_TIMA_C3F, GPT_C3F_INT_LEVEL, GPT_C3F_INT_SUBLEVEL, TRUE) != MQX_OK) { return (GPT_INT_ENABLE_FAILED); } gpt_reg_ptr->GPTIE &= 0x0F; gpt_reg_ptr->GPTIE |= MCF_GPT_GPTIE_CI3; break; } if ( _mcf5225_int_init(MCF5225_INT_TIMA_TOF, GPT_C3F_INT_LEVEL, GPT_C3F_INT_SUBLEVEL, FALSE) != MQX_OK) { return (GPT_INT_ENABLE_FAILED); } if ( _mcf5225_int_init(MCF5225_INT_TIMA_PAIF, GPT_C3F_INT_LEVEL, GPT_C3F_INT_SUBLEVEL, FALSE) != MQX_OK) { return (GPT_INT_ENABLE_FAILED); } if ( _mcf5225_int_init(MCF5225_INT_TIMA_PAOVF, GPT_C3F_INT_LEVEL, GPT_C3F_INT_SUBLEVEL, FALSE) != MQX_OK) { return (GPT_INT_ENABLE_FAILED); } gpt_reg_ptr->GPTFLG2 |= MCF_GPT_GPTFLG2_TOF; gpt_reg_ptr->GPTSCR2 &= ~MCF_GPT_GPTSCR2_TCRE; gpt_reg_ptr->GPTSCR1 |= MCF_GPT_GPTSCR1_GPTEN;//Iniciar el timer return return_code;} /* Endbody */ Well, I hope you can help me solve this since I am running out of ideas.
Best Regards