Skip to main content
Trinu
Associate II
Aug 30, 2021 5:23 AM UTC
Solved

How to use the mutex RTOS .

Hi,

I want to synchronize the my threads execution using the mutex.

here is my code

/*----------------------------------------------------------------------------
 * CMSIS-RTOS 'main' function template
 *---------------------------------------------------------------------------*/
 
#include "RTE_Components.h"
#include CMSIS_device_header
#include "cmsis_os2.h"
 #include "stm32f2xx_hal.h"
 #include "stm32f2xx_hal_gpio.h"
 #include "main.h"
 
 
 	//osMutexId_t mutex_id; 
 
/*----------------------------------------------------------------------------
 * Application main thread
 *---------------------------------------------------------------------------*/
__NO_RETURN void thread1 (void *argument) {
 (void)argument;
	
	uint32_t ii=0;
	 osMutexId_t mutex_id1; 
		__HAL_RCC_GPIOF_CLK_ENABLE(); // enabling the peripheral clock
	
	
	// gpio structure initialization
	GPIO_InitTypeDef GPIO_InitStructure;
	
	
	GPIO_InitStructure.Mode= GPIO_MODE_OUTPUT_PP ; 
	GPIO_InitStructure.Pin= GPIO_PIN_0;
	GPIO_InitStructure.Pull= GPIO_PULLUP;
	GPIO_InitStructure.Speed= GPIO_SPEED_FREQ_HIGH;
 
	HAL_GPIO_Init(GPIOF, &GPIO_InitStructure);
	
 mutex_id1 = osMutexNew (NULL);
	
 while(1)
	{
		for(ii=0;ii<100;ii++)
		{
			osMutexAcquire (mutex_id1, 100);
			HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_0);
			osDelay(100);
			osMutexRelease (mutex_id1);
		}
		ii=0;
		
	}
}
 
/*----------------------------------------------------------------------------
 * Application main thread
 *---------------------------------------------------------------------------*/
__NO_RETURN void thread2 (void *argument) {
 (void)argument;
	
	osMutexId_t mutex_id2; 
	uint32_t jj=0;
		__HAL_RCC_GPIOF_CLK_ENABLE(); // enabling the peripheral clock
 
	
	// gpio structure initialization
	GPIO_InitTypeDef GPIO_InitStructure;
 
	
	GPIO_InitStructure.Mode= GPIO_MODE_OUTPUT_PP ; 
	GPIO_InitStructure.Pin= GPIO_PIN_0;
	GPIO_InitStructure.Pull= GPIO_PULLUP;
	GPIO_InitStructure.Speed= GPIO_SPEED_FREQ_HIGH;
 
	HAL_GPIO_Init(GPIOF, &GPIO_InitStructure);
	
 mutex_id2 = osMutexNew (NULL);
	
	 while(1)
	 {
		 for(jj=0;jj<100;jj++)
		 {
				osMutexAcquire (mutex_id2,100);
				HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_0);
				osDelay(1000);
				osMutexRelease (mutex_id2);
		 }
		 jj=0;
	 }
}
 
 
 
/*----------------------------------------------------------------------------
 * Application main thread
 *---------------------------------------------------------------------------*/
__NO_RETURN void thread3 (void *argument) {
 (void)argument;
	osMutexId_t mutex_id3; 
	uint32_t kk=0;
		__HAL_RCC_GPIOF_CLK_ENABLE(); // enabling the peripheral clock
 
	
	// gpio structure initialization
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.Mode= GPIO_MODE_OUTPUT_PP ; 
	GPIO_InitStructure.Pin= GPIO_PIN_0;
	GPIO_InitStructure.Pull= GPIO_PULLUP;
	GPIO_InitStructure.Speed= GPIO_SPEED_FREQ_HIGH;
 
	HAL_GPIO_Init(GPIOF, &GPIO_InitStructure);
	
 mutex_id3 = osMutexNew (NULL);
 while(1)
	 {
		 for(kk=0;kk<100;kk++)
		 { 
				osMutexAcquire (mutex_id3, 100);
				HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_0);
				osDelay(500);
				osMutexRelease (mutex_id3);
		 }
		 kk=0;
	 }
}
 
/*----------------------------------------------------------------------------
 * Application main thread
 *---------------------------------------------------------------------------*/
__NO_RETURN static void app_main (void *argument) {
 (void)argument;
 
	osThreadNew(thread1, NULL, NULL);
	osThreadNew(thread2, NULL, NULL);
	osThreadNew(thread3, NULL, NULL);
 while(1);
}
 
 
 
int main (void) {
 
 // System Initialization
 SystemCoreClockUpdate();
 // ...
 
 osKernelInitialize(); // Initialize CMSIS-RTOS
 osThreadNew(app_main, NULL, NULL); // Create application main thread
 osKernelStart(); // Start thread execution
	while(1);
}

The output shows threads are not synchronized.

Here I am aware of linux threads(mutex) concepts.

same thing I am implemented in RTOS with little changes .

an any one help to solve this problem.

Thanks.

This topic has been closed for replies.
KnarfB
KnarfBBest answer
Super User
Aug 30, 2021 6:24 AM UTC

Create one mutex per ressource and not one per thread, i.e. make the mutex a global variable used in all 3 threads. See also https://www.keil.com/pack/doc/CMSIS/RTOS2/html/group__CMSIS__RTOS__MutexMgmt.html. Your code should also examine the return value of osMutexAcquire

, because it may fail.

hth

KnarfB

3 replies

KnarfB
KnarfBBest answer
Super User
Aug 30, 2021 6:24 AM UTC

Create one mutex per ressource and not one per thread, i.e. make the mutex a global variable used in all 3 threads. See also https://www.keil.com/pack/doc/CMSIS/RTOS2/html/group__CMSIS__RTOS__MutexMgmt.html. Your code should also examine the return value of osMutexAcquire

, because it may fail.

hth

KnarfB

Trinu
TrinuAuthor
Associate II
Aug 30, 2021 7:12 AM UTC

creating one mutex object also done but the result is same as before one.

please tell me,how to create one mutex object .

 Do you have any reference code please share with me.

Thanks

Trinu.

KnarfB
Super User
Aug 30, 2021 2:13 PM UTC

How does your code look like, how did you test it? What did you expect and what did you got?

KnarfB