Jump to content

    

natsu

Участник
  • Posts

    44
  • Joined

  • Last visited

Reputation

0 Обычный

About natsu

  • Rank
    Участник
    Участник

Информация

  • Город
    Array

Recent Profile Visitors

164 profile views
  1. Причем тут размер.. Ошибка то вполне конкретная. Вот ПРОЕКТ из одного файла: #include <stdint.h> typedef struct {double energy[2][3];uint16_t mask;} __attribute__((packed)) zagprof_t; typedef struct {uint32_t stamp;float data[16];} __attribute__((packed)) datprof_t; int main(){ struct my { __attribute__((aligned (8))) zagprof_t zag; // char pad1[6]; __attribute__((aligned (8))) datprof_t dat; // char pad2[4]; __attribute__((aligned (8))) double energynow[2][3]; }; static struct my qq; struct my *mem=&qq; mem->energynow[0][0]=0; while(1);} Build started: Project: qq *** Using Compiler 'V6.15', folder: 'C:\Keil_v5\ARM\ARMCLANG\Bin' Build target 'Target 1' main.c(10): warning: padding struct 'struct my' with 6 bytes to align 'dat' [-Wpadded] __attribute__((aligned (8))) datprof_t dat; ^ main.c(12): warning: padding struct 'struct my' with 4 bytes to align 'energynow' [-Wpadded] __attribute__((aligned (8))) double energynow[2][3]; ^ 2 warnings generated. compiling main.c... linking... Program Size: Code=372 RO-data=472 RW-data=0 ZI-data=1632 ".\Objects\qq.axf" - 0 Error(s), 2 Warning(s). Build Time Elapsed: 00:00:00
  2. оптимизацию пробовал и O0 и другие, разницы нет \fdata.c(325): warning: unknown pragma ignored [-Wunknown-pragmas] #pragma GCC push_options ^ \fdata.c(326): warning: unknown pragma ignored [-Wunknown-pragmas] #pragma GCC optimize ("Ofast") ^
  3. и от предупреждений компилятора этот метод не спасает. Чтобы убрать предупреждения придется все равно вручную приделывать паддинги.
  4. Попробую угадать. Вы про макрос которые создает две структуры - упакованную и неупакованную? Не устраивает тем что рано или поздно укажу не ту структуру которую надо и потом это обнаружить и исправить будет нелегко
  5. Неупакованные Невыровненные данные? Устраивает. Но с упаковкой и выравниванием надо тему закрыть, а значит сначала разобраться.
  6. именно восьми. А вообще то в жизни 50 байт. Мне надо знать размер структуры чтоб считывать массив структур из хранилища, где они хранятся упакованными. А вот считанную структуру для обработки хотелось бы хранить по выровненному адресу. Вся проблема была в том, что структур несколько и хотелось бы иметь место в памяти, где структуры могут находиться выравненными. При этом очень хочется, чтобы каждая структура была описана один раз в системе, без всяких там отдельно упакованных и отдельно неупакованных вариантов одной структуры.
  7. Отнюдь. Я как раз написал, что мне нужно описать структуры упакованными - дабы спокойно и без лишней суеты использовать их sizeof. И не шифруюсь я вовсе, яж написал какой камень, конкретнее stm32f746. Но это на макете. В серии может быть чтото другое. А что касается целочисленной обработки - сам так хотел. Но не склеивается.. Все равно отдельно хранить целую точную часть (смещение) и массив измененных данных. Так в массиве проще хранить float, а для точной части можно либо int либо double, второе выглядит пока проще.
  8. похоже суть первых сообщений потерялась... Данные хранятся в упакованном виде как последовательность (и массивы) структур, которые по размеру часто не кратны даже 2. Точность некоторых данных требуется минимум 8 знаков, диапазон 11 порядков (десятичных). Есть еще предварительная обработка, поэтому выбраны double - каждые от 30 до 200 отсчетов по отдельным параметрам. Промежуточные данные float. Мне кажется, я с трудом втискиваюсь в требования со своей экономией памяти, а вам так легко судить что я "экономлю на спичках". Упакованные структуры описывают данные и их sizeof соответствует реальности. Для обработки данные извлекаются и помещаются в память. Чтобы не испытывать судьбу я решил считывать данные в выровненные структуры. Для обработки надо извлечь несколько структур. Поэтому мне понадобилась - желательно одна - структура в которой описаны те самые упакованные структуры но чтоб они были выровнены по адресам (достаточно для первого элемента). Все это было сказано раньше. Самый простой случай - описанная структура my и две структуры внутри. Все получилось, но чтобы успокоить компилятор, приходится вставлять руками паддинги, причем там где они похоже не нужны. Особенно удивляет паддинг 8 байтов в конце структуры. Последние вопросы и были отсюда - что не так сделано? Раз есть предупреждения, значит есть шанс получить сюрпризы позже, так?
  9. typedef struct {double energy[2][3];uint16_t mask;} __attribute__((packed)) zagprof_t; typedef struct {uint32_t stamp;float data[16];} __attribute__((packed)) datprof_t; а вот так не получается. Правда одна из ошибок исчезает, если в конце структуры добавить char pad[8]; но как то не выглядит это разумным.
  10. У меня собирательная структура состоит из нескольких структур и одного массива double как описано выше, у всех элементов структуры атрибут aligned(8). Что еще надо выровнять? Обнаружил, что если я вставляю между элементами в одном месте char pad[4]; в другом char pad2[6]; то предупреждения исчезают. Вот только зачем они там? struct my { __attribute__((aligned (8))) zagprof_t zag; char pad1[6]; __attribute__((aligned (8))) datprof_t dat; char pad2[4]; __attribute__((aligned (8))) double ennow[2][3]; };
  11. возвращаясь к вопросу выравнивания... Сделал я упакованные структуры, поместил их в обычную структуру с атрибутом aligned каждую и все вроде бы хорошо, компилятор все структуры выровнял, теперь можно копировать и работать с выровненными данными. Все данные внутри от большего размера к меньшему - т.е. если выровнен первый элемент, то остальные и подавно. Но несмотря на то, что я явно запросил align, компилятор выводит предупреждения (иногда сразу, иногда только во время компиляции) и их много. Что не так или как подавить эти предупреждения? \fdata.c(326): warning: padding struct 'struct my' with 4 bytes to align 'ennow' [-Wpadded] __attribute__((aligned (8))) double ennow[2][3]; ^
  12. Увы нет. Упакованные (в т.ч. разные) структуры ложатся по невыравненным адресам. Надо для кого/чего? Сначала на этот вопрос ответьте. Для данного конкретного случая. После чтения блока данных внутри него окажется требуемая структура с произвольного адреса. А данные надо обработать и передать по другому интерфейсу. Меня интересуют критерии, на основании которых можно будет принять решения. Я не прошу принять решения за меня. Я прошу помочь мне научиться самому принимать обоснованные решения.