Чижик 0 26 марта, 2022 Опубликовано 26 марта, 2022 · Жалоба 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. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Чижик 0 26 марта, 2022 Опубликовано 26 марта, 2022 (изменено) · Жалоба Момент в том, что предполагается, что 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 назад. Но с удобоваримым решение как мне помнится не сложилось. Изменено 26 марта, 2022 пользователем Чижик Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 26 марта, 2022 Опубликовано 26 марта, 2022 · Жалоба 2 часа назад, Чижик сказал: Как заставить компилятор располагать все данные в том порядке как они описаны? создать структуру, которая бы содержала в себе все эти данные в нужном порядке Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Чижик 0 26 марта, 2022 Опубликовано 26 марта, 2022 (изменено) · Жалоба 2 hours ago, tgruzd said: создать структуру, которая бы содержала в себе все эти данные в нужном порядке Все очевидное - просто. Действительно, зашел ум за разум. Спасибо. Изменено 26 марта, 2022 пользователем Чижик Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться