Hi all,

This issue is specific to the tickless driver for STM32F7 devices.

There is a draft PR here https://github.com/apache/incubator-nuttx/pull/1380


But there is an issue with how I'm calling nxsched_alarm_expiration that
still needs to be resolved. How can I force the call to
nxsched_alarm_expiration to happen in the right interrupt context?


On Mon, Jul 6, 2020 at 4:56 PM Anthony Merlino <anth...@vergeaero.com>
wrote:

> Hi all,
>
> I am having an issue where work scheduled on the HPWORK queue stops being
> processed.
>
> The work queue is locked up inside of nxsig_timedwait(). Specifically on
> line 370 of sig_timedwait.c.  The watchdog that is scheduled to wake the
> thread back up is never firing.
>
> I know because I traced the stack once the queue was locked waiting on a
> signal and I am waiting on line 370 of sig_timedwait.c. Additionally, by
> setting the breakpoint like below and running a command from nsh> that
> queues work on the HPWORK queue, I can manually wake it back up and then it
> will start processing again.
>
>               /* Start the watchdog */
>
>               wd_start(rtcb->waitdog, waitticks,
>                        nxsig_timeout, 1, wdparm.pvarg);
>
>               /* Now wait for either the signal or the watchdog, but
>                * first, make sure this is not the idle task,
>                * descheduling that isn't going to end well.
>                */
>
>               DEBUGASSERT(NULL != rtcb->flink);
>               up_block_task(rtcb, TSTATE_WAIT_SIG); <-- waiting here
>
>               /* We no longer need the watchdog */
>
>               wd_delete(rtcb->waitdog); <-- breakpoint here
>               rtcb->waitdog = NULL;
>
> waitticks is the correct value of 6700 ticks = 6.7ms
>
> I am running an STM32F765 with a tickless, alarm-based, system clock at
> 1us/tick supporting 64-bit. I am suspicious that this particular
> combination may be the reason I am having this issue, but I don't know yet.
>
> Another data point is that when I disable CONFIG_SCHED_TICKLESS_ALARM,
> then I start hitting this assertion below from line 413 of wd_start.c
>
> #ifndef CONFIG_SCHED_TICKLESS_ALARM
>       /* There is logic to handle the case where ticks is greater than
>        * the watchdog lag, but if the scheduling is working properly
>        * that should never happen.
>        */
>
>       DEBUGASSERT(ticks <= wdog->lag);
> #endif
>
> I'll keep digging and report back if there is a core bug, but if anyone
> else has any suggestions, please let me know.
>
> Thanks,
> Anthony
>
>

Reply via email to