Description
I am using upstream FreeRTOS with the SMP work merged into main (and using PR #1530 to fix the renaming of a FreeRTOS config).
I've successfully managed to convert the NTP client example Pico W example from its original LwIP raw API form to one using NO_SYS=0 FreeRTOS SMP and the LwIP socket API. In the process, I discovered that if I tried calling cyw43_arch_init
from main()
, the pico would hard crash with no output whatsoever. It worked fine if called from a FreeRTOS task.
I rigged up a second pico as a debug probe, and found a hard_assert
that was failing in async_context_freertos_execute_sync
. Specifically:
hard_assert(xSemaphoreGetMutexHolder(self->lock_mutex) != xTaskGetCurrentTaskHandle());
When called from main()
or outside of a FreeRTOS task, xTaskGetCurrentTaskHandle()
returns 0, and in general I'm seeing xSemaphoreGetMutexHolder(self->lock_mutex)
return 0 during initialization (as apparently no tasks have claimed the mutex). This clearly leads to the hard_assert to fire when calling async_context_freertos_execute_sync
outside of a FreeRTOS task.
Is this intentional? I'm also not 100% sure what that hard_assert
is checking. Is it to catch some sort of recursive calling/deadlock (although I don't see that mutex being claimed during init-- maybe it is in other execution paths?)?