互斥量也叫互斥锁,顾名思义就是用于锁住一些东西的锁住了就不能动了,就好比你去上厕所进去了之后就不能放别人进去了(指正常情况有些特殊的癖好的人例外dog)。接下来我们到工程中去看看。
/* 下面的部分是创建任务一和任务二相关的信息如名字大小等 */
osThreadId_t LED1Handle;
const osThreadAttr_t LED1_attributes = {
.name = "LED1",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityAboveNormal,
};
/* Definitions for LED2 */
osThreadId_t LED2Handle;
const osThreadAttr_t LED2_attributes = {
.name = "LED2",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* 下面的这个部分是创建一个互斥量相关的句柄信息 */
osMutexId_t myMutex01Handle;
const osMutexAttr_t myMutex01_attributes = {
.name = "myMutex01"
};
/* 创建互斥量 */
myMutex01Handle = osMutexNew(&myMutex01_attributes);
/* 创建任务一和任务二 */
LED1Handle = osThreadNew(LED_Task1, NULL, &LED1_attributes);
LED2Handle = osThreadNew(LED_Task2, NULL, &LED2_attributes);
/* 下面是任务一和任务二的函数 */
void LED_Task1(void *argument)
{
while(1)
{
vTaskDelay(10);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8,GPIO_PIN_RESET);//点亮LED绿灯
}
}
void LED_Task2(void *argument)
{
while (1)
{
xSemaphoreTake(myMutex01Handle,portMAX_DELAY);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7,GPIO_PIN_RESET);//点亮led红灯
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7,GPIO_PIN_SET);
xSemaphoreGive(myMutex01Handle);
}
}
我们不难从代码中看出这个代码控制任务一应该是高优先级任务二优先级较低。但是由于加上了阻塞赋值应该跑任务二然后返回任务二先上锁然后开灯关灯解锁执行任务一这个过程。
上电看一下效果
ok一直处于绿色的状态那么造成这种结果的原因是什么呢?
上示波器看看首先看PE7
原来是在高低电平之间飞速转换(共阳极接法低电平有效)
然后看PE8可以看出也是收到一点影响但是很微小。毕竟还是会被锁住的那一小会儿影响到。