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