I would like to get the timesync example running on the Sparkfun nRF52832 Breakout board.
I can currently download it to the nRF52832 DK using Segger Studio (after making the changes suggested for the project to work with the Segger IDE) and run it without issues.
I can download other programs onto the Sparkfun board without issues.
I see different results when I debug the DK than when I debug the Sparkfun board. (Assuming the debugging in Segger Studio is actually debugging the Sparkfun board)
The Sparkfun board appears to get stuck in an infinite loop here:
// Skip any string that is pushed to the circular buffer.
while (p_header->base.generic.type == HEADER_TYPE_PUSHED)
{
rd_idx += PUSHED_HEADER_SIZE;
rd_idx += (p_header->base.pushed.len + p_header->base.pushed.offset);
p_header = (nrf_log_header_t *)&m_log_data.buffer[rd_idx & mask];
}
which is found in the file nrf_log_frontend.c at function log_skip():
/**
* @brief Skips the oldest, not pushed logs to make space for new logs.
* @details This function moves forward read index to prepare space for new logs.
*/
static void log_skip(void)
{
(void)nrf_atomic_flag_set(&m_log_data.log_skipped);
(void)nrf_atomic_flag_set(&m_log_data.log_skipping);
uint32_t rd_idx = m_log_data.rd_idx;
uint32_t mask = m_log_data.mask;
nrf_log_header_t * p_header = (nrf_log_header_t *)&m_log_data.buffer[rd_idx & mask];
nrf_log_header_t header;
// Skip any string that is pushed to the circular buffer.
while (p_header->base.generic.type == HEADER_TYPE_PUSHED)
{
rd_idx += PUSHED_HEADER_SIZE;
rd_idx += (p_header->base.pushed.len + p_header->base.pushed.offset);
p_header = (nrf_log_header_t *)&m_log_data.buffer[rd_idx & mask];
}
uint32_t i;
for (i = 0; i < HEADER_SIZE; i++)
{
((uint32_t*)&header)[i] = m_log_data.buffer[rd_idx++ & mask];
}
switch (header.base.generic.type)
{
case HEADER_TYPE_HEXDUMP:
rd_idx += CEIL_DIV(header.base.hexdump.len, sizeof(uint32_t));
break;
case HEADER_TYPE_STD:
rd_idx += header.base.std.nargs;
break;
default:
ASSERT(false);
break;
}
uint32_t log_skipping_tmp = nrf_atomic_flag_clear_fetch(&m_log_data.log_skipping);
//update read index only if log_skip was not interrupted by another log skip
if (log_skipping_tmp)
{
m_log_data.rd_idx = rd_idx;
}
}
Does anyone know what is the issue or of a modification that could be made? Even if it has to remove a portion of the functionality, that's fine.
EDIT:
I now get a hard fault exception regardless if NRF_LOG_ENABLED is set to 0 or 1. The previous infinite loop is no longer happening. I am also using the Segger project that was uploaded to the time sync example GitHub.
Here is a screenshot of the call stack after the exception. My cursor is on the event I assume is the first occurrence of the exception. The same error occurs when running the standard UART example.
You can also see in the debug terminal an ERROR 4 [NRF_ERROR_NO_MEM] goes on to say at line 603 in main. Here is an image of that section of code.