Перейти к содержанию
    

размещение структур в EEPROM в ХС8

typedef union {
    uint8_t ctlByte[8];

    struct {
        uint8_t address;
        uint8_t actBit;
        uint8_t invBit;
        uint8_t outBit;
        uint8_t upSend;
        uint8_t dnSend;
        uint8_t dummy0;
        uint8_t dummy1;

    };
}
reg_ctl_table_t;

typedef struct {
    uint8_t devMask;
    uint8_t chipMask;
    uint8_t actMask;
} filter_t;

#define ADR_FILTER 8 //адрес начала таблицы фильтров в EEPROM
#define NUM_FILTER 8 //кол-во таблиц

#define ADR_CTL_MAX 20 //адрес начала таблицы управления в EEPROM
#define LEN_CTL_MAX 8

__eeprom uint8_t _num_pic = PIC_MAX; //кол-во используемых регистров GPIO 
__eeprom uint8_t _num_i2c = I2C_MAX; //кол-во внешних регистров I2C

__eeprom uint8_t _num_reg = REG_MAX; //количество таблиц
__eeprom uint8_t _adr_control = ADR_CTL_MAX; //адрес массива таблиц управления
__eeprom uint8_t _len_control = LEN_CTL_MAX; //размер таблицы управления

__eeprom uint8_t _num_filter = NUM_FILTER; //кол-во таблиц
__eeprom uint8_t _adr_filter = ADR_FILTER; // адрес таблицы в EEPROM фильтров

__eeprom uint8_t _dummyx = 0; //выравнивание до 8

__eeprom filter_t _filter[NUM_FILTER] = { //кол-во кратно 8
    1, 2, 3,
    4, 5, 6,
    7, 8, 1,
    2, 3, 4,
    5, 6, 7,
    8, 1, 2,
    3, 4, 5,
    6, 7, 8
};

__eeprom reg_ctl_table_t _ctl_table[REG_MAX] = { //кол-во кратно 8
    0x0C, 1, 2, 3, 4, 5, 6, 7,
    0x0E, 1, 2, 3, 4, 5, 6, 7,
    0x20, 1, 2, 3, 4, 5, 6, 7
};

Добрый день.

Есть фрагмент определения размещения данных двух структур в EPPROM. Тут все вроде бы понятно.

Но...

Вопрос первый.

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

 {Компилятор  наровит расположить их по убыванию размеров структур.}

Вопрос второй.

Можно ли как то автоматически сформировать в ячейке _adr_control значение смещения начала таблицы _ctl_table, и соответственно для _filter в _adr_filterб не используя ручной подсчет и определение через define.

Спасибо.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Момент в том, что предполагается, что EEPROM может быть перезаписан отдельно от программы этими массивами структур с другим количеством элементов с соответственно, вычисленными и записанными  новыми смещениями в начальные ячейки с известными адресами. Поэтому первый вопрос интересен в принципе. Второй удобен для момента отладки.

 

Это к тому, что решение типа 

cnt = LEN_CTL_MAX;
while (cnt) {
        regCtl.ctlByte[cnt] = _ctl_table[numReg].ctlByte[cnt] 
        cnt--;
    }

не годится, в общем случае.

Только

 while (adr_l < adr_h) {
        regCtl.ctlByte[cnt] = DATAEE_ReadByte(adr_l);
        adr_l++;
    }

где alr_l и adr_h абсолютные значения.

 

P.S. Кстати, что-то похожее обсуждали на форуме лет 5 назад. Но с удобоваримым решение как мне помнится не сложилось.

Изменено пользователем Чижик

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Чижик сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, tgruzd said:

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

Все очевидное - просто.

Действительно, зашел ум за разум. 

Спасибо.

Изменено пользователем Чижик

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...