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

 
 
> Keil и Cortex M4, Складывает данные по невыровненым адресам
prottoss
сообщение Feb 9 2016, 18:53
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Доброго времени суток.

Сам я Keil не использую, но была необходимость сделать проект именно на этом компиляторе. Проект собран под два проца - первый STM32F107 (Cortex M3) второй под STM32L475 (Cortex M4). Проект связан с передачей данных по USB с использованием встроенного в МК USB OTG модуля, по этому в проекте есть объявленные в виде структур данные всевозможных USB дескрипторов. Так вот, при работе программы под М3 глюков не наблюдалось и он был перенесен на М4. Тут начались глюки. Пр передаче первой же послыки (т.е. еще на этапе нумерации) по USB проц падает в HardFault. Копание показало, что Keil, при использованиии первого МК (М3) размещает все данные по выровненным на 32-бит адресам. При компилировании проекта под М4 он размещает данные с выравниванием в 16-бит... Как так то? или я чего то не понимаю/не знаю?

В IAR проект под М3 проверял, под М4 с целевым процом (STM32L475) нет, но адреса расположены с правильным выравниванием. С другим МК - STM32F407 проект работает нормально.

Четогдето в Keil подкрутить нужно? Или мне? cranky.gif


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Feb 10 2016, 02:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Остается убедить в этом компилятор sm.gif Нет, не должен, и AAPCS такого не требует.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 10 2016, 03:29
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Feb 10 2016, 08:38) *
Остается убедить в этом компилятор sm.gif Нет, не должен, и AAPCS такого не требует.
С 8-битным массивом понятно - не должен. Но как быть со структурами данных? Неужели там тоже этого не требуется?


В принципе, я нашел как договорится с компилятором с помощью __attribute__(align(4)). Блин, но я тогда гвоздями прибью этот код к конкретному компилятору

И, опять же не понятно, почему для М3 компилятор данные выравнивает, а для М4 нет?


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 10 2016, 05:39
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(prottoss @ Feb 10 2016, 05:29) *
Но как быть со структурами данных? Неужели там тоже этого не требуется?
Выравнивается любая структура или массив. На это есть совершенно четкие правила. Массив байтов выравнивается на адрес, кратный одному. Массив двухбайтовых целых - на адрес, кратный двум. Адреса начала структур и размер структур выравиваются на адрес, кратный размеру наибольшего члена но не больше требований платформы, то есть 4 байт для ARM.

Цитата(prottoss @ Feb 10 2016, 05:29) *
В принципе, я нашел как договорится с компилятором с помощью __attribute__(align(4)). Блин, но я тогда гвоздями прибью этот код к конкретному компилятору
Да.
Цитата(prottoss @ Feb 10 2016, 05:29) *
И, опять же не понятно, почему для М3 компилятор данные выравнивает, а для М4 нет?
Вероятнее всего там вам просто повезло.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:23
Рейтинг@Mail.ru


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