FreeRTOS 和一位作者和两位读者之间的同步

FreeRTOS and synchronization between one writer and two readers

我正在研究 Modbus 数据记录器,它有两个 RS-485 端口,由两个任务 modbus_0_taskmodbus_1_task 处理。两个任务都使用共享 data_descriptors 数组(仅用于读取)。这些任务将在下面称为“readers”。

还有另一个任务 config_keeper_task 更新 data_descriptors 数组(读写)。此任务在下文中称为“writer”。

此时我有 单个互斥锁 保护 data_descriptors 数组不被超过 1 个任务访问。

一切正常,但有一个副作用。当一个“reader”获取互斥体时 - 另一个“reader”必须等待。这是没有必要的。他们只应在“作者”有权访问时等待。

我该如何解决这个问题?

我正在考虑计算最大值和初始值为 2 的信号量。

两个 reader 一次,所以我的数组可以同时被两个读取。

Writer 获取信号量两次(并等待所有 readers 完成)。当它完成时 - 它给出信号量 2 次。

这是正常的做法吗?

所以经过几次实验和一些研究后,我知道我需要 read/write 锁模式,并且有两种类型的简单 r/w 锁适用于 FreeRTOS。

首先可以用更少的资源实现:1 个互斥量和 1 个信号量。 Reader 优先级 当 reader 和 writer 同时需要访问时。

第二个需要更多一点:2 个互斥量和 2 个信号量。 Writer 具有优先权 并且 readers 必须等到 writer 完成(实际上是所有 writer,因为不止 1 个 writer 可以等待访问)。

我发现为 FreeRTOS 编写的实现很少,并且(为了充分理解它的工作原理)我已经完全重写了它以适合我的项目。

这是我最喜欢的 Michael Becker 实现:

https://github.com/michaelbecker/freertos-addons/blob/master/c/Source/read_write_lock.c