Merge branch 'bugfix/esp32s2_newlib_nano' into 'master'
esp32s2: esp_rom: separate nano formatting functions, fix newlib tests See merge request espressif/esp-idf!7447
This commit is contained in:
commit
9fafdb7e6d
4 changed files with 54 additions and 29 deletions
|
@ -42,10 +42,13 @@ else() # Regular app build
|
||||||
|
|
||||||
elseif(target STREQUAL "esp32s2")
|
elseif(target STREQUAL "esp32s2")
|
||||||
# no SPIRAM workaround for esp32s2
|
# no SPIRAM workaround for esp32s2
|
||||||
# no nano formatting function in ROM
|
|
||||||
|
|
||||||
list(APPEND scripts "esp32s2/ld/esp32s2.rom.newlib-funcs.ld"
|
list(APPEND scripts "esp32s2/ld/esp32s2.rom.newlib-funcs.ld"
|
||||||
"esp32s2/ld/esp32s2.rom.spiflash.ld")
|
"esp32s2/ld/esp32s2.rom.spiflash.ld")
|
||||||
|
|
||||||
|
if(CONFIG_NEWLIB_NANO_FORMAT)
|
||||||
|
list(APPEND scripts "esp32s2/ld/esp32s2.rom.newlib-nano.ld")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_linker_script(${COMPONENT_LIB} INTERFACE "${scripts}")
|
target_linker_script(${COMPONENT_LIB} INTERFACE "${scripts}")
|
||||||
|
|
|
@ -20,11 +20,6 @@ fclose = 0x4001a804;
|
||||||
_fclose_r = 0x4001a714;
|
_fclose_r = 0x4001a714;
|
||||||
fflush = 0x40001bb8;
|
fflush = 0x40001bb8;
|
||||||
_fflush_r = 0x40001b30;
|
_fflush_r = 0x40001b30;
|
||||||
fiprintf = 0x40000a3c;
|
|
||||||
_fiprintf_r = 0x40000a18;
|
|
||||||
__fp_lock_all = 0x4001a638;
|
|
||||||
fprintf = 0x40000a3c;
|
|
||||||
_fprintf_r = 0x40000a18;
|
|
||||||
__fp_unlock_all = 0x4001a64c;
|
__fp_unlock_all = 0x4001a64c;
|
||||||
__fputwc = 0x40001770;
|
__fputwc = 0x40001770;
|
||||||
fputwc = 0x40001864;
|
fputwc = 0x40001864;
|
||||||
|
@ -76,7 +71,6 @@ __sinit = 0x4001a538;
|
||||||
__sinit_lock_acquire = 0x4001a520;
|
__sinit_lock_acquire = 0x4001a520;
|
||||||
__sinit_lock_release = 0x4001a52c;
|
__sinit_lock_release = 0x4001a52c;
|
||||||
__smakebuf_r = 0x40001954;
|
__smakebuf_r = 0x40001954;
|
||||||
__sprint_r = 0x40000aec;
|
|
||||||
srand = 0x40007a24;
|
srand = 0x40007a24;
|
||||||
__sread = 0x4001a660;
|
__sread = 0x4001a660;
|
||||||
__sseek = 0x4001a6cc;
|
__sseek = 0x4001a6cc;
|
||||||
|
@ -116,10 +110,6 @@ __swsetup_r = 0x40001690;
|
||||||
toascii = 0x4001af90;
|
toascii = 0x4001af90;
|
||||||
tolower = 0x40008158;
|
tolower = 0x40008158;
|
||||||
toupper = 0x40008174;
|
toupper = 0x40008174;
|
||||||
vfiprintf = 0x40000e40;
|
|
||||||
_vfiprintf_r = 0x40000b58;
|
|
||||||
vfprintf = 0x40000e40;
|
|
||||||
_vfprintf_r = 0x40000b58;
|
|
||||||
wcrtomb = 0x400012f4;
|
wcrtomb = 0x400012f4;
|
||||||
_wcrtomb_r = 0x400012a0;
|
_wcrtomb_r = 0x400012a0;
|
||||||
_wctomb_r = 0x400018ac;
|
_wctomb_r = 0x400018ac;
|
||||||
|
|
26
components/esp_rom/esp32s2/ld/esp32s2.rom.newlib-nano.ld
Normal file
26
components/esp_rom/esp32s2/ld/esp32s2.rom.newlib-nano.ld
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/* These are the printf/scanf related newlib functions present in ESP32-S2 ROM.
|
||||||
|
These functions are compiled with newlib "nano" format option.
|
||||||
|
As such, they don's support 64-bit integer formats.
|
||||||
|
Floating point formats are supported by setting _printf_float and
|
||||||
|
_scanf_float entries in syscall table. This is done automatically
|
||||||
|
by startup code.
|
||||||
|
See also esp32s2.rom.newlib-data.ld for the list of .data/.bss symbols
|
||||||
|
used by newlib functions, and esp32s2.rom.newlib-funcs.ld for the list
|
||||||
|
of general newlib functions.
|
||||||
|
|
||||||
|
Unlike other ROM functions which are exported using PROVIDE, which declares
|
||||||
|
weak symbols, newlib related functions are exported using assignment,
|
||||||
|
which declares strong symbols. This is done so that ROM functions are always
|
||||||
|
used instead of the ones provided by libc.a.
|
||||||
|
*/
|
||||||
|
|
||||||
|
fiprintf = 0x40000a3c;
|
||||||
|
_fiprintf_r = 0x40000a18;
|
||||||
|
__fp_lock_all = 0x4001a638;
|
||||||
|
fprintf = 0x40000a3c;
|
||||||
|
_fprintf_r = 0x40000a18;
|
||||||
|
__sprint_r = 0x40000aec;
|
||||||
|
vfiprintf = 0x40000e40;
|
||||||
|
_vfiprintf_r = 0x40000b58;
|
||||||
|
vfprintf = 0x40000e40;
|
||||||
|
_vfprintf_r = 0x40000b58;
|
|
@ -8,6 +8,7 @@
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
|
#include "soc/soc.h"
|
||||||
|
|
||||||
TEST_CASE("test ctype functions", "[newlib]")
|
TEST_CASE("test ctype functions", "[newlib]")
|
||||||
{
|
{
|
||||||
|
@ -19,7 +20,7 @@ TEST_CASE("test ctype functions", "[newlib]")
|
||||||
TEST_ASSERT_FALSE( isspace('0') || isspace('9') || isspace(')') || isspace('A') || isspace('*') || isspace('\x81') || isspace('a'));
|
TEST_ASSERT_FALSE( isspace('0') || isspace('9') || isspace(')') || isspace('A') || isspace('*') || isspace('\x81') || isspace('a'));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("test atoX functions", "[newlib][ignore]")
|
TEST_CASE("test atoX functions", "[newlib]")
|
||||||
{
|
{
|
||||||
TEST_ASSERT_EQUAL_INT(-2147483648, atoi("-2147483648"));
|
TEST_ASSERT_EQUAL_INT(-2147483648, atoi("-2147483648"));
|
||||||
TEST_ASSERT_EQUAL_INT(2147483647, atoi("2147483647"));
|
TEST_ASSERT_EQUAL_INT(2147483647, atoi("2147483647"));
|
||||||
|
@ -116,29 +117,34 @@ TEST_CASE("test asctime", "[newlib]")
|
||||||
TEST_ASSERT_EQUAL_STRING(buf, time_str);
|
TEST_ASSERT_EQUAL_STRING(buf, time_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool fn_in_rom(void *fn, const char *name)
|
static bool fn_in_rom(void *fn)
|
||||||
{
|
{
|
||||||
const int fnaddr = (int)fn;
|
const int fnaddr = (int)fn;
|
||||||
return (fnaddr >= 0x40000000) && (fnaddr < 0x40070000);
|
return (fnaddr >= SOC_IROM_MASK_LOW && fnaddr < SOC_IROM_MASK_HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("check if ROM or Flash is used for functions", "[newlib]")
|
TEST_CASE("check if ROM or Flash is used for functions", "[newlib]")
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_NEWLIB_NANO_FORMAT) && !defined(CONFIG_SPIRAM)
|
#if defined(CONFIG_NEWLIB_NANO_FORMAT)
|
||||||
TEST_ASSERT(fn_in_rom(printf, "printf"));
|
TEST_ASSERT(fn_in_rom(vfprintf));
|
||||||
TEST_ASSERT(fn_in_rom(sscanf, "sscanf"));
|
|
||||||
#else
|
#else
|
||||||
TEST_ASSERT_FALSE(fn_in_rom(printf, "printf"));
|
TEST_ASSERT_FALSE(fn_in_rom(vfprintf));
|
||||||
TEST_ASSERT_FALSE(fn_in_rom(sscanf, "sscanf"));
|
#endif // CONFIG_NEWLIB_NANO_FORMAT
|
||||||
#endif
|
|
||||||
#if !defined(CONFIG_SPIRAM)
|
#if defined(CONFIG_IDF_TARGET_ESP32) && defined(CONFIG_NEWLIB_NANO_FORMAT)
|
||||||
TEST_ASSERT(fn_in_rom(atoi, "atoi"));
|
TEST_ASSERT(fn_in_rom(sscanf));
|
||||||
TEST_ASSERT(fn_in_rom(strtol, "strtol"));
|
|
||||||
#else
|
#else
|
||||||
TEST_ASSERT_FALSE(fn_in_rom(atoi, "atoi"));
|
TEST_ASSERT_FALSE(fn_in_rom(sscanf));
|
||||||
TEST_ASSERT_FALSE(fn_in_rom(strtol, "strtol"));
|
#endif // CONFIG_IDF_TARGET_ESP32 && CONFIG_NEWLIB_NANO_FORMAT
|
||||||
#endif
|
|
||||||
|
#if defined(CONFIG_IDF_TARGET_ESP32) && !defined(CONFIG_SPIRAM)
|
||||||
|
TEST_ASSERT(fn_in_rom(atoi));
|
||||||
|
TEST_ASSERT(fn_in_rom(strtol));
|
||||||
|
#else
|
||||||
|
TEST_ASSERT_FALSE(fn_in_rom(atoi));
|
||||||
|
TEST_ASSERT_FALSE(fn_in_rom(strtol));
|
||||||
|
#endif // defined(CONFIG_IDF_TARGET_ESP32) && !defined(CONFIG_SPIRAM)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_NEWLIB_NANO_FORMAT
|
#ifndef CONFIG_NEWLIB_NANO_FORMAT
|
||||||
|
@ -158,8 +164,8 @@ TEST_CASE("test 64bit int formats", "[newlib]")
|
||||||
TEST_ASSERT_EQUAL(1, ret);
|
TEST_ASSERT_EQUAL(1, ret);
|
||||||
TEST_ASSERT_EQUAL(val, sval);
|
TEST_ASSERT_EQUAL(val, sval);
|
||||||
}
|
}
|
||||||
#else
|
#else // CONFIG_NEWLIB_NANO_FORMAT
|
||||||
TEST_CASE("test 64bit int formats", "[newlib][ignore]")
|
TEST_CASE("test 64bit int formats", "[newlib]")
|
||||||
{
|
{
|
||||||
char* res = NULL;
|
char* res = NULL;
|
||||||
const uint64_t val = 123456789012LL;
|
const uint64_t val = 123456789012LL;
|
||||||
|
@ -174,7 +180,7 @@ TEST_CASE("test 64bit int formats", "[newlib][ignore]")
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL(0, ret);
|
TEST_ASSERT_EQUAL(0, ret);
|
||||||
}
|
}
|
||||||
#endif
|
#endif // CONFIG_NEWLIB_NANO_FORMAT
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("fmod and fmodf work as expected", "[newlib]")
|
TEST_CASE("fmod and fmodf work as expected", "[newlib]")
|
||||||
|
|
Loading…
Reference in a new issue