Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Размер unsigned int или int Keil4.5
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > Keil
Страницы: 1, 2
Dron_Gus
Цитата(jcxz @ Jun 7 2012, 13:08) *
Позвольте встрять? wink.gif

Или (типичная оптимизация IAR for ARM): функция работает с неск. статическими переменными - IAR заносит в некий базовый регистр указатель на область памяти, которая включает большую часть этих переменных и адресует их через этот базовый + смещение, а одна переменная - далеко от остальных, разрядности смещения не хватает и для обращения к ней компилятору приходится вставлять доп. инструкции загрузки адреса этой переменной в регистр - соответственно доступ к этой переменной будет дольше.

Перетасовка переменных оптимизатором - это большой гуд. ПО не должно привязываться к взаимному расположению переменных (конечно это не касается внутри структур).

За меня уже ответили. Спасибо sm.gif

К тому же GCC при определнных опциях может перемещать переменные явно инициализированные нулем (т.е. те, которые должны бы попасть в секцию .data) в облась .bss. Профит от этого, я надеюсь, очевиден.
TAutomatic
Цитата(jcxz @ Jun 7 2012, 12:08) *
Позвольте встрять? wink.gif

Кроме внутреннего ОЗУ, к контроллеру может быть подцеплено внешнее, с другим временем доступа.
Даже если есть только внутреннее, то в некоторых процессорах есть разные RAM с разным быстродействием, расположенные на разных шинах.
Или, к примеру: внутреннее ОЗУ разбито на банки (непрерывно расположенные в адресном пространстве), и одна из переменных - в одном банке, другая - в другом, а во второй банк как раз идёт интенсивное DMA (с приоритетом контроллера DMA) - здесь разница во времени доступа может быть ОЧЕНЬ большой.
Даже если банки ОЗУ в несмежных областях - линкер (при соотв. опциях) может разбить выходные секции на неск. несмежных областей.
Перетасовка переменных оптимизатором - это большой гуд. ПО не должно привязываться к взаимному расположению переменных (конечно это не касается внутри структур).

Рабята, ну я Вас умаляю... rolleyes.gif Ну Вы что, читать не умеете? Я же ясно написал, две переменные, одинаково объявленные и т.д. Вам, что, все это пустой звук или есть просто желание поговорить? rolleyes.gif Две переменные, объявленные одинаково уж точно не могут попасть одна во внутреннее ОЗУ, вторая во внешнее, что бы иметь разное время доступа. Ну кто этого не понимает? Все остальное и комментировать нет смысла. Вам уже aaarrr выше в этой теме написал - размещение переменных, в том числе акккуратность этого размещения- это задача программиста. И я в этом согласен. А вот аккуратностью размещения кода занимается компилятор, а затем оптимизатор. Об этом даже в Википедии почитать можно. Там нет ни слова об оптимизации данных. Судя по-всему, никто из написавших выше никогда не проверял, что же реально компилятор и оптимизатор творят с переменными, но, основываясь на каком то внутреннем понимании этого процесса rolleyes.gif пытается утверждать, что так оно и есть.
demiurg_spb
Цитата(TAutomatic @ Jun 7 2012, 12:40) *
Две переменные, объявленные одинаково уж точно не могут попасть одна во внутреннее ОЗУ, вторая во внешнее, что бы иметь разное время доступа. Ну кто этого не понимает?
Я.
jcxz
Цитата(TAutomatic @ Jun 7 2012, 15:40) *
Рабята, ну я Вас умаляю... rolleyes.gif Ну Вы что, читать не умеете? Я же ясно написал, две переменные, одинаково объявленные и т.д. Вам, что, все это пустой звук или есть просто желание поговорить? rolleyes.gif Две переменные, объявленные одинаково уж точно не могут попасть одна во внутреннее ОЗУ, вторая во внешнее, что бы иметь разное время доступа. Ну кто этого не понимает?

Меня умолять не надо - Вы почитайте описание на любой компоновщик. Я вам вроде ясные примеры привёл.
Ничто не мешает компоновщику раскидать одноимённые входные секции (к примеру - секции .bss) по разным регионам памяти при наличии соответствующего ключа в конфигурации.

Цитата(TAutomatic @ Jun 7 2012, 15:40) *
Судя по-всему, никто из написавших выше никогда не проверял, что же реально компилятор и оптимизатор творят с переменными, но, основываясь на каком то внутреннем понимании этого процесса rolleyes.gif пытается утверждать, что так оно и есть.

Вы сами-то хотя-бы раз заглядывали в ассемблерные листинги после компилятора? Поинтересуйтесь вместо того чтобы писать тут ерунду.
ViKo
Цитата(TAutomatic @ Jun 7 2012, 12:40) *
занимается компилятор, а затем оптимизатор. Об этом даже в Википедии

Покажите, где написано (в Википедии, или еще где-то), что есть некий зверь, именуемый "оптимизатором", который занимается размещением то ли кода, то ли данных.
AHTOXA
Цитата(TAutomatic @ Jun 7 2012, 15:40) *
Рабята, ну я Вас умаляю...

