0

我想将数据从 flas 复制到结构中的 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

怎么了。

4

3 回答 3

1

memcpy()语法中我们可以看出,

void *memcpy(void *dest, const void *src, size_t n);

第一个和第二个参数应该是 type void *

现在,假设Lang是结构变量的成员变量Data,并且您有一个类似的定义

 Data Data;

Data.Lang 类型成员变量,而long不是地址。&Data.Lang至少,您需要使用。

也就是说,如果文字, like0x00006000不表示地址,则需要将其转换为 like(void *)0x00006000以使其像地址一样解释。

于 2015-07-31T10:10:43.687 回答
1

我对您问题中的代码感到困惑,所以我可能会误解。但是,如果Data是该结构的 RAM 副本,并且同一结构的闪存副本位于由 表示的地址F_DATA,那么您应该能够执行以下简单的操作:

void LoadFromFlash(){
    Data = *((struct Data *)F_DATA);
}
于 2015-07-31T14:41:31.473 回答
0

正如其他人指出的那样,memcpy 函数对地址感兴趣(例如&variable)。但是,正如您在评论中指出的那样,您会收到以下错误消息:

cannot take addres of bit-field 'Lang'

原因是:

因为位域不一定从字节的开头开始,所以不能取位域的地址。对位域的指针和非常量引用是不可能的。位域没有地址——你不能有指向它们的指针或它们的数组。

但是,我会尝试看看是否有解决方法。但就目前而言,这应该足够好了。

编辑:您是将数据存储在闪存中的人吗?

但是,创建一个工会。在联合中创建一个结构。将闪存中的 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;
于 2015-07-31T11:20:50.517 回答