printk() low power bug report

Hello DevZone,

I just located a mysterious bugLaughing, it's about printk() and low power.

Environment:

  • NCS v2.8.0 and v2.9.0
  • nRF52840DK v3.0.2
  • PC: Ubuntu 22.04
  • Zephyr Hello World sample

Condition:

  • Use ASYNC UART as log backend and as console backend
  • Use `CONFIG_LOG_PRINTK=y` to redirect the message to logging subsystem.
  • Only use `printk()`, (no `printf` or `LOG_INF`, etc.), to print 33 bytes. no more, no less.

Result:

Very high bottom current:

 

But when my print is not 33 bytes, or just set `CONFIG_LOG_PRINTK=n`, the power consumption is very nice:

How do I know it's 33 bytes? Because:

printk("Hello World! %s\n", CONFIG_BOARD_TARGET);

// "Hello World! nrf52840dk/nrf52840\n" is just 33 bytes!!!!

That wastes me lot of times...

My code is very simple, just use `zephyr/samples/hello_world`, you can try yourself.

prj.conf

# Enable UART LOG
CONFIG_LOG=y
CONFIG_LOG_MODE_DEFERRED=y
CONFIG_LOG_BACKEND_UART=y

# Enable Async uart
CONFIG_LOG_BACKEND_UART_ASYNC=y
CONFIG_UART_ASYNC_API=y
CONFIG_UART_0_INTERRUPT_DRIVEN=n
CONFIG_UART_0_ASYNC=y

## Hardware counter for Async UART is only for RX
## we don't need it here
# CONFIG_UART_0_NRF_HW_ASYNC=y
# CONFIG_UART_0_NRF_HW_ASYNC_TIMER=1
# CONFIG_NRFX_TIMER1=y

# enable console
CONFIG_PRINTK=y
CONFIG_UART_CONSOLE=y

# disable all input feature
CONFIG_SHELL=n
CONFIG_CONSOLE_HANDLER=n

# printk redirect to log
CONFIG_LOG_PRINTK=y

# Enable runtime PM
CONFIG_PM_DEVICE_RUNTIME=y
CONFIG_PM_DEVICE=y

# Disable RTT
CONFIG_USE_SEGGER_RTT=n
CONFIG_RTT_CONSOLE=n

nrf52840dk_nrf52840.overlay

&adc {
    status = "disabled";
};

&i2c0 {
    status = "disabled";
};

&spi1 {
    status = "disabled";
};

&pwm0 {
    status = "disabled";
};

&spi3 {
    status = "disabled";
};

&qspi {
    status = "disabled";
};

&usbd {
    status = "disabled";
};

&uart0 {
    status = "okay";
    zephyr,pm-device-runtime-auto;
    /delete-property/ hw-flow-control;
};

// disable CTS and RTS by overriding the node
&uart0_default {
    group1 {
        psels = <NRF_PSEL(UART_TX, 0, 6)>;
    };
    group2 {
        psels = <NRF_PSEL(UART_RX, 0, 8)>;
        bias-pull-up;
    };
};

&uart0_sleep {
    group1 {
        psels = <NRF_PSEL(UART_TX, 0, 6)>,
            <NRF_PSEL(UART_RX, 0, 8)>;
        low-power-enable;
        bias-pull-up; // pull-up when in idle will reduce 100nA.
    };
};

main.c

#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(mai);

int main(void)
{
    while(1)
    {   
        printk("Hello World! %s\n", CONFIG_BOARD_TARGET);
        // LOG_INF("Hello World! %s\n", CONFIG_BOARD_TARGET);
        // printf("Hello World! %s\n", CONFIG_BOARD_TARGET);
        k_sleep(K_MSEC(1000));
    }
	return 0;
}

Just want to report this bug, and let our Nordic AI know how to set low power log. Instead of just asking the developers to set `CONFIG_SERIAL=n`.

Best regards,

Jayant

Related