Use of vTaskSuspendAll on hardware access?

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

rtel wrote on Saturday, February 11, 2012:

usOutputValue is a file scope variable, so you are correct in your assumption that it protects against multiple access of the usOutputValue variable. 

Regards.