TAutomatic 0 7 июня, 2012 Опубликовано 7 июня, 2012 · Жалоба Вы не о том возражаете по цитате :rolleyes: Два массива могли бы оказаться где угодно, а не друг рядом с другом. Я Вам как раз по цитате. Вы вчера никак не могли себя убедить, как упаковываются данные, ссылаясь на какие-то внешние причины и т.д. А вот теперь Ваша очередь убедит меня, как я вчера, что цитата, под которой Вы подписались- верна. Приведите пример листинга объявления переменных и соответствующий мап-файл, что бы это было очевидно. Сможете добиться такого результата, о чем так переживает автор приведенной Вами цитаты? Тогда и цитата Ваша будет чего-то стоить :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 июня, 2012 Опубликовано 7 июня, 2012 · Жалоба Сможете добиться такого результата, о чем так переживает автор приведенной Вами цитаты? Тогда и цитата Ваша будет чего-то стоить :rolleyes: #define LENGHT 3 volatile char var_a[LENGHT]; volatile int var_b[LENGHT]; volatile char var_c[LENGHT]; int main(void) { for (uint32_t i = LENGHT; i--; ) { var_a[i] = GPIOA->IDR; var_b[i] = GPIOB->IDR; var_c[i] = var_a[i] + var_b[i]; GPIOC->ODR = var_c[i]; } } Создайте в Кейле проект, выберите микроконтроллер (у меня был STM32F205VG), и посмотрите в map файл. При уровне оптимизации 0 имеем следующее: var_a 0x20000000 Data 3 exercises.o(.data) var_c 0x20000003 Data 3 exercises.o(.data) SystemCoreClock 0x20000008 Data 4 system_stm32f2xx.o(.data) AHBPrescTable 0x2000000c Data 16 system_stm32f2xx.o(.data) var_b 0x2000001c Data 12 exercises.o(.bss) При любом другом уровне - то же самое! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TAutomatic 0 7 июня, 2012 Опубликовано 7 июня, 2012 · Жалоба При любом другом уровне - то же самое! Хорошо, убедили. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 7 июня, 2012 Опубликовано 7 июня, 2012 · Жалоба Вообще то для того что бы расположить глобальные объекты в определенном порядке (еще и запакованные) есть global anonymous union union { struct { unsigned char A; unsigned long B; unsigned char C; }; }; и все компилятор не сможет ничего никуда переставить! правда вроде только в IAR такая конструкция может быть не static Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TAutomatic 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Вообще то для того что бы расположить глобальные объекты в определенном порядке (еще и запакованные) есть global anonymous union union { struct { unsigned char A; unsigned long B; unsigned char C; }; }; и все компилятор не сможет ничего никуда переставить! правда вроде только в IAR такая конструкция может быть не static Со структурами анонимус и не анонимус было понятно изначально. Тут речь шла о не связанных логически данных. Единственная их связь - одинаковое объявления в одном месте в программе. По умолчанию, кстати, в структуре данные тоже не упакованы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Со структурами анонимус... Жаль, что это не соответствует стандарту c99, следовательно не панацея. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Единственная их связь - одинаковое объявления в одном месте в программе. По умолчанию, кстати, в структуре данные тоже не упакованы. Это не связь! компилятор может их раскидать по своему усмотрению, особенно если оптимизация включена! IAR например легко переменную может перекинуть даже в сегмент инициализированных данных из .bss (в отличии от GCC которая только обратно может если 0 значение) И по стандарту С - только в структурах гарнируется порядок данных! demiurg_spb, В C11 уже есть анонимные структуры и объеденения, правда на счет глобальных непонятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Дурацкий вопрос: union-то зачем? Вполне достаточно одной только структуры. Или это какая-то особенность IAR'а ? с IAR'ом плотно не работал, анонимные структуры не использовал (хотя периодически хочется...). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Дурацкий вопрос: union-то зачем? Вполне достаточно одной только структуры. Или это какая-то особенность IAR'а ? IAR так описывал регистры периферии, может и без union работать будет. Но в любом случае это не портабельно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
brag 0 9 июня, 2012 Опубликовано 9 июня, 2012 · Жалоба В Cortex-M3 выравнивание можно сказать, всегда нужно, читайте DDI0403D_arm_architecture_v7m_reference_manual_errata_markup_1_0. Unaligned access поддерживают только инструкции LDR, LDRT, LDRH, LDRHT, LDRSH, LDRSHT, STR, STRT, STRH, STRHT, но есть и другие, активно используемые компилятором, на пример LDM, которые сразу дадут UsageFault. Я всегда устанавливаю UNALIGN_TRP, тогда любая инструкция, выполняющая Unaligned access даст UsageFault. чтобы быстрее баги отловить.. К стати в Cortex-M3 нету ущерба производительности при Unaligned access. Такчто, если память будет использоватся компилятором, то выравнивание нужно обязательно, читайте IHI0042D_aapcs. Единственное, где Unaligned access может быть полезен - это заполнение полей структур протоколов(USB, на пример), но делать это нужно ручками через __ldr()/__str() intrinsincs - что более предпочтительно - intrinsinc или ручками побайтно - решать вам. Раз уж о выравнивании, то стек должен быть всегда выравнян до 8 байт, иначе при переходе на новый проц напоретесь на баги, тк "ARM deprecates implementation or use of 4-byte SP alignment." К тому же в IHI0042D_aapcs сказано: "Stack constraints at a public interface - The stack must be double-word aligned." (это при вызове публической функции, на пример). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TAutomatic 0 9 июня, 2012 Опубликовано 9 июня, 2012 · Жалоба Я всегда устанавливаю UNALIGN_TRP, тогда любая инструкция, выполняющая Unaligned access даст UsageFault. чтобы быстрее баги отловить.. Как эту ловушку использовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
brag 0 9 июня, 2012 Опубликовано 9 июня, 2012 · Жалоба Вешаем обработчик на исключение UsageFault, а в нем уже делаем то, что нам нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TAutomatic 0 9 июня, 2012 Опубликовано 9 июня, 2012 · Жалоба Вешаем обработчик на исключение UsageFault, а в нем уже делаем то, что нам нужно. Понятно, спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться