Quantcast
Channel: Forums - Recent Threads
Viewing all articles
Browse latest Browse all 262198

malloc problem during ISR

$
0
0

Hi;

I have a ISR that used to collect data from the SCI interface RX data; my ISR should collect packet of data, and if it a valid one, allocate a memory for the packet, so the "main" can parse the incoming the data and then free the memory….

The problem is that when the first time the ISR is running it really allocates the memory space, but in the second time malloc return NULL pointer.

Firstly I thought that I don’t have enough space in the heap, so I resize it to 0x800, but did doesn't solve my problem…

So what do you think? What seems to be the thing I do thaw wrong way?

 

P.S:

A part of my code:

interruptvoid SciaRxIsr(void)

{

  volatile RxPacket *rx_packet;

  Uint16    rx_byte;

 

  staticchar rx_buffer[MAX_PACKET_SIZE];

  staticint  rx_buffer_index = 0;

  static Rx_Fsm fsm_curr_state = Wait_For_Stx_State;

 

  rx_byte = SciaRegs.SCIRXBUF.bit.RXDT;

  // if no frame error occurred and no parity error occurred

  if((SciaRegs.SCIRXBUF.bit.SCIFFFE & SciaRegs.SCIRXBUF.bit.SCIFFPE) == 0)

  {

    // Verifying ETX at the end of the packet

    caseWait_For_Etx_State:

    {

        if(rx_byte == ETX) // Read ETX                                                         

        {

          //add rx buffer to linked list

          rx_packet = (RxPacket*)malloc(sizeof(RxPacket));

          if(rx_packet == NULL)

          {   

                // Node creation failed

                fsm_curr_state = Wait_For_Stx_State;

          }

          else

          {

                // Allocate space for the command data

                rx_packet->command_data = (char*)malloc(sizeof(rx_buffer[0]));

                if(rx_packet->command_data == NULL)

                {

                  // Node creation failed

                  fsm_curr_state = Wait_For_Stx_State;

                }

        }

        SciaRegs.SCIFFRX.bit.RXFFOVRCLR =  1;               // Clear Overflow flag

        SciaRegs.SCIFFRX.bit.RXFFINTCLR =  1;       // Clear Interrupt flag

        PieCtrlRegs.PIEACK.all          |= 0x100;   // Issue PIE ack

}

 


Viewing all articles
Browse latest Browse all 262198

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>