Скопируйте const struct во флэш-памяти в "обычную" структуру в RAM - PullRequest
0 голосов
/ 09 мая 2018

Вот что у меня есть, и есть проблема: компилятор не распознает тип структуры "my_reg".

.. / Source / functions.c: 609: 16: ошибка: 'my_reg' не объявлен (первое использование в этой функции) ModBusIDReg = (my_reg) const_ModBusIDReg;

// define structure in flash with constants

struct
{
  const unsigned char Reg00[32];
  const unsigned char Reg01[32];
  const unsigned char Reg02[32];
  const unsigned short Reg03;
  const unsigned short Reg04;
} const_ModBusIDReg =
{
  "My String 1" ,
  "My String 2" ,
  "My String 3" ,
   0 ,
   0
};


// define structure in RAM, tag name "my_reg"

struct my_reg
{
  unsigned char Reg00[32];
  unsigned char Reg01[32];
  unsigned char Reg02[32];
  unsigned short Reg03;
  unsigned short Reg04;
} ModBusIDReg;


// This statement is located in InitSys function.
// Both of the files where the structures were
// defined are included at the top of the file 
// where InitSys function resides.
// Make a copy of const_ModBusIDReg from
// flash into ModBusIDReg in RAM.


ModBusIDReg = (my_reg)const_ModBusIDReg;

Есть идеи, как выполнить прямое задание?

1 Ответ

0 голосов
/ 09 мая 2018

Приведение типа, подобное этому, должно разрешить ошибку компилятора:

ModBusIDReg = (my_reg)const_ModBusIDReg;

Или вы можете использовать memcpy () :

memcpy(&ModBusIDReg, &const_ModBusIDReg, sizeof(my_reg));

(Sidenote при использовании memcpy (): в некоторых случаях может возникнуть проблема с выравниванием памяти. Но я не эксперт c. Использование специфичных для компилятора атрибутов подобно упакованных в случай GCC может помочь, когда вы определяете структуру, в зависимости от платформы, компилятора, используемых типов переменных.)

Вы также можете копировать элементы структуры индивидуально в пользовательской функции копирования и инициализировать неиспользуемые части, если таковые имеются. Это было бы чисто, очень ясно / явно, и похоже на конструктор копирования / оператор присваивания, используемый в C ++ (глубокие копии обрабатываются правильно).


редактирование: Поскольку я не могу добавить комментарий выше после вашего последнего редактирования, я добавляю комментарий здесь:

. / Source / functions.c: 609: 16: ошибка: 'my_reg' не объявлен (первое использование в эта функция) ModBusIDReg = (my_reg) const_ModBusIDReg;

В C вы можете использовать typedef в ваших выражениях типа struct, чтобы избежать повторения ключевого слова struct во всем вашем коде (подробно объяснено здесь или там ):

typedef struct { ... } foo;
foo x;

Вот пример, иллюстрирующий упомянутые идеи сверху:

/* gcc -Wall -o copy_test copy_test.c && ./copy_test */

#include <stdio.h>
#include <string.h>

typedef struct {
    int var;
} my_struct;

int my_copy_func(my_struct *dst, const my_struct *src)
{
    if (!dst || !src)
        return -1;
    dst->var = src->var;
    return 0;
}

int main()
{
    const my_struct a = { .var = 42 };
    my_struct b, c, d;
    c = (my_struct)a;
    memcpy(&b, &a, sizeof(b));
    my_copy_func(&d, &a);
    printf("b.var = %d\r\n", b.var);
    printf("c.var = %d\r\n", c.var);
    printf("d.var = %d\r\n", d.var);
    return 0;
}
...