非连续数据结构

时间:2015-03-18 16:35:29

标签: c data-structures

我正在研究一些代码,这些代码从各种传感器中提取数据并将数据存储在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卡。

可靠性高于一切

1 个答案:

答案 0 :(得分:1)

我认为你想把一个(array-of-)结构传递给一个函数,以便它序列化一个参数化的字段子集?

这样做的一种方法是将包含相对成员偏移量和大小的字段描述符数组传递给泛型函数。在C(++)中,您可以利用offsetof宏来帮助您。

E.g。这些方面的东西:

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任务的回调等。正如您可能想象的那样,如果没有更多细节,很难获得好的建议。