Перейти к содержанию

    

Размер unsigned int или int Keil4.5

Вы не о том возражаете по цитате :rolleyes:

Два массива могли бы оказаться где угодно, а не друг рядом с другом.

Я Вам как раз по цитате. Вы вчера никак не могли себя убедить, как упаковываются данные, ссылаясь на какие-то внешние причины и т.д.

А вот теперь Ваша очередь убедит меня, как я вчера, что цитата, под которой Вы подписались- верна. Приведите пример листинга объявления переменных и соответствующий мап-файл, что бы это было очевидно. Сможете добиться такого результата, о чем так переживает автор приведенной Вами цитаты? Тогда и цитата Ваша будет чего-то стоить :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Сможете добиться такого результата, о чем так переживает автор приведенной Вами цитаты? Тогда и цитата Ваша будет чего-то стоить :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)

При любом другом уровне - то же самое!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
При любом другом уровне - то же самое!

Хорошо, убедили. :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

union {
  struct { 
    unsigned char A;
    unsigned long B;
    unsigned char C;
  };
};

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

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

Поделиться сообщением


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

 

union {
  struct { 
    unsigned char A;
    unsigned long B;
    unsigned char C;
  };
};

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

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

Со структурами анонимус и не анонимус было понятно изначально. Тут речь шла о не связанных логически данных. Единственная их связь - одинаковое объявления в одном месте в программе. По умолчанию, кстати, в структуре данные тоже не упакованы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Со структурами анонимус...

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Единственная их связь - одинаковое объявления в одном месте в программе. По умолчанию, кстати, в структуре данные тоже не упакованы.

Это не связь! компилятор может их раскидать по своему усмотрению, особенно если оптимизация включена!

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

И по стандарту С - только в структурах гарнируется порядок данных!

 

 

demiurg_spb,

В C11 уже есть анонимные структуры и объеденения, правда на счет глобальных непонятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Или это какая-то особенность IAR'а ?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Дурацкий вопрос: union-то зачем? Вполне достаточно одной только структуры.

Или это какая-то особенность IAR'а ?

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

Но в любом случае это не портабельно.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я всегда устанавливаю UNALIGN_TRP, тогда любая инструкция, выполняющая Unaligned access даст UsageFault. чтобы быстрее баги отловить..

Как эту ловушку использовать?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вешаем обработчик на исключение UsageFault, а в нем уже делаем то, что нам нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вешаем обработчик на исключение UsageFault, а в нем уже делаем то, что нам нужно.

Понятно, спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация