FreeRTOS 互斥量使用教程
互斥量(Mutex)是一种特殊的信号量,用于管理对共享资源的访问。在 FreeRTOS 中,互斥量的句柄类型依然是 xSemaphoreHandle
。本文将详细介绍如何在 FreeRTOS 中创建和使用互斥量,并通过实例展示其运行效果。
1. 创建互斥量
在 FreeRTOS 中,创建互斥量非常简单。您只需调用 xSemaphoreCreateMutex
函数即可完成。这一函数将返回一个互斥量的句柄,用于后续的操作。
void createMutex(void)
{
if (semaphrHandle == NULL)
{
semaphrHandle = xSemaphoreCreateMutex();
}
}
2. 使用互斥量
在访问共享资源前,任务需要获取互斥量。如果互斥量已经被其他任务获取,则当前任务会被阻塞,直到互斥量被释放。
以下示例展示了三个任务如何使用互斥量来管理对共享资源的访问:
创建任务 1 及任务 3 :
创建任务 2 :
3. 运行结果
在上述示例中,假设任务 2 的优先级最高,任务 1 和任务 3 的优先级相同且低于任务 2。运行结果可能会显示大部分时间都是任务 2 在输出信息:
这是因为任务 2 的优先级最高,它在释放互斥量后立即又能获取到,导致其他两个任务无法访问共享资源。
修改:增加时间片切换或阻塞
为了避免任务 1 和任务 3 饿死,可以在任务 2 释放互斥量后增加一个切换时间片或进入阻塞状态。
任务 2 使用 vTaskDelay 阻塞状态:
任务 1 和 3 使用 taskTIELD 切换任务:
4. 验证结果
通过上述修改,可以看到任务 2 仍然是最常被系统调度运行的,但任务 1 和任务 3 也能够偶尔获取到互斥量并输出信息:
这是因为任务 2 的优先级高,所以它仍然被频繁调度。然而,由于增加了时间片切换,任务 1 和任务 3 也能被系统调度。根据 FreeRTOS 的官方文档,优先级相同的任务在调度时会优先选择等待时间较长的任务,从而确保公平性。
通过合理使用互斥量和时间片切换,您可以有效避免任务饿死问题,并实现多任务的公平调度。
对应的 demo 源码, 请点击 RtosExPro at freertos_sync_metux
也可扫码关注博主同名公众号"不解之榬",回复 “freeRTOS” 获取
希望这篇教程对您有所帮助。如果有任何疑问或需要进一步的指导,请在评论区留言,我会尽快回复。
祝您开发顺利,代码无忧!