Sunday, August 25, 2019

[Study FreeRTOS-API] 2.34 vTaskSuspendAll ()

#include "FreeRTOS.h"
#include "task.h"

void vTaskSuspendAll(void);


Summary
Suspends the scheduler.  Suspending the scheduler prevents a context switch from occurring
but leaves interrupts enabled. If an interrupt requests a context switch while the scheduler is
suspended,  then  the  request  is  held  pending  and  is  performed  only  when  the  scheduler  is
resumed (un-suspended). 


Parameters
None.


Return Values
None.


Notes
Calls  to  xTaskResumeAll()  transition  the  scheduler  out  of  the  Suspended  state  following  a
previous call to vTaskSuspendAll().
Calls  to  vTaskSuspendAll()  can  be  nested.   The  same  number  of  calls  must  be  made  to
xTaskResumeAll() as have previously been made to  vTaskSuspendAll() before the scheduler
will leave the Suspended state and re-enter the Active state.
xTaskResumeAll()  must  only  be  called  from  an  executing  task  and  therefore  must  not  be
called while the scheduler is in the Initialization state (prior to the scheduler being started).
Other FreeRTOS API functions must not be called while the scheduler is suspended.


Example 
/* A function that suspends then resumes the scheduler. */
void vDemoFunction( void )
{
/* This function suspends the scheduler. When it is called from vTask1 the scheduler is already suspended, so this call creates a nesting depth of 2. */

vTaskSuspendAll();

/* Perform an action here. */
/* As calls to vTaskSuspendAll() are nested, resuming the scheduler here will not cause the scheduler to re-enter the active state. */

xTaskResumeAll();
}
void vTask1( void * pvParameters )
{
for( ;; )
{
/* Perform some actions here. */
/* At some point the task wants to perform an operation during which it does not want to get swapped out, or it wants to access data which is also accessed from another task (but not from an interrupt). It cannot use taskENTER_CRITICAL()/taskEXIT_CRITICAL() as the length of the operation may
cause interrupts to be missed. */
/* Prevent the scheduler from performing a context switch. */

vTaskSuspendAll();

/* Perform the operation here. There is no need to use critical sections as the task has all the processing time other than that utilized by interrupt service routines.*/
/* Calls to vTaskSuspendAll() can be nested so it is safe to call a (non API) function which also contains calls to vTaskSuspendAll(). API functions should not be called while the scheduler is suspended. */

vDemoFunction(); // Non-API function

/* The operation is complete. Set the scheduler back into the Active
state. */

if( xTaskResumeAll() == pdTRUE )
{
/* A context switch occurred within xTaskResumeAll(). */
}
else
{
/* A context switch did not occur within xTaskResumeAll(). */
}
}

No comments:

Post a Comment

Back to Top