【发布时间】:2019-03-11 09:52:35
【问题描述】:
我正在编写一个在 FreeRTOS 上运行的应用程序,其中我有不同的线程,它们都必须访问(读取和写入)相同的数据结构。 所以我想我可以实现一个全局数据存储,将所有数据保存在一些分组结构中。我也考虑过使用 SQLite 之类的东西,但我认为这对我的应用程序来说太过分了。
不过还是有一些悬而未决的问题
- 为了保证线程安全,我假设我需要为我的读写访问添加一个信号量,但是...
- 如果线程只需要更新结构的某些元素,我需要将一个指向该结构的指针交给它,但是一旦我开始使用指针引用,我就不能再用信号量来保护我的访问了。那么如何在不违反线程安全的情况下允许线程修改单个结构元素呢?
- 有没有比我计划使用的更好的方法来获得类似
global store的东西?谷歌没有给出太多提示。
【问题讨论】:
-
信号量有什么问题?它在 FreeRTOS 中受支持。结构的数量是多少?
-
我将其分为 6 个结构(有些较大有些较小)。我对信号量的问题(也许我错了)是,我将如何通过受信号量保护的指针引用修改数据?在修改结构之前从线程向
lock()和unlock()添加一个函数?原因如果我按值修改数据,我会向存储中添加一个函数,如void version_info_to_store(version_info data),然后将信号量锁定在此函数中。 -
信号量的保护是组织问题。您不会直接保护结构不被访问,而是使用信号量作为标志“结构当前正在使用”。该标志不是简单的变量而是信号量,以确保任务切换不会在
if和flag = 1之间命中:if ( flag == 0 ) { flag = 1; modify_structure; flag = 0; }。您必须保证对结构的每次访问都受到同一个信号量的保护——这就是“组织”。 (注意:这只是一个解决方案,可能不是最好的。) -
所以修改任务是在修改存储之前请求访问结构?这就是我在商店本身中实现的
lock()和unlock()函数的意思。 -
是的,我认为它是相似的。不确定一个全局信号量(锁定/解锁)是否适用于所有结构,或者为每个结构提供单独的保护是否会更好。