跟着韦东山老师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阻塞时间到后继续运行,使用循环多次获得、释放递归锁
-
递归锁在代码上实现了:谁持有递归锁,必须由谁释放。