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()
- Force ISR#1
- addr2 = pvPortMalloc()
- Force ISR#2
Task#2 (Priority 4):
- 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"
- different priorities
- different ISR preemption priorities
What can I do? Any idea?
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?
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)
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?
Our posts overlapped, looks like you just edited that.