The functions “nrf_log_frontend_std_...()” called by “NRF_LOG_INTERNAL_MODULE(...)” use only 4-byte (uint32_t) arguments, which is not suitable for arguments of type “double”.
(See: \components\libraries\log\src\nrf_log_frontend.c)
void nrf_log_frontend_std_1(uint32_t severity_mid,
char const * const p_str,
uint32_t val0)
{
uint32_t args[] = {val0};
std_n(severity_mid, p_str, args, ARRAY_SIZE(args));
}And further, when calling “nrf_fprintf_fprintf_fmt()”, the "float"-argument is misinterpreted as “double”.
(\external\fprintf\nrf_fprintf_format.c)
...
#if NRF_MODULE_ENABLED(NRF_FPRINTF_DOUBLE)
case 'f':
{
double dbl = va_arg(*p_args, double); // “float”-argument may be here!
float_print(p_ctx,
dbl,
NumDigits,
FieldWidth,
FormatFlags,
false);
break;
...
#endif
...Possible workaround:
...
#if NRF_MODULE_ENABLED(NRF_FPRINTF_DOUBLE)
case 'f':
{
if (p_ctx->p_user_ctx != NULL) // by: nrf_fprintf_fmt (p_cli->p_fprintf_ctx, ...) : (NRF_CLI_DEF)
{
double dbl = va_arg(*p_args, double);
float_print(p_ctx,
dbl,
NumDigits,
FieldWidth,
FormatFlags,
false);
}
else //: p_ctx->p_user_ctx == NULL // by: nrf_log_backend_serial_put() : (.p_user_ctx = NULL)
{
int32_t val_int32 = va_arg(*p_args, int32_t);
float dbl = *(float *) &val_int32;
float_print(p_ctx,
dbl,
NumDigits,
FieldWidth,
FormatFlags,
false);
}
break;
...
#endif
...And now you should use uint32_t type conversion to log float values, for example:
... float val_float = -1234567.0; NRF_LOG_INTERNAL_MODULE (0, NRF_LOG_SEVERITY_INFO_RAW, "%f", *(uint32_t *) &val_float); ...
