I started a new software project on the nRF52832 a couple of weeks ago. I've been using Segger RTT for a lot of debugging with no problem throughout the beginning of the process. I've recently hit an issue where the Segger RTT printf statements stop showing up when I use more than 8kB of RAM. I should have almost 49,000 bytes of RAM remaining, so I'm nowhere near close to running out of RAM.
I've gotten to the point where I can compile my code with or without a single global uint32_t variable and if that variable is included the Segger RTT stuff will not work properly (note that as far as I can tell, everything else appears to work properly).
I'm using the S132 Soft Device and am using GCC to compile the code.
Here are the code size results from compilation:
text data bss
40860 176 7828
This uses 8004 Bytes of RAM, and that's when the Segger RTT breaks.
Here's the linker script that I'm using:
/* Linker script to configure memory regions. */
GROUP(-lgcc -lc -lnosys)
FLASH (rx) : ORIGIN = 0x1f000, LENGTH = 0x61000 /* 397312 Bytes */
RAM (rwx) : ORIGIN = 0x20002128, LENGTH = 0xded8 /* 57048 Bytes */
PROVIDE(__start_fs_data = .);
PROVIDE(__stop_fs_data = .);
} > RAM
} INSERT AFTER .data;
EDIT: I realized it might be worth mentioning that I'm allocating 4608 Bytes of RAM via the SDK provided memory manager.
How does the RTT "break"? Can it be something related tot he RTT buffer size? I use this RTT buffer size configuration:
#define SEGGER_RTT_CONFIG_BUFFER_SIZE_UP 1024
What's your current RTT buffer size value?
RTT breaks by no longer printing out to the console. Here are the #defines I see in my SEGGER_RTT_Conf.h file:
#define SEGGER_RTT_MAX_NUM_UP_BUFFERS (2) // Max. number of up-buffers (T->H) available on this target (Default: 2)
#define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (2) // Max. number of down-buffers (H->T) available on this target (Default: 2)
#define BUFFER_SIZE_UP (1024) // Size of the buffer for terminal output of target, up to host (Default: 1k)
#define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16)
#define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64)
#define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0)
In the make file you can adjust the stack and the heap size:
ASMFLAGS += -D__STACK_SIZE=16392
ASMFLAGS += -D__HEAP_SIZE=16392
then in the SDK folder nRF5_SDK_11_0_0_89a8197\components\toolchain\gcc there is file called gcc_startup_nrf52.s.
I am always just making sure that the heap and stack settings in there are the same as in the makefile. However, I am not sure about the correlation though.
If you do very very fancy printf things you might be running out of stack.
Quiet unlikely since the default value is actually set to 8kb. Anyway still worth trying.
Making these changes did not seem to help. The previous values in the .S file were both 8192.
How about increasing the BUFFER_SIZE_UP to, say, 2048? Do you "print" a lot of data using RTT?