реклама на сайте
подробности

 
 
5 страниц V  « < 3 4 5  
Reply to this topicStart new topic
TAutomatic
сообщение Jun 7 2012, 10:33
Сообщение #61


Участник
*

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



Цитата(ViKo @ Jun 7 2012, 13:26) *
Вы не о том возражаете по цитате rolleyes.gif
Два массива могли бы оказаться где угодно, а не друг рядом с другом.

Я Вам как раз по цитате. Вы вчера никак не могли себя убедить, как упаковываются данные, ссылаясь на какие-то внешние причины и т.д.
А вот теперь Ваша очередь убедит меня, как я вчера, что цитата, под которой Вы подписались- верна. Приведите пример листинга объявления переменных и соответствующий мап-файл, что бы это было очевидно. Сможете добиться такого результата, о чем так переживает автор приведенной Вами цитаты? Тогда и цитата Ваша будет чего-то стоить rolleyes.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 7 2012, 10:58
Сообщение #62


Универсальный солдатик
******

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



Цитата(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)

При любом другом уровне - то же самое!
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение Jun 7 2012, 16:40
Сообщение #63


Участник
*

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



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

Хорошо, убедили. rolleyes.gif
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 7 2012, 20:19
Сообщение #64


Профессионал
*****

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



Вообще то для того что бы расположить глобальные объекты в определенном порядке (еще и запакованные) есть global anonymous union

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

и все компилятор не сможет ничего никуда переставить!
правда вроде только в IAR такая конструкция может быть не static
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение Jun 8 2012, 04:44
Сообщение #65


Участник
*

Группа: Участник
Сообщений: 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

Со структурами анонимус и не анонимус было понятно изначально. Тут речь шла о не связанных логически данных. Единственная их связь - одинаковое объявления в одном месте в программе. По умолчанию, кстати, в структуре данные тоже не упакованы.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 8 2012, 07:11
Сообщение #66


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(TAutomatic @ Jun 8 2012, 07:44) *
Со структурами анонимус...

Жаль, что это не соответствует стандарту c99, следовательно не панацея.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 8 2012, 09:44
Сообщение #67


Профессионал
*****

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



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

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


demiurg_spb,
В C11 уже есть анонимные структуры и объеденения, правда на счет глобальных непонятно.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jun 8 2012, 09:59
Сообщение #68


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

с IAR'ом плотно не работал, анонимные структуры не использовал (хотя периодически хочется...).


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 8 2012, 12:19
Сообщение #69


Профессионал
*****

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



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

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


Go to the top of the page
 
+Quote Post
brag
сообщение Jun 9 2012, 05:44
Сообщение #70


Профессионал
*****

Группа: Свой
Сообщений: 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." (это при вызове публической функции, на пример).
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение Jun 9 2012, 15:47
Сообщение #71


Участник
*

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



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

Как эту ловушку использовать?
Go to the top of the page
 
+Quote Post
brag
сообщение Jun 9 2012, 16:34
Сообщение #72


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Вешаем обработчик на исключение UsageFault, а в нем уже делаем то, что нам нужно.
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение Jun 9 2012, 18:34
Сообщение #73


Участник
*

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



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

Понятно, спасибо.
Go to the top of the page
 
+Quote Post

5 страниц V  « < 3 4 5
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 10:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01511 секунд с 7
ELECTRONIX ©2004-2016