Crash on vPortFree

athos1984 wrote on Sunday, March 20, 2016:

Hi all,

I’m facing a crash (HardFault) into my project within pvPortMalloc/vPortFree functions.
heap_4 management, queues 16 in length, latest stable FreeRTOS Release.

Task#1 (Priority 2):

  • addr = pvPortMalloc()
  • q1_xQueueSend(addr)
  • Force ISR#1
  • addr2 = pvPortMalloc()
  • vPortFree(addr2)


  • q1_xQueueReceiveFromISR(addr)
  • Force ISR#2


  • q2_xQueueSendFromISR(addr)

Task#2 (Priority 4):

  • top:
  • q2_xQueueReceive(addr)
  • vPortFree(addr)
  • goto top

Some debug infos:

  • No crash if code runs @ lower MCU speed (64MHz vs 180MHz, STM32F1 vs STM32F4)
  • No crash removing vPortFree from Task#2
  • No crash if vPortFree inside Task#2 is delayed after xQueueReceive (by printf, or by vTaskDelay, or other)
  • configASSERT inside pvPortMalloc tells me that “blocks are NOT aligned to the required number of bytes”
  • configASSERT inside vPortFree tells me that “block is NOT actually allocated”

I tried:

  • different priorities
  • different ISR preemption priorities

What can I do? Any idea?

rtel wrote on Sunday, March 20, 2016:

It is difficult to say what could be wrong without seeing how the queue is created and how the addr is passed into the queue. Is the queue created to hold pointers? Are you reading the value out of the queue into a pointer?

athos1984 wrote on Sunday, March 20, 2016:

Both queues are used to send/receive addresses of dynamically allocated objects (structures): xQueueCreate(16, sizeof(struct object *))

struct object *o = pvPortMalloc(sizeof(struct object))
xQueueSend(q1, &o, portMAXDELAY)

struct object *i (global var)
xQueueReceiveFromISR(q1, &i, &higherWoken)
xQueueSendFromISR(q2, &i, &higherWoken)

struct object *f
xQueueReceive(q2, &f, portMAXDELAY)

edwards3 wrote on Sunday, March 20, 2016:

Maybe just a typing error in your post or sourceforge formatting, but shouldnt that be

xQueueCreate(16, sizeof(struct object*)) // with *

if sending and receiving addresses?

edwards3 wrote on Sunday, March 20, 2016:

Our posts overlapped, looks like you just edited that.