关于FreeRTOS的互斥量相关的使用

互斥量也叫互斥锁,顾名思义就是用于锁住一些东西的锁住了就不能动了,就好比你去上厕所进去了之后就不能放别人进去了(指正常情况有些特殊的癖好的人例外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可以看出也是收到一点影响但是很微小。毕竟还是会被锁住的那一小会儿影响到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值