2019-11-22 14:28:15 -03:00
Call function with external stack
=================================
Overview
--------
2022-07-25 18:40:31 +08: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 14:28:15 -03:00
Usage
-----
2021-11-17 09:36:01 +05:30
:cpp:func: `esp_execute_shared_stack_function` takes four arguments:
2019-11-22 14:28:15 -03:00
2021-11-17 09:36:01 +05:30
- a mutex object allocated by the caller, which is used to protect if the same function shares its allocated stack
2023-01-26 17:02:39 +01:00
- a pointer to the top of stack used for that function
2021-11-17 09:36:01 +05:30
- the size of stack in bytes
- a pointer to the shared stack function
2022-07-25 18:40:31 +08: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-17 09:36:01 +05:30
The usage may look like the code below:
2019-11-22 14:28:15 -03:00
.. code-block :: c
2020-03-12 02:59:53 -03:00
void external_stack_function ( void )
{
printf ( " Executing this printf from external stack! \n " ) ;
}
2021-11-17 09:36:01 +05:30
//Let's suppose we want to call printf using a separated stack space
//allowing the app to reduce its stack size.
2019-11-22 14:28:15 -03:00
void app_main ( )
{
//Allocate a stack buffer, from heap or as a static form:
2023-07-28 14:55:13 +08:00
StackType_t * shared_stack = malloc ( 8192 * sizeof ( StackType_t ) ) ;
2019-12-20 13:30:30 -03:00
assert ( shared_stack ! = NULL ) ;
2019-11-22 14:28:15 -03:00
//Allocate a mutex to protect its usage:
SemaphoreHandle_t printf_lock = xSemaphoreCreateMutex ( ) ;
2019-12-20 13:30:30 -03:00
assert ( printf_lock ! = NULL ) ;
2022-07-25 18:40:31 +08:00
2019-11-22 14:28:15 -03:00
//Call the desired function using the macro helper:
2022-07-25 18:40:31 +08:00
esp_execute_shared_stack_function ( printf_lock ,
2020-03-12 02:59:53 -03:00
shared_stack ,
8192 ,
external_stack_function ) ;
2022-07-25 18:40:31 +08:00
vSemaphoreDelete ( printf_lock ) ;
free ( shared_stack ) ;
2019-11-22 14:28:15 -03:00
}
.. _esp-call-with-stack-basic_usage:
API Reference
-------------
2019-11-13 11:46:16 +08:00
.. include-build-file :: inc/esp_expression_with_stack.inc
2019-11-22 14:28:15 -03:00