2023-08-03 11:32:07 +08:00
Call Function with External Stack
2019-11-22 14:28:15 -03:00
=================================
2023-09-25 16:49:33 +08:00
:link_to_translation:`zh_CN:[中文]`
2019-11-22 14:28:15 -03:00
Overview
--------
2023-09-25 16:49:33 +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 a 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
2023-08-03 11:32:07 +08:00
The user-defined function is 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 " ) ;
}
2023-08-03 11:32:07 +08:00
//Let us suppose we want to call printf using a separated stack space
2021-11-17 09:36:01 +05:30
//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
}
2023-09-25 16:49:33 +08:00
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