我正在编写一个在FreeRTOS上运行的应用程序,我有不同的线程,所有人都必须访问(读取和写入)相同的数据结构。所以我认为我可以实现一个全局数据存储,将所有数据保存在某些分组结构中。我还想过使用像SQLite这样的东西,但我觉得这对我的应用来说太过分了。
然而,有一些悬而未决的问题
global store
?谷歌没有提供太多提示。让我与您分享处理此类场景的最常见的C方式。
为了避免暴露大量全局数据,请使用opaque pointer
s并获得一个API列表,这些API将不透明指针作为参数。通过这种方式,您可以使用一组干净的API来访问所有结构,只将实现细节留在.c文件中。使用不透明指针的好处是没有人知道如何处理指向数据的类型,除了将不透明指针作为参数的API。这为您的结构提供了保护和封装,因此您可以使用您提供的API访问或更改它们。
在由不透明指针标识的每个结构定义中,具有mutex
(FreeRTOS具有以信号量方式实现的互斥锁)以线程安全的方式访问结构成员。创建互斥锁时必须使用xSemaphoreCreateMutex
。在您想要访问可能由多个任务访问的成员数据时,在所有API中使用xSemaphoreGive
和xSemaphoreTake
。