簡體   English   中英

非連續數據結構

[英]Non Contiguous Data Structure

我正在處理一些代碼,這些代碼從各種傳感器中提取數據並將其存儲在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卡。

可靠性高於一切

我認為您想將(array-of-)結構傳遞給函數,以便它對字段的參數化子集進行序列化?

一種方法是將包含相對成員偏移量和大小的字段描述符數組傳遞給泛型函數。 在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任務的回調的字段集定義函數,等等。您可能會想像,如果沒有更多細節,很難給出好的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM