FreeRTOS系统
一.简绍
互斥锁,谁获得的消息谁来释放
递归互斥锁,可以连续获得两次,同时释放的时候也释放两次
二.STM32CubMx配置
1.准备
2.添加互斥锁
2添加递归互斥锁
三.互斥锁
1.代码
void StartDefaultTask_KEY1(void const * argument)
{
osSemaphoreId semaphore = (osSemaphoreId) argument;
for(;;)
{
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1 )
{
osDelay(10);
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1 )
{
osThreadSuspendAll();
printf("\nkey1按下\n");
osThreadResumeAll();
osThreadResume(myTask01Handle);
osThreadResume(myTask02Handle);
//=================获得====================
if(osMutexWait(myMutex011Handle, osWaitForever) == osOK)
{
osThreadSuspendAll();
printf("获得成功\n");
osThreadResumeAll();
}
else
{
osThreadSuspendAll();
printf("获得失败\n");
osThreadResumeAll();
}
//=================释放====================
if(osMutexRelease(myMutex011Handle) == osOK)
{
osThreadSuspendAll();
printf("释放成功\n");
osThreadResumeAll();
}
else
{
osThreadSuspendAll();
printf("释放失败\n");
osThreadResumeAll();
}
while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1)
{
osDelay(1);
}
}
}
osDelay(1);
}
/* USER CODE END StartDefaultTask_KEY1 */
}
void StartTask01(void const * argument)
{
/* USER CODE BEGIN StartTask01 */
/* Infinite loop */
for(;;)
{
osThreadSuspend(NULL);
osThreadSuspendAll();
printf("我是任务1\n");
osThreadResumeAll();
osDelay(1);
}
/* USER CODE END StartTask01 */
}
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
osThreadSuspend(NULL);
osThreadSuspendAll();
printf("我是任务2\n");
osThreadResumeAll();
osDelay(1);
}
/* USER CODE END StartTask02 */
}
只能获得一次释放一次,只有在释放完成后才可以大家都共享信号量
2.测试
当存在获取两次信号的时候,就会阻塞
四.递归互斥锁
1.代码
void StartDefaultTask_KEY1(void const * argument)
{
osSemaphoreId semaphore = (osSemaphoreId) argument;
for(;;)
{
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1 )
{
osDelay(10);
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1 )
{
osThreadSuspendAll();
printf("\nkey1按下\n");
osThreadResumeAll();
osThreadResume(myTask01Handle);
osThreadResume(myTask02Handle);
//=================获得====================
if(osRecursiveMutexWait(myRecursiveMutex01Handle, osWaitForever) == osOK)
{
osThreadSuspendAll();
printf("获得成功\n");
osThreadResumeAll();
}
else
{
osThreadSuspendAll();
printf("获得失败\n");
osThreadResumeAll();
}
//=================获得====================
if(osRecursiveMutexWait(myRecursiveMutex01Handle, osWaitForever) == osOK)
{
osThreadSuspendAll();
printf("获得成功\n");
osThreadResumeAll();
}
else
{
osThreadSuspendAll();
printf("获得失败\n");
osThreadResumeAll();
}
//=================释放====================
if(osRecursiveMutexRelease(myRecursiveMutex01Handle) == osOK)
{
osThreadSuspendAll();
printf("释放成功\n");
osThreadResumeAll();
}
else
{
osThreadSuspendAll();
printf("释放失败\n");
osThreadResumeAll();
}
//=================释放====================
if(osRecursiveMutexRelease(myRecursiveMutex01Handle) == osOK)
{
osThreadSuspendAll();
printf("释放成功\n");
osThreadResumeAll();
}
else
{
osThreadSuspendAll();
printf("释放失败\n");
osThreadResumeAll();
}
while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1)
{
osDelay(1);
}
}
}
osDelay(1);
}
/* USER CODE END StartDefaultTask_KEY1 */
}