meierbenjamin wrote on Thursday, February 09, 2012:
Hi all,
I am running FreeRTOS successfully on a STM32F103CBT6 using Keil uVision.
I use the SPI from two different tasks. To ensure only one task is accessing the SPI at a time i use a Mutex.
So far so good.
From the flash.c-file of the demonstration i got the following function.
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
{
unsigned portSHORT usBit;
vTaskSuspendAll();
{
if( uxLED < partstMAX_OUTPUT_LED )
{
usBit = partstFIRST_LED << uxLED;
if( usOutputValue & usBit )
{
usOutputValue &= ~usBit;
}
else
{
usOutputValue |= usBit;
}
GPIO_Write( GPIOC, usOutputValue );
}
}
xTaskResumeAll();
}
I am wondering about the use of the SuspendAll / ResumeAll calls. What exactly are they for in this application? I see two possible explanations.
1) To ensure no other task is currently accessing the usOutputValue-variable.
2) To ensure no other task is currently calling the GPIO_Write-function.
I think the GPIO_Write-function shouldn’t be the reason, there is no read modify-write operation in the function.
void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal)
{
GPIOx->ODR = PortVal;
}
When exactly do I need to use such a “critical section” ?
Thanks for clearing my confusion.
Benjamin