2019-11-22 12:28:15 -05:00
|
|
|
Call function with external stack
|
|
|
|
=================================
|
|
|
|
|
|
|
|
Overview
|
|
|
|
--------
|
|
|
|
|
|
|
|
A given function can be executed with a user allocated stack space
|
|
|
|
which is independent of current task stack, this mechanism can be
|
|
|
|
used to save stack space wasted by tasks which call a common function
|
|
|
|
with intensive stack usage such as `printf`. The given function can
|
2020-03-12 01:59:53 -04:00
|
|
|
be called inside the shared stack space which is a callback function
|
|
|
|
deferred by calling :cpp:func:`esp_execute_shared_stack_function`,
|
|
|
|
passing that function as parameter
|
2019-11-22 12:28:15 -05:00
|
|
|
|
|
|
|
Usage
|
|
|
|
-----
|
|
|
|
|
2021-11-16 23:06:01 -05:00
|
|
|
:cpp:func:`esp_execute_shared_stack_function` takes four arguments:
|
2019-11-22 12:28:15 -05:00
|
|
|
|
2021-11-16 23:06:01 -05:00
|
|
|
- a mutex object allocated by the caller, which is used to protect if the same function shares its allocated stack
|
|
|
|
- a pointer to the top of stack used for that fuction
|
|
|
|
- the size of stack in bytes
|
|
|
|
- a pointer to the shared stack function
|
|
|
|
|
|
|
|
The user defined function will be deferred as a callback
|
|
|
|
and can be called using the user allocated space without
|
|
|
|
taking space from current task stack.
|
|
|
|
|
|
|
|
The usage may look like the code below:
|
2019-11-22 12:28:15 -05:00
|
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
|
2020-03-12 01:59:53 -04:00
|
|
|
void external_stack_function(void)
|
|
|
|
{
|
|
|
|
printf("Executing this printf from external stack! \n");
|
|
|
|
}
|
|
|
|
|
2021-11-16 23:06:01 -05:00
|
|
|
//Let's suppose we want to call printf using a separated stack space
|
|
|
|
//allowing the app to reduce its stack size.
|
2019-11-22 12:28:15 -05:00
|
|
|
void app_main()
|
|
|
|
{
|
|
|
|
//Allocate a stack buffer, from heap or as a static form:
|
|
|
|
portSTACK_TYPE *shared_stack = malloc(8192 * sizeof(portSTACK_TYPE));
|
2019-12-20 11:30:30 -05:00
|
|
|
assert(shared_stack != NULL);
|
2019-11-22 12:28:15 -05:00
|
|
|
|
|
|
|
//Allocate a mutex to protect its usage:
|
|
|
|
SemaphoreHandle_t printf_lock = xSemaphoreCreateMutex();
|
2019-12-20 11:30:30 -05:00
|
|
|
assert(printf_lock != NULL);
|
2019-11-22 12:28:15 -05:00
|
|
|
|
|
|
|
//Call the desired function using the macro helper:
|
2020-03-12 01:59:53 -04:00
|
|
|
esp_execute_shared_stack_function(printf_lock,
|
|
|
|
shared_stack,
|
|
|
|
8192,
|
|
|
|
external_stack_function);
|
|
|
|
|
2019-12-20 11:23:47 -05:00
|
|
|
vSemaphoreDelete(printf_lock);
|
|
|
|
free(shared_stack);
|
2019-11-22 12:28:15 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
.. _esp-call-with-stack-basic_usage:
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
|
2019-11-12 22:46:16 -05:00
|
|
|
.. include-build-file:: inc/esp_expression_with_stack.inc
|
2019-11-22 12:28:15 -05:00
|
|
|
|
|
|
|
|