2019-11-22 12:28:15 -05:00
Call function with external stack
=================================
Overview
--------
2022-07-25 06:40:31 -04:00
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 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
2022-07-25 06:40:31 -04:00
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.
2021-11-16 23:06:01 -05:00
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);
2022-07-25 06:40:31 -04:00
2019-11-22 12:28:15 -05:00
//Call the desired function using the macro helper:
2022-07-25 06:40:31 -04:00
esp_execute_shared_stack_function(printf_lock,
2020-03-12 01:59:53 -04:00
shared_stack,
8192,
external_stack_function);
2022-07-25 06:40:31 -04: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