test_attr.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * SPDX-FileCopyrightText: 2017-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "inttypes.h"
  7. #include "unity.h"
  8. #include "esp_attr.h"
  9. #include "esp_log.h"
  10. #include "soc/soc.h"
  11. #include "esp_system.h"
  12. #if CONFIG_IDF_TARGET_ESP32
  13. #include "esp_private/esp_psram_extram.h"
  14. #endif
  15. #include "test_utils.h"
  16. extern int _rtc_noinit_start;
  17. extern int _rtc_noinit_end;
  18. extern int _rtc_data_start;
  19. extern int _rtc_data_end;
  20. extern int _noinit_start;
  21. extern int _noinit_end;
  22. extern int _rtc_force_fast_start;
  23. extern int _rtc_force_fast_end;
  24. extern int _rtc_force_slow_start;
  25. extern int _rtc_force_slow_end;
  26. extern int _ext_ram_noinit_start;
  27. extern int _ext_ram_noinit_end;
  28. extern int _ext_ram_bss_start;
  29. extern int _ext_ram_bss_end;
  30. #if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2)
  31. //IDF-5045
  32. //Variables for test: Attributes place variables into correct sections
  33. static __NOINIT_ATTR uint32_t s_noinit;
  34. static RTC_NOINIT_ATTR uint32_t s_rtc_noinit;
  35. static RTC_DATA_ATTR uint32_t s_rtc_data;
  36. static RTC_RODATA_ATTR uint32_t s_rtc_rodata;
  37. static RTC_FAST_ATTR uint32_t s_rtc_force_fast;
  38. static RTC_SLOW_ATTR uint32_t s_rtc_force_slow;
  39. #if CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY
  40. static EXT_RAM_NOINIT_ATTR uint32_t s_noinit_ext;
  41. #endif
  42. static bool data_in_segment(void *ptr, int *seg_start, int *seg_end)
  43. {
  44. return ((intptr_t)ptr < (intptr_t)seg_end) && \
  45. ((intptr_t)ptr >= (intptr_t)seg_start);
  46. }
  47. TEST_CASE("Attributes place variables into correct sections", "[ld]")
  48. {
  49. TEST_ASSERT(data_in_segment(&s_noinit, &_noinit_start, &_noinit_end));
  50. TEST_ASSERT(data_in_segment(&s_rtc_noinit, &_rtc_noinit_start, &_rtc_noinit_end));
  51. TEST_ASSERT(data_in_segment(&s_rtc_data, &_rtc_data_start, &_rtc_data_end));
  52. TEST_ASSERT(data_in_segment(&s_rtc_rodata, &_rtc_data_start, &_rtc_data_end));
  53. TEST_ASSERT(data_in_segment(&s_rtc_force_fast, &_rtc_force_fast_start, &_rtc_force_fast_end));
  54. TEST_ASSERT(data_in_segment(&s_rtc_force_slow, &_rtc_force_slow_start, &_rtc_force_slow_end));
  55. #if CONFIG_ESP32_RTCDATA_IN_FAST_MEM || \
  56. CONFIG_ESP32S2_RTCDATA_IN_FAST_MEM || \
  57. CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM
  58. TEST_ASSERT(data_in_segment(&s_rtc_data, (int*) SOC_RTC_DRAM_LOW, (int*) SOC_RTC_DRAM_HIGH));
  59. TEST_ASSERT(data_in_segment(&s_rtc_rodata, (int*) SOC_RTC_DRAM_LOW, (int*) SOC_RTC_DRAM_HIGH));
  60. TEST_ASSERT(data_in_segment(&s_rtc_noinit, (int*) SOC_RTC_DRAM_LOW, (int*) SOC_RTC_DRAM_HIGH));
  61. #else
  62. TEST_ASSERT(data_in_segment(&s_rtc_data, (int*) SOC_RTC_DATA_LOW, (int*) SOC_RTC_DATA_HIGH));
  63. TEST_ASSERT(data_in_segment(&s_rtc_rodata, (int*) SOC_RTC_DATA_LOW, (int*) SOC_RTC_DATA_HIGH));
  64. TEST_ASSERT(data_in_segment(&s_rtc_noinit, (int*) SOC_RTC_DATA_LOW, (int*) SOC_RTC_DATA_HIGH));
  65. #endif
  66. TEST_ASSERT(data_in_segment(&s_rtc_force_fast, (int*) SOC_RTC_DRAM_LOW, (int*) SOC_RTC_DRAM_HIGH));
  67. TEST_ASSERT(data_in_segment(&s_rtc_force_slow, (int*) SOC_RTC_DATA_LOW, (int*) SOC_RTC_DATA_HIGH));
  68. #if CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY
  69. TEST_ASSERT(data_in_segment(&s_noinit_ext, &_ext_ram_noinit_start, &_ext_ram_noinit_end));
  70. #endif
  71. }
  72. #endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2)
  73. #if CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY
  74. #define TEST_BUFFER_SIZE (16*1024/4)
  75. static EXT_RAM_NOINIT_ATTR uint32_t s_noinit_buffer[TEST_BUFFER_SIZE];
  76. static void write_spiram_and_reset(void)
  77. {
  78. // Fill the noinit buffer
  79. printf("Filling buffer\n");
  80. for (uint32_t i = 0; i < TEST_BUFFER_SIZE; i++) {
  81. s_noinit_buffer[i] = i ^ 0x55555555U;
  82. }
  83. printf("Flushing cache\n");
  84. // Flush the cache out to SPIRAM before resetting.
  85. esp_psram_extram_writeback_cache();
  86. printf("Restarting\n");
  87. // Reset to test that noinit memory is left intact.
  88. esp_restart();
  89. }
  90. static void check_spiram_contents(void)
  91. {
  92. // Confirm that the memory contents are still what we expect
  93. uint32_t error_count = 0;
  94. for (uint32_t i = 0; i < TEST_BUFFER_SIZE; i++) {
  95. if (s_noinit_buffer[i] != (i ^ 0x55555555U)) {
  96. error_count++;
  97. }
  98. }
  99. printf("Found %" PRIu32 " memory errors\n", error_count);
  100. TEST_ASSERT(error_count == 0);
  101. }
  102. TEST_CASE_MULTIPLE_STAGES("Spiram test noinit memory", "[spiram]", write_spiram_and_reset, check_spiram_contents);
  103. #endif // CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY
  104. #if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY
  105. #define TEST_BSS_NUM (256 * 1024)
  106. static EXT_RAM_BSS_ATTR uint32_t s_bss_buffer[TEST_BSS_NUM];
  107. TEST_CASE("Test variables placed in external .bss segment", "[ld]")
  108. {
  109. for (int i = 0; i < TEST_BSS_NUM; i++) {
  110. TEST_ASSERT(data_in_segment(&s_bss_buffer[i], &_ext_ram_bss_start, &_ext_ram_bss_end));
  111. TEST_ASSERT_EQUAL(0, s_bss_buffer[i]);
  112. }
  113. }
  114. #endif //#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY