mikestitt wrote on Tuesday, March 25, 2014:
Sorry if this is posted twice. It did not seem like my first post was submitted correctly,
so I’m trying to resubmit.
The FAQ: http://www.freertos.org/FAQHelp.html
States: "I get stuck on the line that starts for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd );
Likely causes include:
[…snip…]
Calling an API function from within a critical section or when the RTOS scheduler is suspended."
Can this prohibition be clarified to limit calls to API functions which might run the scheduler within taskENTER_CRITICAL() regions? That is, allow API functions that don’t run the scheduler?
To provide easy to use contracts between modules, I’d like to use lazy instantiation of communication
mechanisms like this:
:::c
xQueueHandle getValidAppQueue(void)
{
static xQueueHandle appStateQueueHandle = 0;
taskENTER_CRITICAL();
if (!appStateQueueHandle) {
appStateQueueHandle = xQueueCreate(1, sizeof( appStateQueueType));
}
taskEXIT_CRITICAL();
return appStateQueueHandle;
}
But the FAQ implies that by calling XQueueCreate within a critical region, I’m violating the FreeRTOS API.
-Thoughts?
-Mike