互斥量Mutexes
一,FreeRTOS 基本设置
先使能互斥量和互斥递归
然后添加这两项
二,写代码
void StartDefaultTask_KEY(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask_KEY */
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin((GPIO_TypeDef *)GPIOC, (uint16_t) GPIO_PIN_9) == 1)
{
osDelay(100);
if(HAL_GPIO_ReadPin((GPIO_TypeDef *)GPIOC, (uint16_t) GPIO_PIN_9) == 1)
{
osThreadSuspendAll();
printf("\n按键成功\n");
osThreadResumeAll();
//======================获得============================
//osMutexWait === > 获取互斥对象或等待它变为可用
if((osMutexWait(myMutex01Handle,osWaitForever) == osOK))
{
osThreadSuspendAll();
printf("\n获得成功\r\n");
osThreadResumeAll();
}else
{
osThreadSuspendAll();
printf("\n获得失败\r\n");
osThreadResumeAll();
}
//======================释放============================
//osMutexRelease === > 释放一个互斥量
if((osMutexRelease(myMutex01Handle) == osOK))
{
osThreadSuspendAll();
printf("\n释放成功\r\n");
osThreadResumeAll();
}else
{
osThreadSuspendAll();
printf("\n释放失败\r\n");
osThreadResumeAll();
}
while(HAL_GPIO_ReadPin((GPIO_TypeDef *)GPIOC, (uint16_t) GPIO_PIN_9) == 1)
{
osDelay(100);
}
}
}
/* USER CODE END StartDefaultTask_KEY */
}
}
三,结果
只能获得一次,释放一次,且是相同的那个
互斥递归锁Recursive Mutexes
一,FreeRTOS 基本设置
二,写代码
优先级:让打印2优先级大于打印1
并且让它多次获得,释放互斥递归锁
void StartDefaultTask_KEY(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask_KEY */
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin((GPIO_TypeDef *)GPIOC, (uint16_t) GPIO_PIN_9) == 1)
{
osDelay(100);
if(HAL_GPIO_ReadPin((GPIO_TypeDef *)GPIOC, (uint16_t) GPIO_PIN_9) == 1)
{
osThreadSuspendAll();
printf("\n按键成功\r\n");
osThreadResumeAll();
osThreadResume(myTask02Handle);
osThreadResume(myTask03Handle);
//======================获得============================
if((osRecursiveMutexWait(myRecursiveMutex01Handle,osWaitForever) == osOK))
{
osThreadSuspendAll();
printf("\n获得成功\r\n");
osThreadResumeAll();
}else
{
osThreadSuspendAll();
printf("\n获得失败\r\n");
osThreadResumeAll();
}
//======================获得============================
if((osRecursiveMutexWait(myRecursiveMutex01Handle,osWaitForever) == osOK))
{
osThreadSuspendAll();
printf("\n获得成功\r\n");
osThreadResumeAll();
}else
{
osThreadSuspendAll();
printf("\n获得失败\r\n");
osThreadResumeAll();
}
//======================释放============================
if((osRecursiveMutexRelease(myRecursiveMutex01Handle) == osOK))
{
osThreadSuspendAll();
printf("\n释放成功\r\n");
osThreadResumeAll();
}else
{
osThreadSuspendAll();
printf("\n释放失败\r\n");
osThreadResumeAll();
}
//======================释放============================
if((osRecursiveMutexRelease(myRecursiveMutex01Handle) == osOK))
{
osThreadSuspendAll();
printf("\n释放成功\r\n");
osThreadResumeAll();
}else
{
osThreadSuspendAll();
printf("\n释放失败\r\n");
osThreadResumeAll();
}
while(HAL_GPIO_ReadPin((GPIO_TypeDef *)GPIOC, (uint16_t) GPIO_PIN_9) == 1)
{
osDelay(100);
}
}
}
/* USER CODE END StartDefaultTask_KEY */
}
}
三,结果
打印2在前,且获得,释放成功多次
总结
互斥锁
理论
1,谁获得,只能谁释放
2,可以提高等待任务的优先级
函数
osMutexWait() ===> 获得互斥量
osMutexRelease() ===> 释放互斥量
互斥递归锁
理论
1,谁获得,只能谁释放
2,可以提高等待任务的优先级
3,可以连续获得,但是获得几次必须释放几次
函数
osRecursiveMutexWait() ===> 获得互斥递归锁
osRecursiveMutexRelease() ===> 释放互斥递归锁