configUSE_TICKLESS_IDLE

If we enable the configUSETICKLESSIDLE, it will go to ‘idle’ only when the xExpectedIdleTime >= 2. Do you think , it’s worthwhile to call the __WFI (wait for interrupt) even if the xExpectedIdleTime is < 2 (in term of power saving)? I’m running a 180Mhz cortex M3. if( xExpectedIdleTime >= configEXPECTEDIDLETIMEBEFORESLEEP ) { portSUPPRESSTICKSAND_SLEEP( xExpectedIdleTime ); } else{ __WFI(); //add wait for interrupt here }

configUSE_TICKLESS_IDLE

It may be that, in your particular application, you get some benefit from doing that, but if so I would not recommend changing the source code in that way but instead define an idle hook function that just calls wfi. Regards.

configUSE_TICKLESS_IDLE

The idle hook will be called all the time and before portSUPPRESSTICKSANDSLEEP, so it will always sleep for 1 tick time first before do any further checks. This means : – if xExpectedIdleTime < 2 : this is ok – if xExpectedIdleTime == 2 : Idle hook will sleep for 1 tick and portSUPPRESSTICKSANDSLEEP will not be called. I would like the portSUPPRESSTICKSAND_SLEEP to be called in this condition. – xExpectedIdleTime > 2 : this is ok Thanks!

configUSE_TICKLESS_IDLE

How about setting configEXPECTEDIDLETIMEBEFORESLEEP to 0 (may cause a compiler warning where the >= check is performed) then use the configPRESLEEPPROCESSING to check the expected idle time and if the expected idle time is below a threshold set by yourself it can just call wfi and cancel the tickless entry (the macros parameter can be used for cancelling the tickless entry). Regards.

configUSE_TICKLESS_IDLE

I have the same concern here but I would like to keep usage of configEXPECTEDIDLETIMEBEFORESLEEP functionnality which is interesting I beleive. I would like to get your advice on following code change proposal: – when tickless idle feature is enabled, call to the idle hook when xExpectedIdleTime is below configEXPECTEDIDLETIMEBEFORESLEEP – when tickless idle feature is not enabled, keep calling the idle hook the same way as now. The code change could look like below in portTASK_FUNCTION function of tasks.c (line 3177 of v9.0.0)?
#if ( configUSE_TICKLESS_IDLE == 0 )
    #if ( configUSE_IDLE_HOOK == 1 )
    {
        extern void vApplicationIdleHook( void );

        /* Call the user defined function from within the idle task.  This
        allows the application designer to add background functionality
        without the overhead of a separate task.
        NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES,
        CALL A FUNCTION THAT MIGHT BLOCK. */
        vApplicationIdleHook();
    }
    #endif /* ( configUSE_IDLE_HOOK == 1 ) */

/* This conditional compilation should use inequality to 0, not equality
to 1.  This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when
user defined low power mode implementations require
configUSE_TICKLESS_IDLE to be set to a value other than 1. */
#else /* configUSE_TICKLESS_IDLE != 0 */
{
TickType_t xExpectedIdleTime;

    /* It is not desirable to suspend then resume the scheduler on
    each iteration of the idle task.  Therefore, a preliminary
    test of the expected idle time is performed without the
    scheduler suspended.  The result here is not necessarily
    valid. */
    xExpectedIdleTime = prvGetExpectedIdleTime();

    if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )
    {
        vTaskSuspendAll();
        {
            /* Now the scheduler is suspended, the expected idle
            time can be sampled again, and this time its value can
            be used. */
            configASSERT( xNextTaskUnblockTime >= xTickCount );
            xExpectedIdleTime = prvGetExpectedIdleTime();

            if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )
            {
                traceLOW_POWER_IDLE_BEGIN();
                portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );
                traceLOW_POWER_IDLE_END();
            }
            else
            {
                mtCOVERAGE_TEST_MARKER();
                #if ( configUSE_IDLE_HOOK == 1 )
                {
                    extern void vApplicationIdleHook( void );

                    /* Call the user defined function from within the idle task.  This
                    allows the application designer to add background functionality
                    without the overhead of a separate task.
                    NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES,
                    CALL A FUNCTION THAT MIGHT BLOCK. */
                    vApplicationIdleHook();
                }
                #endif /* configUSE_IDLE_HOOK */
            }
        }
        ( void ) xTaskResumeAll();
    }
    else
    {
        mtCOVERAGE_TEST_MARKER();
    }
}
#endif /* configUSE_TICKLESS_IDLE */
Regards.

configUSE_TICKLESS_IDLE

Hi – thanks for your input, although I doubt this would be adopted because it would change the existing behaviour, which could cause issues for users that update the version of FreeRTOS they are using in existing applications.