I have a test program that does a simple call to fds_record_write() to write a 4 byte value to an FDS file. This is using the NVMC backend. I happened to stop the debugger in my FDS event handler and discovered that the stack is 35 frames deep at the point the callback happens. For some reason the code is recursively calling the FDS queue_process() function, despite the fact that this function has a while loop in it to process multiple events.
Can someone explain why I need 35 stack frames and over 1K of stack space just to write 4 bytes to flash?
gdb output follows.
--Jay
----------------
#0 on_write_complete () at ./main.c:127
#1 0x0000031e in fds_evt_handler (p_fds_evt=0x20000cc4 <ucHeap+804>) at ./main.c:141
#2 0x00002636 in event_send (p_evt=0x20000cc4 <ucHeap+804>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:109
#3 0x00003b0e in queue_process (result=7453)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1459
#4 0x00003b7a in fs_event_handler (p_evt=0x20000d00 <ucHeap+864>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1492
#5 0x0000441e in event_send (p_fs=0x2000023c <m_fs>, evt_id=NRF_FSTORAGE_EVT_WRITE_RESULT, p_src=0x200008b4 <m_queue_data+8>,
addr=1036480, len=4, p_param=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage_nvmc.c:93
#6 0x000044da in write (p_fs=0x2000023c <m_fs>, dest=1036480, p_src=0x200008b4 <m_queue_data+8>, len=4, p_param=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage_nvmc.c:144
#7 0x000041b4 in nrf_fstorage_write (p_fs=0x2000023c <m_fs>, dest=1036480, p_src=0x200008b4 <m_queue_data+8>, len=4,
p_context=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage.c:149
#8 0x00003170 in record_header_write_finalize (p_op=0x200008ac <m_queue_data>, p_addr=0xfd0bc)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:781
#9 0x000038f6 in write_execute (prev_ret=0, p_op=0x200008ac <m_queue_data>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1258
#10 0x00003aa8 in queue_process (result=0)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1420
#11 0x00003b7a in fs_event_handler (p_evt=0x20000df0 <ucHeap+1104>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1492
#12 0x0000441e in event_send (p_fs=0x2000023c <m_fs>, evt_id=NRF_FSTORAGE_EVT_WRITE_RESULT, p_src=0x20001100 <ucHeap+1888>,
addr=1036488, len=4, p_param=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage_nvmc.c:93
#13 0x000044da in write (p_fs=0x2000023c <m_fs>, dest=1036488, p_src=0x20001100 <ucHeap+1888>, len=4, p_param=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage_nvmc.c:144
#14 0x000041b4 in nrf_fstorage_write (p_fs=0x2000023c <m_fs>, dest=1036488, p_src=0x20001100 <ucHeap+1888>, len=4,
p_context=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage.c:149
#15 0x000032be in record_write_data (p_op=0x200008ac <m_queue_data>, p_addr=0xfd0bc)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:878
#16 0x000038ea in write_execute (prev_ret=0, p_op=0x200008ac <m_queue_data>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1254
#17 0x00003aa8 in queue_process (result=0)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1420
#18 0x00003b7a in fs_event_handler (p_evt=0x20000ee0 <ucHeap+1344>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1492
#19 0x0000441e in event_send (p_fs=0x2000023c <m_fs>, evt_id=NRF_FSTORAGE_EVT_WRITE_RESULT, p_src=0x200008b8 <m_queue_data+12>,
addr=1036484, len=4, p_param=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage_nvmc.c:93
#20 0x000044da in write (p_fs=0x2000023c <m_fs>, dest=1036484, p_src=0x200008b8 <m_queue_data+12>, len=4, p_param=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage_nvmc.c:144
#21 0x000041b4 in nrf_fstorage_write (p_fs=0x2000023c <m_fs>, dest=1036484, p_src=0x200008b8 <m_queue_data+12>, len=4,
p_context=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage.c:149
#22 0x00003120 in record_header_write_id (p_op=0x200008ac <m_queue_data>, p_addr=0xfd0bc)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:765
#23 0x000038de in write_execute (prev_ret=0, p_op=0x200008ac <m_queue_data>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1250
#24 0x00003aa8 in queue_process (result=0)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1420
#25 0x00003b7a in fs_event_handler (p_evt=0x20000fd0 <ucHeap+1584>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1492
#26 0x0000441e in event_send (p_fs=0x2000023c <m_fs>, evt_id=NRF_FSTORAGE_EVT_WRITE_RESULT, p_src=0x200008b0 <m_queue_data+4>,
addr=1036476, len=4, p_param=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage_nvmc.c:93
#27 0x000044da in write (p_fs=0x2000023c <m_fs>, dest=1036476, p_src=0x200008b0 <m_queue_data+4>, len=4, p_param=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage_nvmc.c:144
#28 0x000041b4 in nrf_fstorage_write (p_fs=0x2000023c <m_fs>, dest=1036476, p_src=0x200008b0 <m_queue_data+4>, len=4,
p_context=0x0 <__isr_vector>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fstorage/nrf_fstorage.c:149
#29 0x000030d2 in record_header_write_begin (p_op=0x200008ac <m_queue_data>, p_addr=0xfd0bc)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:749
#30 0x000038d2 in write_execute (prev_ret=0, p_op=0x200008ac <m_queue_data>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1246
#31 0x00003aa8 in queue_process (result=0)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1420
#32 0x00003b60 in queue_start () at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1485
#33 0x00003d00 in write_enqueue (p_desc=0x0 <__isr_vector>, p_record=0x200010f4 <ucHeap+1876>, p_tok=0x0 <__isr_vector>,
op_code=FDS_OP_WRITE) at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1603
#34 0x00003f3a in fds_record_write (p_desc=0x0 <__isr_vector>, p_record=0x200010f4 <ucHeap+1876>)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/components/libraries/fds/fds.c:1926
#35 0x00000472 in test_fds (pvParameter=0x0 <__isr_vector>) at ./main.c:197
#36 0x00005028 in pxPortInitialiseStack (pxTopOfStack=0x0 <__isr_vector>, pxCode=0xa5a5a5a5, pvParameters=0xa5a5a5a5)
at ./projects/misc/nRF52840/nRF5_SDK_15.2.0_9412b96/external/freertos/portable/CMSIS/nrf52/port_cmsis.c:147
---------
(gdb) f 35
#35 0x00000472 in test_fds (pvParameter=0x0 <__isr_vector>) at ./main.c:197
197 ret = fds_record_write(NULL, &rec);
(gdb) p $sp
$1 = (void *) 0x200010e8 <ucHeap+1864>
(gdb) f 0
#0 on_write_complete () at ./main.c:127
127 fds_write_complete = 1;
(gdb) p $sp
$2 = (void *) 0x20000c8c <ucHeap+748>
(gdb) p 0x200010e8 - 0x20000c8c
$3 = 1116