2023-08-03 11:32:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Call Function with External Stack
 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-22 14:28:15 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								=================================
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Overview
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								--------
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-03 11:32:07 +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 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								..  _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