-
- Сделал так, но дает варниг использование адреса невыровненного
члена структуры. Как победить? IBAH(326 знак., 26.04.2023 12:38)
- Ну конечно! Запрашиваете к короткой (short, char) переменной доступ
как к нормальной (int). Не делайте так! Ваша проверка проверяет,
можно ли к членам обратиться как к int. Разумеется к некоторым
нельзя. Вот и предупреждение. - Nikolay_Po(26.04.2023 12:48)
- с фирменным макросом offsetof, предупреждения не возникает - IBAH(26.04.2023 12:55)
- Убрать pack. - SciFi(26.04.2023 12:39)
- а если серьезно? если использовать фирменный макрос offsetof
варнинг не возникает, отличается использование ключевого слова
__INTADDR__, что оно значит не нашел IBAH(71 знак., 26.04.2023 12:53)
- __INTADDR__, очевидно, нарочно сделана так, чтобы не вызывать
предупреждения. Просто вычисляет смещение, и всё, дрступа нет. А
для вашего макроса, мало ли, вдруг вы реально обращаетесь - ловите
предупреждение. - Nikolay_Po(26.04.2023 13:02)
- чудеса какие-то... пишу __INTADDR__ ручками все равно варнинг. Этот __INTADDR__ применяется только в макросе offsetof IBAH(1 знак., 26.04.2023 13:41, ссылка)
- А зачем там pack? Я так и не понял. - SciFi(26.04.2023 12:53)
- Чтоб структура занимала 32+8+8=48 бит, а не 32+16+16=64 или даже
32*3=96 бит (если чип 32-бит), когда её сохраняют в байтовую
EEPROM. - Nikolay_Po(26.04.2023 12:59)
- Ну, во-первых, пока EEPROM не кончился, утаптывать эту структуру -
пустая трата времени. - SciFi(26.04.2023 13:41)
- Может быть критично время, требуемое для записи, например, при
пропаже питания. Ещё, я всегда делаю выравнивание износа. Меньше
данных - меньше износ, могу чаще писать за время жизни изделия без
риска отказа памяти. - Nikolay_Po(26.04.2023 13:44)
- Сова на глобусе, так вижу. - SciFi(26.04.2023 13:48)
- Лучше ты свое занудство на работу напряги(с) Почему __INTADDR__ то
работает то не работает? IBAH(24 знак., 26.04.2023 13:54)
- Возьми смещения членов штатно, с помощью offsetof(). И сравни
разности между соседними смещениями с sizeof(члена), а сумму
offsetof(члена) и sizeof(типа) последнего члена структуры с
размером структуры. Если совпало - значит упаковано верно. Правда,
как закатать это в макрос препроцессора - я ХЗ. - Nikolay_Po(26.04.2023 14:01)
- Я уже победил, вот так отлично работает #define PROVERKA(var)
typedef struct {int var##TmpVar : !((offsetof(IntEEPROM_t,
var))%sizeof((((IntEEPROM_t*)0)->var)));} TmpVar##var;. Просто
непонятки с __INTADDR__, хочу все знать - IBAH(26.04.2023 14:04)
- Спасибо. Интересно. Как я понял, проверяется выравнивание положения каждого члена структуры (или вообще, любой переменной) по размеру её типа. Верно? Макрос, правда, получился для конкретного типа струткуры, IntEEPROM_t. Можно сделать универсальный, для любых типов структур? Nikolay_Po(305 знак., 28.04.2023 09:44)
- Я уже победил, вот так отлично работает #define PROVERKA(var)
typedef struct {int var##TmpVar : !((offsetof(IntEEPROM_t,
var))%sizeof((((IntEEPROM_t*)0)->var)));} TmpVar##var;. Просто
непонятки с __INTADDR__, хочу все знать - IBAH(26.04.2023 14:04)
- Возьми смещения членов штатно, с помощью offsetof(). И сравни
разности между соседними смещениями с sizeof(члена), а сумму
offsetof(члена) и sizeof(типа) последнего члена структуры с
размером структуры. Если совпало - значит упаковано верно. Правда,
как закатать это в макрос препроцессора - я ХЗ. - Nikolay_Po(26.04.2023 14:01)
- Уж так повелось, максималист я. - Nikolay_Po(26.04.2023 13:49)
- Лучше ты свое занудство на работу напряги(с) Почему __INTADDR__ то
работает то не работает? IBAH(24 знак., 26.04.2023 13:54)
- Сова на глобусе, так вижу. - SciFi(26.04.2023 13:48)
- Может быть критично время, требуемое для записи, например, при
пропаже питания. Ещё, я всегда делаю выравнивание износа. Меньше
данных - меньше износ, могу чаще писать за время жизни изделия без
риска отказа памяти. - Nikolay_Po(26.04.2023 13:44)
- Ну, во-первых, пока EEPROM не кончился, утаптывать эту структуру -
пустая трата времени. - SciFi(26.04.2023 13:41)
- в данном случае незачем. Я эту структуру заполняю на ходу, понадобилась энергонезависимя переменная дописал - IBAH(26.04.2023 12:57)
- Чтоб структура занимала 32+8+8=48 бит, а не 32+16+16=64 или даже
32*3=96 бит (если чип 32-бит), когда её сохраняют в байтовую
EEPROM. - Nikolay_Po(26.04.2023 12:59)
- __INTADDR__, очевидно, нарочно сделана так, чтобы не вызывать
предупреждения. Просто вычисляет смещение, и всё, дрступа нет. А
для вашего макроса, мало ли, вдруг вы реально обращаетесь - ловите
предупреждение. - Nikolay_Po(26.04.2023 13:02)
- а если серьезно? если использовать фирменный макрос offsetof
варнинг не возникает, отличается использование ключевого слова
__INTADDR__, что оно значит не нашел IBAH(71 знак., 26.04.2023 12:53)
- Ну конечно! Запрашиваете к короткой (short, char) переменной доступ
как к нормальной (int). Не делайте так! Ваша проверка проверяет,
можно ли к членам обратиться как к int. Разумеется к некоторым
нельзя. Вот и предупреждение. - Nikolay_Po(26.04.2023 12:48)
- А шо ни кто не вспомнил про юнит тесты? Для решения этой проблемы
подходит, но дороха. - Nikolay801_(25.04.2023 11:17)
- STATIC_ASSERT можно считать упрощенным вариантом юнит-теста - AlexBi(26.04.2023 07:29)
- Кроме названия ничо не знаю. Можете штото интересное рассказать
сосвоего опыта? - symbions(25.04.2023 22:27)
- параллельно с основным проектом пишется тестовый, в тестовом
используется те же модули что и в боевом, но реализуется не тот
функционал что должен быть в конечном продукте, а некие
синтетические тесты и выдает диагностику работы этого модуля. Nikolay801_(255 знак., 26.04.2023 13:09)
- понял , спасибо - symbions(26.04.2023 13:13)
- параллельно с основным проектом пишется тестовый, в тестовом
используется те же модули что и в боевом, но реализуется не тот
функционал что должен быть в конечном продукте, а некие
синтетические тесты и выдает диагностику работы этого модуля. Nikolay801_(255 знак., 26.04.2023 13:09)
- Я просто проверяю размер структуры на этапе компиляции через
STATIC_ASSERT. Если размер разошёлся - значит где-то косяк. - _LightElf(22.04.2023 11:28,
)
- Как-то так: LightElf(1146 знак., 24.04.2023 14:34)
- магическое число 0х0С напоминает про Хаджу Насредина и крысиный яд IBAH(1 знак., 26.04.2023 10:44, ссылка)
- Магическое число, в данном случае, берется из даташита. Где оно представлено именно в таком виде. - LightElf(26.04.2023 14:10)
- Чего то я не вкуриваю... Нафига проверять то что реализуется прямо
"из коробки" и при этом с гарантией?! Если нужна "утрамбованная
структура" - то применяется соответствующая прагма. Если не
требуется упаковывание структуры то не используется прагма. Зачем
козе баян ?! - Zoro(24.04.2023 14:41)
- Нужна не просто утарамбованная структура, а утрамбованная и все элементы по кратным адресам - IBAH(26.04.2023 10:47)
- Структуры могут быть разные, в том числе заданные извне, всячески запутанные. Полезно быть уверенным, что смена компилятора не поломала всякое. LightElf(1835 знак., 24.04.2023 16:20)
- Прагма включает побайтовый доступ, с ней код толстый и медленный.
Жаба душит. - SciFi(24.04.2023 14:48)
- Ну а если порядок полей нельзя поменять ? увы с жабой придётся дружить. Давно я не писал под 51-й... А так в частном случае "можно ручками расставить поля структур" - ещё тот квест когда есть вложенные структуры. - Zoro(24.04.2023 15:26)
- магическое число 0х0С напоминает про Хаджу Насредина и крысиный яд IBAH(1 знак., 26.04.2023 10:44, ссылка)
- Как-то так: LightElf(1146 знак., 24.04.2023 14:34)
- Вот ещё, в GCC, может поможет: можно включить предупреждение
-Wpadded. И тогда компилятор признается, применял ли он вставки,
сдвигая члены структуры для выравнивания. Nikolay_Po(236 знак., 22.04.2023 05:43)
- "-Wpadded"... Какой культурный синоним "паяльник в жопу"... - mse homjak(22.04.2023 11:10)
- Занятно. Вот >>> SciFi(1 знак., 22.04.2023 10:05, ссылка)
- т.к. Си развивают головожопы, в нём никогда уже не будет макросов
перебора всех полей струтуры для подобных проверок и сериализации. вeнтeлятopыйцex(117 знак., 19.04.2023 07:14, ссылка)
- такие макросы настоящий
самурайподован при необходимости должен наваять и протестить сам. иначе нех жалится или не место в C - RED_DRAGON(21.04.2023 18:44)- +1 - scorpion(22.04.2023 11:17)
- такие макросы настоящий
- Что значит "сдуру написал long по нечетному адресу"? Вы около каждого поля адрес прописываете что-ли? - Ale3000(19.04.2023 03:55)
- тип процессора, компилятор и требования к структуре применительно к епром в СТУДИЮ. иначе получается базар бабок на лавочке у подъезда. - Zoro(19.04.2023 00:19)
- Бред какой-то.... Структура (содержимое) либо автоматически
выравнивается по умолчанию, либо применена "прагма" (обычно кратно
байту). То при обращению к такой структуре производится вычитывание
по байтно ( к примеру int32). По крайней мере так было в какой-то
древней gcc Cи. - Zoro(18.04.2023 18:21)
- Не так всё просто... POV(126 знак., 18.04.2023 18:26)
- ARM Cortex-A9 (ARM v7). Абсолютно не парюсь в каком порядке располагать поля структуры с точки зрения выравнивания полей и стабильно использую "указатели на поля структуры". Переставлять "поля" я могу разве что мне требуется максимум быстродействия. В "этом" случае есть смысл переставить поля местами Zoro(306 знак., 18.04.2023 19:08)
- Насколько я знаю, катастрофа будет в только в М0, в остальных
просто потеряются такты на обращение. - IBAH(18.04.2023 18:31)
- Во всех, по идее, будет катастрофа. У всех есть аппаратное
прерывание по ошибке невыровненного доступа. Nikolay_Po(359 знак., 18.04.2023 18:51)
- Arm'ы сильно разные. RED_DRAGON(1 знак., 18.04.2023 19:41, ссылка)
- Во всех, по идее, будет катастрофа. У всех есть аппаратное
прерывание по ошибке невыровненного доступа. Nikolay_Po(359 знак., 18.04.2023 18:51)
- Такой парадокс. Структура пишится в Епром, и должна быть упакована,
но для оптимизации обращения к элементам структуры, они должны быть
выровнены. Выравниваю ручками. Хочу чтобы компилятор меня проверил. - IBAH(18.04.2023 18:26)
- Даже если немного ошибся с ручным выравниванием, и компилятор вставит лишнее заполнение, потеряешь пару байт. Перфекционизм - зло, выдавливай по капле. Если что, имею в виду, что "pack" отключено, так лучше. - SciFi(18.04.2023 19:45)
- Кстати, через X-Macro можно что-то такое провернуть. Посчитать сумму размеров полей структуры и сравнить с размером структуры. - SciFi(18.04.2023 19:40)
- Включите максимальную оптимизацию компиляции и оптимизацию во время сборки, LTO, то есть, ключик --flto у GCC. В разы увеличивается эффективность поиска потенциальных глюков кода. Включите все предупреждения -Wall (если не ошибаюсь). И предупреждения - ошибки -Werror. Много интересного узнаете о своём коде. Nikolay_Po(241 знак., 18.04.2023 19:08)
- Делайте как написал выше: большие элементы сначала. Спокойно пакуйте. Если переживаете, добавьте __attribute__((aligned)) в определении структуры. Nikolay_Po(504 знак., 18.04.2023 19:00)
- Не так всё просто... POV(126 знак., 18.04.2023 18:26)
- offsetof() macro есть таки в недрах C. остальное от лукавого. - RED_DRAGON(18.04.2023 17:57)
- Это не совсем то... Должна быть какая-то прагма - IBAH(18.04.2023 18:12)
- Сделал так, но дает варниг использование адреса невыровненного
члена структуры. Как победить? IBAH(326 знак., 26.04.2023 12:38)