Может, умОляю? Иначе смысл какой-то стрёмный...
bb-offtopic.gif
Я вот читаю, и, честно говоря, немного офигеваю. Тема начинается с абсолютно ламерского вопроса, а спустя буквально пару страниц топикстартер уже с важным видом всех поучает. Может, всё же прислушаться к мнению более опытных товарищей? Тем более, что уже и пример перестановки компилятором переменных привели, и даже с листингом.
jcxz
Цитата(ViKo @ Jun 7 2012, 16:16) *
Покажите, где написано (в Википедии, или еще где-то), что есть некий зверь, именуемый "оптимизатором", который занимается размещением то ли кода, то ли данных.

Википедия это конечно АВТОРИТЕТ! Любой TAutomatic знает w00t.gif
ViKo
Цитата(TAutomatic @ Jun 7 2012, 09:18) *
Все правильно, спасибо за цитату rolleyes.gif Теперь попытаюсь Вам концептуально разъяснить в чем дело.

Вы не о том возражаете по цитате rolleyes.gif
Два массива могли бы оказаться где угодно, а не друг рядом с другом.
TAutomatic
Цитата(AHTOXA @ Jun 7 2012, 13:17) *
Может, умОляю? Иначе смысл какой-то стрёмный...
bb-offtopic.gif
Я вот читаю, и, честно говоря, немного офигеваю. Тема начинается с абсолютно ламерского вопроса, а спустя буквально пару страниц топикстартер уже с важным видом всех поучает. Может, всё же прислушаться к мнению более опытных товарищей? Тем более, что уже и пример перестановки компилятором переменных привели, и даже с листингом.

Ух ты, как вас уже много высказаться rolleyes.gif Пример? Автор примера о перстановке переменных что то пропал после моего вопроса, как он так сделал rolleyes.gif
exeron
Какой упоротый попался... Вам уже цитату из Шилдта привели, чего еще надо?
TAutomatic
Цитата(ViKo @ Jun 7 2012, 13:26) *
Вы не о том возражаете по цитате rolleyes.gif
Два массива могли бы оказаться где угодно, а не друг рядом с другом.

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

Код
#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
Цитата(ViKo @ Jun 7 2012, 13:58) *
При любом другом уровне - то же самое!

Хорошо, убедили. rolleyes.gif
KRS
Вообще то для того что бы расположить глобальные объекты в определенном порядке (еще и запакованные) есть global anonymous union

Код
union {
  struct {
    unsigned char A;
    unsigned long B;
    unsigned char C;
  };
};

и все компилятор не сможет ничего никуда переставить!
правда вроде только в IAR такая конструкция может быть не static
TAutomatic
Цитата(KRS @ Jun 7 2012, 23:19) *
Вообще то для того что бы расположить глобальные объекты в определенном порядке (еще и запакованные) есть global anonymous union

Код
union {
  struct {
    unsigned char A;
    unsigned long B;
    unsigned char C;
  };
};

и все компилятор не сможет ничего никуда переставить!
правда вроде только в IAR такая конструкция может быть не static

Со структурами анонимус и не анонимус было понятно изначально. Тут речь шла о не связанных логически данных. Единственная их связь - одинаковое объявления в одном месте в программе. По умолчанию, кстати, в структуре данные тоже не упакованы.
demiurg_spb
Цитата(TAutomatic @ Jun 8 2012, 07:44) *
Со структурами анонимус...

Жаль, что это не соответствует стандарту c99, следовательно не панацея.
KRS
Цитата(TAutomatic @ Jun 8 2012, 08:44) *
Единственная их связь - одинаковое объявления в одном месте в программе. По умолчанию, кстати, в структуре данные тоже не упакованы.

Это не связь! компилятор может их раскидать по своему усмотрению, особенно если оптимизация включена!
IAR например легко переменную может перекинуть даже в сегмент инициализированных данных из .bss (в отличии от GCC которая только обратно может если 0 значение)
И по стандарту С - только в структурах гарнируется порядок данных!


demiurg_spb,
В C11 уже есть анонимные структуры и объеденения, правда на счет глобальных непонятно.
esaulenka
Дурацкий вопрос: union-то зачем? Вполне достаточно одной только структуры.
Или это какая-то особенность IAR'а ?

с IAR'ом плотно не работал, анонимные структуры не использовал (хотя периодически хочется...).
KRS
Цитата(esaulenka @ Jun 8 2012, 13:59) *
Дурацкий вопрос: union-то зачем? Вполне достаточно одной только структуры.
Или это какая-то особенность IAR'а ?

IAR так описывал регистры периферии, может и без union работать будет.
Но в любом случае это не портабельно.


brag
В 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
Цитата(brag @ Jun 9 2012, 08:44) *
Я всегда устанавливаю UNALIGN_TRP, тогда любая инструкция, выполняющая Unaligned access даст UsageFault. чтобы быстрее баги отловить..

Как эту ловушку использовать?
brag
Вешаем обработчик на исключение UsageFault, а в нем уже делаем то, что нам нужно.
TAutomatic
Цитата(brag @ Jun 9 2012, 19:34) *
Вешаем обработчик на исключение UsageFault, а в нем уже делаем то, что нам нужно.

Понятно, спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.