mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-05-22 01:27:11 +08:00
Merge branch 'feature/nano_libc_support_printf_float' into 'master'
newlib: nano mode libc supports print float type data See merge request sdk/ESP8266_RTOS_SDK!1056
This commit is contained in:
@ -4,7 +4,3 @@ set(COMPONENT_ADD_INCLUDEDIRS cJSON)
|
|||||||
set(COMPONENT_REQUIRES newlib)
|
set(COMPONENT_REQUIRES newlib)
|
||||||
|
|
||||||
register_component()
|
register_component()
|
||||||
|
|
||||||
if(CONFIG_NEWLIB_LIBRARY_LEVEL_NORMAL)
|
|
||||||
target_compile_definitions(${COMPONENT_LIB} PRIVATE -DCJSON_SPRINTF_FLOAT=1)
|
|
||||||
endif()
|
|
||||||
|
@ -56,14 +56,6 @@
|
|||||||
#pragma GCC visibility pop
|
#pragma GCC visibility pop
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CJSON_SPRINTF_FLOAT
|
|
||||||
#define CJSON_SPRINTF_FLOAT 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !CJSON_SPRINTF_FLOAT
|
|
||||||
#include <assert.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "cJSON.h"
|
#include "cJSON.h"
|
||||||
|
|
||||||
/* define our own boolean type */
|
/* define our own boolean type */
|
||||||
@ -501,7 +493,6 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if CJSON_SPRINTF_FLOAT
|
|
||||||
double test;
|
double test;
|
||||||
|
|
||||||
/* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */
|
/* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */
|
||||||
@ -513,51 +504,6 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out
|
|||||||
/* If not, print with 17 decimal places of precision */
|
/* If not, print with 17 decimal places of precision */
|
||||||
length = sprintf((char*)number_buffer, "%1.17g", d);
|
length = sprintf((char*)number_buffer, "%1.17g", d);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
long long d64 = (long long)d;
|
|
||||||
long d32 = (long)d;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if 32-bit type data is overflow.
|
|
||||||
*/
|
|
||||||
assert(d32 == d64 && "Library newlib of nano mode does not support double or long-long format, please enable newlib normal mode.");
|
|
||||||
|
|
||||||
length = sprintf((char*)number_buffer, "%ld", d32);
|
|
||||||
|
|
||||||
if ((double)d32 != d) {
|
|
||||||
size_t precision = 14;
|
|
||||||
unsigned char *pbuf = number_buffer;
|
|
||||||
|
|
||||||
if (d < 0.0) {
|
|
||||||
d = (double)d32 - d + 0.00000000000001;
|
|
||||||
} else {
|
|
||||||
d = d - (double)d32;
|
|
||||||
}
|
|
||||||
|
|
||||||
pbuf = &number_buffer[length];
|
|
||||||
*pbuf++ = '.';
|
|
||||||
length++;
|
|
||||||
|
|
||||||
while (d > 0.0 && precision--) {
|
|
||||||
d *= 10.0;
|
|
||||||
unsigned char tmp = (unsigned char)d;
|
|
||||||
|
|
||||||
*pbuf++ = tmp + '0';
|
|
||||||
length++;
|
|
||||||
|
|
||||||
d -= (double)tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
pbuf = &number_buffer[length - 1];
|
|
||||||
|
|
||||||
while (*pbuf == '0') {
|
|
||||||
pbuf--;
|
|
||||||
length--;
|
|
||||||
}
|
|
||||||
|
|
||||||
*++pbuf = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sprintf failed or buffer overrun occured */
|
/* sprintf failed or buffer overrun occured */
|
||||||
|
@ -4,7 +4,3 @@
|
|||||||
COMPONENT_ADD_INCLUDEDIRS += cJSON
|
COMPONENT_ADD_INCLUDEDIRS += cJSON
|
||||||
|
|
||||||
COMPONENT_SRCDIRS := cJSON
|
COMPONENT_SRCDIRS := cJSON
|
||||||
|
|
||||||
ifdef CONFIG_NEWLIB_LIBRARY_LEVEL_NORMAL
|
|
||||||
CFLAGS += -DCJSON_SPRINTF_FLOAT=1
|
|
||||||
endif
|
|
||||||
|
@ -2,10 +2,12 @@ set(COMPONENT_SRCDIRS newlib/port)
|
|||||||
set(COMPONENT_ADD_INCLUDEDIRS newlib/include newlib/port/include)
|
set(COMPONENT_ADD_INCLUDEDIRS newlib/include newlib/port/include)
|
||||||
|
|
||||||
|
|
||||||
if(CONFIG_NEWLIB_NANO_FORMAT)
|
if(CONFIG_NEWLIB_LIBRARY_LEVEL_NANO)
|
||||||
set(LIBC c_nano)
|
set(LIBC c_nano)
|
||||||
else()
|
elseif(CONFIG_NEWLIB_LIBRARY_LEVEL_NORMAL)
|
||||||
set(LIBC c)
|
set(LIBC c)
|
||||||
|
elseif(CONFIG_NEWLIB_LIBRARY_LEVEL_FLOAT_NANO)
|
||||||
|
set(LIBC c_fnano)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(LIBM m)
|
set(LIBM m)
|
||||||
@ -14,6 +16,10 @@ set(COMPONENT_PRIV_REQUIRES "vfs" "lwip") # for sys/ioctl.h
|
|||||||
|
|
||||||
register_component()
|
register_component()
|
||||||
|
|
||||||
|
if(CONFIG_NEWLIB_LIBRARY_LEVEL_FLOAT_NANO)
|
||||||
|
target_link_libraries(${COMPONENT_LIB} PUBLIC "-u _printf_float" "-u _scanf_float")
|
||||||
|
endif()
|
||||||
|
|
||||||
target_compile_definitions(${COMPONENT_LIB} PUBLIC
|
target_compile_definitions(${COMPONENT_LIB} PUBLIC
|
||||||
-D_CLOCKS_PER_SEC_=CONFIG_FREERTOS_HZ -D_POSIX_THREADS=1 -D_UNIX98_THREAD_MUTEX_ATTRIBUTES=1
|
-D_CLOCKS_PER_SEC_=CONFIG_FREERTOS_HZ -D_POSIX_THREADS=1 -D_UNIX98_THREAD_MUTEX_ATTRIBUTES=1
|
||||||
)
|
)
|
||||||
|
@ -11,7 +11,7 @@ config NEWLIB_ENABLE
|
|||||||
|
|
||||||
choice NEWLIB_LIBRARY_LEVEL
|
choice NEWLIB_LIBRARY_LEVEL
|
||||||
prompt "newlib level"
|
prompt "newlib level"
|
||||||
default NEWLIB_LIBRARY_LEVEL_NANO
|
default NEWLIB_LIBRARY_LEVEL_FLOAT_NANO
|
||||||
depends on NEWLIB_ENABLE
|
depends on NEWLIB_ENABLE
|
||||||
help
|
help
|
||||||
Choose newlib library level.
|
Choose newlib library level.
|
||||||
@ -26,15 +26,29 @@ config NEWLIB_LIBRARY_LEVEL_NANO
|
|||||||
bool "nano"
|
bool "nano"
|
||||||
help
|
help
|
||||||
The newlib library which has been compiled with so-called "nano"
|
The newlib library which has been compiled with so-called "nano"
|
||||||
formatting option. This option doesn't support 64-bit integer formats and C99
|
formatting option. This option doesn't support 64-bit integer formats, C99
|
||||||
features, such as positional arguments.
|
features and float formats, such as positional arguments.
|
||||||
|
|
||||||
For more details about "nano" formatting option, please see newlib readme file,
|
For more details about "nano" formatting option, please see newlib readme file,
|
||||||
search for '--enable-newlib-nano-formatted-io':
|
search for '--enable-newlib-nano-formatted-io':
|
||||||
https://sourceware.org/newlib/README
|
https://sourceware.org/newlib/README
|
||||||
|
|
||||||
If you do not need 64-bit integer formatting support or C99 features, select this
|
If you do not need 64-bit integer formatting support, C99 features and float,
|
||||||
option.
|
select this option.
|
||||||
|
|
||||||
|
config NEWLIB_LIBRARY_LEVEL_FLOAT_NANO
|
||||||
|
bool "float nano"
|
||||||
|
help
|
||||||
|
The newlib library which has been compiled with so-called "float nano"
|
||||||
|
formatting option. This option doesn't support 64-bit integer formats and C99
|
||||||
|
features, but support float formats, such as positional arguments.
|
||||||
|
|
||||||
|
For more details about "nano" formatting option, please see newlib readme file,
|
||||||
|
search for '--enable-newlib-nano-formatted-io':
|
||||||
|
https://sourceware.org/newlib/README
|
||||||
|
|
||||||
|
If you do not need 64-bit integer formatting support and C99 features, but need float formats,
|
||||||
|
select this option.
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
@ -16,6 +16,12 @@ ifdef CONFIG_NEWLIB_LIBRARY_LEVEL_NANO
|
|||||||
LIBC_PATH := $(COMPONENT_PATH)/newlib/lib/libc_nano.a
|
LIBC_PATH := $(COMPONENT_PATH)/newlib/lib/libc_nano.a
|
||||||
LIBM_PATH := $(COMPONENT_PATH)/newlib/lib/libm.a
|
LIBM_PATH := $(COMPONENT_PATH)/newlib/lib/libm.a
|
||||||
ADD_NEW_NEWLIB := 1
|
ADD_NEW_NEWLIB := 1
|
||||||
|
else
|
||||||
|
ifdef CONFIG_NEWLIB_LIBRARY_LEVEL_FLOAT_NANO
|
||||||
|
LIBC_PATH := $(COMPONENT_PATH)/newlib/lib/libc_fnano.a
|
||||||
|
LIBM_PATH := $(COMPONENT_PATH)/newlib/lib/libm.a
|
||||||
|
ADD_NEW_NEWLIB := 1
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -23,6 +29,9 @@ ifeq ($(ADD_NEW_NEWLIB),1)
|
|||||||
COMPONENT_ADD_INCLUDEDIRS += newlib/include newlib/port/include
|
COMPONENT_ADD_INCLUDEDIRS += newlib/include newlib/port/include
|
||||||
COMPONENT_SRCDIRS += newlib/port
|
COMPONENT_SRCDIRS += newlib/port
|
||||||
COMPONENT_ADD_LDFLAGS := $(LIBC_PATH) $(LIBM_PATH) -lnewlib
|
COMPONENT_ADD_LDFLAGS := $(LIBC_PATH) $(LIBM_PATH) -lnewlib
|
||||||
|
ifdef CONFIG_NEWLIB_LIBRARY_LEVEL_FLOAT_NANO
|
||||||
|
COMPONENT_ADD_LDFLAGS := $(COMPONENT_ADD_LDFLAGS) -u _printf_float -u _scanf_float
|
||||||
|
endif
|
||||||
COMPONENT_ADD_LINKER_DEPS := $(LIBC_PATH) $(LIBM_PATH)
|
COMPONENT_ADD_LINKER_DEPS := $(LIBC_PATH) $(LIBM_PATH)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
BIN
components/newlib/newlib/lib/libc_fnano.a
Normal file
BIN
components/newlib/newlib/lib/libc_fnano.a
Normal file
Binary file not shown.
Reference in New Issue
Block a user