|
|
  |
Размер unsigned int или int Keil4.5 |
|
|
|
Jun 7 2012, 10:33
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798

|
Цитата(ViKo @ Jun 7 2012, 13:26)  Вы не о том возражаете по цитате Два массива могли бы оказаться где угодно, а не друг рядом с другом. Я Вам как раз по цитате. Вы вчера никак не могли себя убедить, как упаковываются данные, ссылаясь на какие-то внешние причины и т.д. А вот теперь Ваша очередь убедит меня, как я вчера, что цитата, под которой Вы подписались- верна. Приведите пример листинга объявления переменных и соответствующий мап-файл, что бы это было очевидно. Сможете добиться такого результата, о чем так переживает автор приведенной Вами цитаты? Тогда и цитата Ваша будет чего-то стоить
|
|
|
|
|
Jun 7 2012, 10:58
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(TAutomatic @ Jun 7 2012, 13:33)  Сможете добиться такого результата, о чем так переживает автор приведенной Вами цитаты? Тогда и цитата Ваша будет чего-то стоить  Код #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) При любом другом уровне - то же самое!
|
|
|
|
|
Jun 7 2012, 16:40
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798

|
Цитата(ViKo @ Jun 7 2012, 13:58)  При любом другом уровне - то же самое! Хорошо, убедили.
|
|
|
|
|
Jun 7 2012, 20:19
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Вообще то для того что бы расположить глобальные объекты в определенном порядке (еще и запакованные) есть global anonymous unionКод union { struct { unsigned char A; unsigned long B; unsigned char C; }; }; и все компилятор не сможет ничего никуда переставить! правда вроде только в IAR такая конструкция может быть не static
|
|
|
|
|
Jun 8 2012, 04:44
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798

|
Цитата(KRS @ Jun 7 2012, 23:19)  Вообще то для того что бы расположить глобальные объекты в определенном порядке (еще и запакованные) есть global anonymous unionКод union { struct { unsigned char A; unsigned long B; unsigned char C; }; }; и все компилятор не сможет ничего никуда переставить! правда вроде только в IAR такая конструкция может быть не static Со структурами анонимус и не анонимус было понятно изначально. Тут речь шла о не связанных логически данных. Единственная их связь - одинаковое объявления в одном месте в программе. По умолчанию, кстати, в структуре данные тоже не упакованы.
|
|
|
|
|
Jun 8 2012, 09:44
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(TAutomatic @ Jun 8 2012, 08:44)  Единственная их связь - одинаковое объявления в одном месте в программе. По умолчанию, кстати, в структуре данные тоже не упакованы. Это не связь! компилятор может их раскидать по своему усмотрению, особенно если оптимизация включена! IAR например легко переменную может перекинуть даже в сегмент инициализированных данных из .bss (в отличии от GCC которая только обратно может если 0 значение) И по стандарту С - только в структурах гарнируется порядок данных! demiurg_spb, В C11 уже есть анонимные структуры и объеденения, правда на счет глобальных непонятно.
|
|
|
|
|
Jun 9 2012, 05:44
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
В 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." (это при вызове публической функции, на пример).
|
|
|
|
|
Jun 9 2012, 15:47
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798

|
Цитата(brag @ Jun 9 2012, 08:44)  Я всегда устанавливаю UNALIGN_TRP, тогда любая инструкция, выполняющая Unaligned access даст UsageFault. чтобы быстрее баги отловить.. Как эту ловушку использовать?
|
|
|
|
|
Jun 9 2012, 18:34
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798

|
Цитата(brag @ Jun 9 2012, 19:34)  Вешаем обработчик на исключение UsageFault, а в нем уже делаем то, что нам нужно. Понятно, спасибо.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|