In my application (built with NCS v1.7.0) I use a nonblocking TCP socket for communication. The main modem thread handles sending data and a separate thread handles receiving. The pseudocode for the receive thread looks like this:
loop while socket is open
{
num_bytes = recv(...)
if num_bytes > 0
{
put received bytes in ring buffer
notify application
}
sleep 10 msec
}
The main modem thread sends the AT%CONEVAL command every 500 msec to monitor the connection and collect data. The command is sent asynchronously using nrf_modem_at_cmd_async, and sometimes the pointer argument in the callback is invalid, which causes an exception (specifically it's a precise data bus error) if I attempt to use it. Here is an example of the callback function:
static void coneval_cb(const char *p_response)
{
LOG_INF("p_response: %p", p_response);
if (!_coneval_rxed)
{
LOG_INF("CONEVAL: %s", p_response);
strncpy(_coneval_string, p_response, sizeof(_coneval_string));
_coneval_rxed = true;
k_wakeup(modem_tid);
}
}
Most of the time it results in a log like this:
[00:14:01.144,927] <inf> modem: p_response: 0x200126b8
[00:14:01.144,958] <inf> modem: CONEVAL: %CONEVAL: 0,1,6,21,7,22,"005E8202","311480",109,5230,13,0,0,21,4,4,142
OK
[00:14:01.481,201] <err> os: ***** HARD FAULT *****
[00:14:01.481,201] <err> os: Fault escalation (see below)
[00:14:01.481,201] <err> os: ***** BUS FAULT *****
[00:14:01.481,231] <err> os: Precise data bus error
[00:14:01.481,231] <err> os: BFAR Address: 0x7bd82863
[00:14:01.481,231] <err> os: r0/a1: 0x7bd82863 r1/a2: 0x00000004 r2/a3: 0x00051a5d
[00:14:01.481,262] <err> os: r3/a4: 0x7bd82863 r12/ip: 0x00035440 r14/lr: 0x000356c5
[00:14:01.481,262] <err> os: xpsr: 0x2100002c
[00:14:01.481,262] <err> os: Faulting instruction address (r15/pc): 0x00021376
[00:14:01.481,292] <err> os: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0
[00:14:01.481,323] <err> os: Fault during interrupt handling
[00:14:01.481,323] <err> os: Current thread: 0x20018f00 (unknown)
static void coneval_cb(const char *p_response)
{
if (((uint32_t)p_response >> 28) != 0x2)
{
LOG_WRN("Bad coneval callback pointer: %p", p_response);
return;
}
if (!_coneval_rxed)
{
strncpy(_coneval_string, p_response, sizeof(_coneval_string));
_coneval_rxed = true;
k_wakeup(modem_tid);
}
}
[02:27:11.732,482] <inf> modem: Modem received 46 bytes