FreeRTOS Support Archive
The FreeRTOS support forum is used to obtain active support directly from Real
Time Engineers Ltd. In return for using our top quality software and services for
free, we request you play fair and do your bit to help others too! Sign up
to receive notifications of new support topics then help where you can.
This is a read only archive of threads posted to the FreeRTOS support forum.
The archive is updated every week, so will not always contain the very latest posts.
Use these archive pages to search previous posts. Use the Live FreeRTOS Forum
link to reply to a post, or start a new support thread.
[FreeRTOS Home] [Live FreeRTOS Forum] [FAQ] [Archive Top] [March 2016 Threads] Crash on vPortFreePosted by athos1984 on 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)
ISR#1:
- q1_xQueueReceiveFromISR(addr)
- Force ISR#2
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?
Thanks
j
Crash on vPortFreePosted by rtel on 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?
Crash on vPortFreePosted by athos1984 on March 20, 2016 Both queues are used to send/receive addresses of dynamically allocated objects (structures): xQueueCreate(16, sizeof(struct object *))
T1
struct object *o = pvPortMalloc(sizeof(struct object))
xQueueSend(q1, &o, portMAXDELAY)
struct object *i (global var)
ISR1
xQueueReceiveFromISR(q1, &i, &higherWoken)
ISR2
xQueueSendFromISR(q2, &i, &higherWoken)
T2
struct object *f
xQueueReceive(q2, &f, portMAXDELAY)
vPortFree(f)
Crash on vPortFreePosted by edwards3 on 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?
Crash on vPortFreePosted by edwards3 on March 20, 2016 Our posts overlapped, looks like you just edited that.
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|