gpt4 book ai didi

c - 非连续数据结构

转载 作者:行者123 更新时间:2023-11-30 15:22:41 25 4
gpt4 key购买 nike

我正在编写一些代码,从各种传感器中提取数据并将该数据存储在 SD 卡上。所有传感器值至少属于一组(或“表”)。例如,有一个包含所有电压的“电压”表。只能从传感器接收整个表格,并且只能将整个表格保存到 SD 卡。

所有传感器值都存储在一个巨大的结构中。该结构是连续的,但特定表的成员不一定是连续的。例如,

Value Name  |   Table Number
-----------------------------
Value 1 | 1
Value 2 | 1
Value 3 | 2
Value 4 | 2
Value 5 | 1
Value 6 | 2
Value 7 | 1

我正在使用实时内核。我想要一项维护各种表的任务和一项将内容保存到 SD 卡的任务。当请求给定的表时,我希望“表任务”将某种句柄传递给“SD 卡任务”。

所以我的问题是:是否有一种相当简单的方法来为不连续的数据结构创建句柄?

这是传感器值的整个结构的示例(实际上有大约 600 个值和 200 个表。表可以重叠):

typedef struct __attribute__ ((__packed__)) {
uint8_t vsys[3]; // Member of Voltage table
uint16_t cursys[3]; // Member of Current table
uint32_t cur1; // Member of Current table
uint16_t v1; // Member of Voltage table
uint16_t cur2; // Member of Current table
} housekeeping_t;

函数为(例如)hk_handle_t get_Voltages();hk_handle_t get_currents();

我无法更改从传感器收集数据的方式。只是它如何到达 SD 卡。

可靠性高于一切

最佳答案

我认为您想要将结构(数组)传递给函数,以便它序列化字段的参数化子集?

实现此目的的一种方法是将包含相对成员偏移量和大小的字段描述符数组传递给通用函数。在 C(++) 中,您可以利用 offsetof 宏来帮助您完成此操作。

例如沿着这些思路:

struct record {
int apple1, orange1;
int apple2, orange2;
};

struct field { size_t offset, size; };
#define FIELD(id) { offsetof(struct record, id), sizeof(struct record, id) }
#define SENTINEL() { 0, 0 }

const struct field apples[] = { FIELD(apple1), FIELD(apple2), SENTINEL() };
const struct field oranges[] = { FIELD(orange1), FIELD(orange2), SENTINEL() };

void write_subset(FILE *file, const struct record *record, const struct field *fields) {
for(; fields->size; ++fields)
fwrite((const char *) record + fields->offset, fields->size, 1, file);
}

当然有很多替代选择。您可能会包含类型说明符来执行可移植 I/O,或者创建原始字节掩码,或者为每个字段集定义一个函数,并为 I/O 任务设置回调,等等。正如您可能想象的那样,如果没有更多细节,很难给出好的建议。

关于c - 非连续数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29127649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com