test_shared_stack_printf.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Unlicense OR CC0-1.0
  5. */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include "unity.h"
  9. #include "freertos/FreeRTOS.h"
  10. #include "freertos/task.h"
  11. #include "freertos/semphr.h"
  12. #include "sdkconfig.h"
  13. #include "test_utils.h"
  14. #include "esp_expression_with_stack.h"
  15. #define SHARED_STACK_SIZE 8192
  16. static StackType_t *shared_stack_sp = NULL;
  17. void external_stack_function(void)
  18. {
  19. printf("Executing this printf from external stack! sp=%p\n", esp_cpu_get_sp());
  20. shared_stack_sp = (StackType_t *)esp_cpu_get_sp();
  21. char *res = NULL;
  22. /* Test return value from asprintf, this could potentially help catch a misaligned
  23. stack pointer error */
  24. asprintf(&res, "%d %011i %lu %p %x %c %.4f\n", 42, 2147483647, 2147483648UL, (void *) 0x40010000, 0x40020000, 'Q', 1.0f / 137.0f);
  25. TEST_ASSERT_NOT_NULL(res);
  26. TEST_ASSERT_EQUAL_STRING("42 02147483647 2147483648 0x40010000 40020000 Q 0.0073\n", res);
  27. free(res);
  28. }
  29. void another_external_stack_function(void)
  30. {
  31. //We can even use Freertos resources inside of this context.
  32. printf("We can even use FreeRTOS resources... yielding, sp=%p\n", esp_cpu_get_sp());
  33. taskYIELD();
  34. shared_stack_sp = (StackType_t *)esp_cpu_get_sp();
  35. }
  36. TEST_CASE("test printf using shared buffer stack", "[newlib]")
  37. {
  38. portSTACK_TYPE *shared_stack = malloc(SHARED_STACK_SIZE);
  39. TEST_ASSERT_NOT_NULL(shared_stack);
  40. SemaphoreHandle_t printf_lock = xSemaphoreCreateMutex();
  41. TEST_ASSERT_NOT_NULL(printf_lock);
  42. printf("current task sp: %p\n", esp_cpu_get_sp());
  43. printf("shared_stack: %p\n", (void *)shared_stack);
  44. printf("shared_stack expected top: %p\n", (void *)(shared_stack + SHARED_STACK_SIZE));
  45. esp_execute_shared_stack_function(printf_lock,
  46. shared_stack,
  47. SHARED_STACK_SIZE,
  48. external_stack_function);
  49. TEST_ASSERT(((shared_stack_sp >= shared_stack) &&
  50. (shared_stack_sp < (shared_stack + SHARED_STACK_SIZE))));
  51. esp_execute_shared_stack_function(printf_lock,
  52. shared_stack,
  53. SHARED_STACK_SIZE,
  54. another_external_stack_function);
  55. TEST_ASSERT(((shared_stack_sp >= shared_stack) &&
  56. (shared_stack_sp < (shared_stack + SHARED_STACK_SIZE))));
  57. vSemaphoreDelete(printf_lock);
  58. free(shared_stack);
  59. }