c - 嵌入式C数据存储模块设计

标签 c database embedded

我正在设计一个嵌入式 C 数据存储模块。它将被想要访问此“共享”系统范围数据的文件/模块包含。多个任务聚合了数十个输入(GPIO、CAN、I2C/SPI/SSP 数据等)并使用 API 存储这些值。然后,其他任务可以通过 API 安全地访问数据。该系统是带有 RTOS 的嵌入式应用程序,因此使用互斥体来保护数据。无论实现如何,这些想法都会被使用

我过去设计过类似的东西,我正在努力改进它。目前,我的新实现工作进行到一半,遇到了一些小问题,我真的会从全新的视角中受益。

此模块要求的简要说明:

  • 理想情况下,应该有一个接口(interface)可以访问变量(一次获取,一次设置)。
  • 我想返回不同的变量类型( float 、整数等)。这意味着可能需要宏。
  • 我对代码空间没有压力,但这总是一个问题
  • 快速获取/设置绝对是最重要的(这意味着在字符串中存储 ala xml/json 已经过时了)
  • 在运行时不需要添加新的变量。一切都在启动时静态定义

    问题是您将如何着手设计这样的东西?枚举、结构、访问器、宏等?我这里不是找代码,只是讨论一下总体的总体设计思路。如果互联网上有解决此类问题的解决方案,也许只需要一个链接就足够了。

  • 最佳答案

    我自己遇到过几次这种情况。每次我结束“自己动手”时,我绝对不会患上非此处发明 (NIH) 综合症。有时,空间、处理周转时间或可靠性/可恢复性要求只是使这条路径成为最不痛苦的路径。

    所以,与其写关于这个主题的伟大美国小说,我只是在这里抛出一些想法,因为你的问题非常广泛(但至少感谢你提出一个问题并提供背景)。

    C++ 上 table 了吗?内联函数、模板和一些 Boost 库在这里可能会有用。但我猜这是直接的 C。

    如果您使用的是 C99,您至少可以使用内联函数,在类型安全方面,内联函数比宏高出一步。

    您可能想考虑使用多个互斥锁来保护数据的不同部分;即使更新速度很快,您也可能希望将数据分成多个部分(例如配置数据、初始化数据、错误日志记录数据、跟踪数据等)并为每个部分提供自己的互斥锁,从而减少漏斗/阻塞点。

    您还可以考虑让对数据的所有访问都通过服务器任务。所有读写都通过与服务器任务通信的 API。服务器任务从其队列中按顺序拉取读取和写入请求,通过写入 RAM 镜像快速处理它们,在需要时发送响应(至少对于读取请求),然后在必要时在后台将数据缓冲到 NVM。与简单的互斥量相比听起来很重量级,但它在某些用例中有其优势。对您的应用程序了解不够,无法知道这是否可能。

    我要说的一件事是通过标签获取/设置的想法(例如,可能是枚举列表,如 CONFIG_DATA、ADDRESS_DATA 等)是从直接寻址数据(例如“给我 256地址 ox42000 的字节数)。我见过许多商店在整个物理寻址方案最终崩溃时遭受巨大痛苦,他们需要重构/重新设计。尽量让“什么”与“如何”分离"- 客户不必知道或关心东西存储在哪里、有多大等。(您可能已经知道所有这些,如果是的话抱歉,我只是一直看到它...)

    最后一件事。你提到了互斥量。当心优先级倒置……在某些情况下,这会使那些“快速访问”花费很长时间。大多数内核互斥锁实现允许您考虑到这一点,但默认情况下通常不会启用它。再次抱歉,如果这是旧消息...

    关于c - 嵌入式C数据存储模块设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4798640/

    相关文章:

    java - 如何在Android中使用.so文件

    c - 未定义的函数在内核linux中插入新模块

    将 C realloc 转换为 Delphi

    c - 内存泄漏调试

    c - 如何确定内联汇编在何处/针对什么可以提供更高的执行速度?

    c - 如何测试 C 函数是否可链接

    python - 假设我在数据库中有 400 行人名。搜索他们姓名的最佳方式是什么?

    database - Sqlite,从当前时间减去日期实体

    mysql - 如何考虑另一表中的值来计算一列的值

    c - 是什么让 SPI 比 I2C 协议(protocol)更快