Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在打包/解包结构之间切换_C_C99_Structure_Packed - Fatal编程技术网

C 在打包/解包结构之间切换

C 在打包/解包结构之间切换,c,c99,structure,packed,C,C99,Structure,Packed,我在EEPROM(4KB)中有很多配置数据,我以压缩结构读取这些数据。在我的整个固件中,我需要非常频繁地读取/更改这些值,并且打包结构的性能不是最优的,所以我有第二个完全相同的结构,只是没有打包。我必须将每个值一个接一个地从打包结构复制到未打包结构,这很容易出错,因为当我向打包结构添加值时,我还必须记住将其添加到复制函数中 有更智能的方法吗?这是一种使用预编译器的超智能方法: mydata字段 mydata.h 更新:只要有点想象力,您甚至可以编写一个通用的packed.h,它接收结构和字段文件

我在EEPROM(4KB)中有很多配置数据,我以压缩结构读取这些数据。在我的整个固件中,我需要非常频繁地读取/更改这些值,并且打包结构的性能不是最优的,所以我有第二个完全相同的结构,只是没有打包。我必须将每个值一个接一个地从打包结构复制到未打包结构,这很容易出错,因为当我向打包结构添加值时,我还必须记住将其添加到复制函数中


有更智能的方法吗?

这是一种使用预编译器的超智能方法:

mydata字段 mydata.h 更新:只要有点想象力,您甚至可以编写一个通用的packed.h,它接收结构和字段文件的名称作为参数:

包装水提取物 然后简单地在真实文件中:

mydata.h 如果您有很多打包/解包结构,并且希望避免一些键入,那么这将非常有用


一个不那么糟糕的解决方案是编写一个脚本(用Python!),从某个输入文本文件中的字段规范生成代码。

这是一种非常聪明的方法,使用预编译器:

mydata字段 mydata.h 更新:只要有点想象力,您甚至可以编写一个通用的packed.h,它接收结构和字段文件的名称作为参数:

包装水提取物 然后简单地在真实文件中:

mydata.h 如果您有很多打包/解包结构,并且希望避免一些键入,那么这将非常有用


一个不那么糟糕的解决方案是编写一个脚本(用Python!),从某个输入文本文件中的字段规范生成代码。

你能举一个这样的结构的例子吗?@Joshua,你是如何确定糟糕的性能与压缩结构有关的?您的eeprom内存是否映射到您的平台上?@PatrickB。不,EEPROM不是内存映射的,可能是过早的优化,但我到处都能看到对压缩结构成员的访问速度很慢,因为这些值不是内存对齐的。问题还不是很清楚,而且与C没有多大关系。你能详细说明并提供一些例子吗?无论如何,在你做这些之前,你真的应该做一些基准测试。与访问EEPROM本身相比,压缩性能的影响可能微不足道。你能举一个这样的结构的例子吗?@Joshua,你是如何确定性能差与压缩结构有关的?您的eeprom内存是否映射到您的平台上?@PatrickB。不,EEPROM不是内存映射的,可能是过早的优化,但我到处都能看到对压缩结构成员的访问速度很慢,因为这些值不是内存对齐的。问题还不是很清楚,而且与C没有多大关系。你能详细说明并提供一些例子吗?无论如何,在你做这些之前,你真的应该做一些基准测试。与访问EEPROM本身相比,压缩性能的影响可能可以忽略不计。
FIELD(int, one)
FIELD(char, two)
FIELD(long, three)
#define FIELD(t, n) t n;
struct MyData
{
#include "mydata-fields.h"
};
struct __attribute__((packed)) MyDataPacked /*or whatever your compiler needs */
{
#include "mydata-fields.h"
};
#undef FIELD

#define FIELD(t, n) a->n = b->n;
static inline void Unpack(MyData *a, MyDataPacked *b)
{
#include "mydata-fields.h"
}
static inline void Pack(MyDataPacked *a, MyData *b)
{
#include "mydata-fields.h"
}
#undef FIELD
/* ... */
struct UNPACKED
{
#include FIELDS_H
};
/* and so on... */
#define UNPACKED MyData
#define PACKED MyDataPacked
#define FIELDS_H "mydata-fields.h"
#include "packed.h"
#undef FIELDS_H
#undef PACKED
#undef UNPACKED