esp_function_with_shared_stack.rst 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. 使用外部堆栈调用函数
  2. =================================
  3. :link_to_translation:`en:[English]`
  4. 概述
  5. --------
  6. 执行某个给定函数时,可以使用用户分配的堆栈空间,且该堆栈空间独立于当前任务的堆栈。这一机制能够节省在调用常用函数时浪费大量堆栈空间,例如 ``printf`` 函数。具体而言,将给定函数作为参数传入 :cpp:func:`esp_execute_shared_stack_function` 中,给定函数便会在共享堆栈空间内作为回调函数延迟执行。
  7. 使用方法
  8. --------
  9. :cpp:func:`esp_execute_shared_stack_function` 需要四个参数:
  10. - 由调用者分配的互斥锁,防止同一函数共享分配的堆栈
  11. - 指向分配的堆栈顶部的指针
  12. - 以字节为单位的堆栈的大小
  13. - 指向需要共享堆栈的函数的指针
  14. 通过这一功能,用户指定的函数被作为回调函数延迟执行,并在用户分配的空间中调用,无需从当前任务堆栈中获取空间。
  15. 该函数的使用方式如下所示:
  16. .. code-block:: c
  17. void external_stack_function(void)
  18. {
  19. printf("Executing this printf from external stack! \n");
  20. }
  21. //假设要使用一个单独的堆栈空间来调用 printf 函数
  22. //允许应用程序减小其堆栈大小
  23. void app_main()
  24. {
  25. //从堆中或以静态方式分配一个堆栈 buffer:
  26. StackType_t *shared_stack = malloc(8192 * sizeof(StackType_t));
  27. assert(shared_stack != NULL);
  28. //分配一个互斥锁:
  29. SemaphoreHandle_t printf_lock = xSemaphoreCreateMutex();
  30. assert(printf_lock != NULL);
  31. //使用宏助手调用所需函数:
  32. esp_execute_shared_stack_function(printf_lock,
  33. shared_stack,
  34. 8192,
  35. external_stack_function);
  36. vSemaphoreDelete(printf_lock);
  37. free(shared_stack);
  38. }
  39. .. _esp-call-with-stack-basic_usage:
  40. API 参考
  41. -------------
  42. .. include-build-file:: inc/esp_expression_with_stack.inc