FreeRTOS 体验教程:3.如何用互斥量实现FreeRTOS多线程访问共享资源?

FreeRTOS 互斥量使用教程

互斥量(Mutex)是一种特殊的信号量,用于管理对共享资源的访问。在 FreeRTOS 中,互斥量的句柄类型依然是 xSemaphoreHandle。本文将详细介绍如何在 FreeRTOS 中创建和使用互斥量,并通过实例展示其运行效果。

1. 创建互斥量

在 FreeRTOS 中,创建互斥量非常简单。您只需调用 xSemaphoreCreateMutex 函数即可完成。这一函数将返回一个互斥量的句柄,用于后续的操作。
image.png

void createMutex(void)
{
	if (semaphrHandle == NULL)
	{
		semaphrHandle = xSemaphoreCreateMutex();
	}
}

2. 使用互斥量

在访问共享资源前,任务需要获取互斥量。如果互斥量已经被其他任务获取,则当前任务会被阻塞,直到互斥量被释放。

以下示例展示了三个任务如何使用互斥量来管理对共享资源的访问:
创建任务 1 及任务 3 :
image.png

创建任务 2 :
image.png

3. 运行结果

在上述示例中,假设任务 2 的优先级最高,任务 1 和任务 3 的优先级相同且低于任务 2。运行结果可能会显示大部分时间都是任务 2 在输出信息:
image.png

这是因为任务 2 的优先级最高,它在释放互斥量后立即又能获取到,导致其他两个任务无法访问共享资源。

修改:增加时间片切换或阻塞

为了避免任务 1 和任务 3 饿死,可以在任务 2 释放互斥量后增加一个切换时间片或进入阻塞状态。
任务 2 使用 vTaskDelay 阻塞状态:
image.png

任务 1 和 3 使用 taskTIELD 切换任务:
image.png

4. 验证结果

通过上述修改,可以看到任务 2 仍然是最常被系统调度运行的,但任务 1 和任务 3 也能够偶尔获取到互斥量并输出信息:
image.png

这是因为任务 2 的优先级高,所以它仍然被频繁调度。然而,由于增加了时间片切换,任务 1 和任务 3 也能被系统调度。根据 FreeRTOS 的官方文档,优先级相同的任务在调度时会优先选择等待时间较长的任务,从而确保公平性。

通过合理使用互斥量和时间片切换,您可以有效避免任务饿死问题,并实现多任务的公平调度。

对应的 demo 源码, 请点击 RtosExPro at freertos_sync_metux

也可扫码关注博主同名公众号"不解之榬",回复 “freeRTOS” 获取
不解之榬


希望这篇教程对您有所帮助。如果有任何疑问或需要进一步的指导,请在评论区留言,我会尽快回复。

祝您开发顺利,代码无忧!

  • 27
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值