FreeRTOS 和一位作者和两位读者之间的同步
FreeRTOS and synchronization between one writer and two readers
我正在研究 Modbus 数据记录器,它有两个 RS-485 端口,由两个任务 modbus_0_task
和 modbus_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
我正在研究 Modbus 数据记录器,它有两个 RS-485 端口,由两个任务 modbus_0_task
和 modbus_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