我想将数据从闪存复制到RAM(微控制器)的结构中。我有结构初始化:
typedef struct Day{
long AM : 24;
long PM : 24;
}Day;
struct Data{
unsigned long Lang : 8;
struct Day dawt[7];
}Data;
使用此功能从闪存加载到RAM中
void LoadFromFlash(){
int count;
memcpy(Data.Lang, F_DATA, 1);
for(count = 0; count < 7; count++){
memcpy(Data.dawt[count].AM, F_DATA, 3);
memcpy(Data.dawt[count].PM, F_DATA, 3);
}
}
我收到警告:
passing argument 1 of 'memcpy' makes pointer from integer without a cast
所有mempcy功能
和
passing argument 2 of 'memcpy' makes pointer from integer without a cast
表示#define语句
#define F_DATA 0x00006000
出了什么问题。
答案 0 :(得分:1)
正如我们从memcpy()
语法中看到的那样,
void *memcpy(void *dest, const void *src, size_t n);
第一个和第二个参数应该是void *
类型。
现在,假设Lang
是结构变量Data
的成员变量,并且您有一个像
Data Data;
Data.Lang
是 long
类型的成员变量,而不是它的地址。您至少需要使用&Data.Lang
。
也就是说,如果是文字,就像0x00006000
不表示地址一样,你需要像(void *)0x00006000
一样强制转换它,使其像地址一样解释。
答案 1 :(得分:1)
我对你问题中的代码感到困惑,所以我可能会误解。但是如果Data
是结构的RAM副本,并且在F_DATA
表示的地址处有相同结构的flash副本,那么你应该可以做一些简单的事情:
void LoadFromFlash(){
Data = *((struct Data *)F_DATA);
}
答案 2 :(得分:0)
正如其他人所指出的,memcpy函数对地址感兴趣(例如&amp; variable)。但是,正如您在评论中指出的那样,您收到以下错误消息:
cannot take addres of bit-field 'Lang'
原因是:
因为位字段不一定从字节的开头开始,所以不能获取位字段的地址。指针字段的指针和非const引用是不可能的。 位字段没有地址 - 您不能指向它们或它们的数组。
但是,我会尝试查看是否有解决方法。但是现在这应该足够了。
编辑: 你是那个在闪存中存储数据的人吗?
然而,创建一个联盟。在union中创建一个struct。将闪存中的3个字节复制到't'Day.AM中。然后从't'Day.bitfieldAM.AM
中读取值typedef union
{
struct
{
long AM:24;
long: 8;
}bitFieldAM;
long AM;
struct
{
long PM:24;
long: 8;
}bitFieldPM;
long PM;
}tDay;