【FreeRTOS学习 - 互斥量学习 (优先级继承-自锁-死锁-递归锁)】

跟着韦东山老师FreeRTOS教学资料的学习记录

FreeRTOS全部项目代码链接(更新中)

https://gitee.com/chenshao777/free-rtos_-study


一、优先级继承

例:
有A、B、C三个任务,优先级分别是 1、2、3,且A持有互斥锁,B和C一开始都故意延时,让A得以运行(这样低优先级的A就能先获得互斥锁)

  • 首先C执行,然后故意阻塞一段时间
  • 接着B执行,再阻塞一段时间
  • A得以运行,获取互斥锁,接着被C抢占
  • C尝试获得互斥锁,失败,则让A暂时继承C的优先级
  • A抢占B执行,然后释放互斥锁,A优先级恢复
  • C获得互斥锁,开始运行

二、自锁

  • 如果A获得锁
  • A调用了某个函数
  • 该函数又要获得锁才能运行,则等待A释放锁
  • 自锁产生

三、死锁

  • A获得锁1
  • B获得锁2
  • A需要锁2才能接着运行,于是等待B释放锁2
  • B需要锁1才能接着运行,于是等待A释放锁1
  • 死锁产生

四、递归锁

递归锁真正意义上实现了 谁的锁谁来开
递归锁的使用函数

/* 创建一个递归锁,返回它的句柄。
 * 此函数内部会分配互斥量结构体 
 * 返回值: 返回句柄,非NULL表示成功
 */
SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void );


/* 释放 */
BaseType_t xSemaphoreGiveRecursive( SemaphoreHandle_t xSemaphore );

/* 获得 */
BaseType_t xSemaphoreTakeRecursive( SemaphoreHandle_t xSemaphore,
                   				    TickType_t xTicksToWait);

例:

  • 任务1优先级最高,先运行,获得递归锁

  • 任务1阻塞,让任务2得以运行

  • 任务2运行,看看能否获得别人持有的递归锁:不能

  • 任务2故意执行"give"操作,看看能否释放别人持有的递归锁:不能

  • 任务2等待递归锁

  • 任务1阻塞时间到后继续运行,使用循环多次获得、释放递归锁

  • 递归锁在代码上实现了:谁持有递归锁,必须由谁释放。

你可能感兴趣的:(FreeRTOS,FreeRTOS,stm32,嵌入式,互斥量,递归锁)