|
Keil и Cortex M4, Складывает данные по невыровненым адресам |
|
|
|
 |
Ответов
|
Feb 10 2016, 05:39
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Feb 10 2016, 06:42
|

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

|
Цитата(Сергей Борщ @ Feb 10 2016, 11:39)  ... Да. Сейчас все изучил, прочитал и понял - где ошибался. Но. Ладно - в Keil мне повезло с одним проектом. В IAR повезло с двумя??? Сроду никогда таким везучим не был. Вспомнил. До этого делал еще один проект с STM32L151 год назад - стек USB такой же - свой, самописный. Те же структуры и данные. ХардФолтов не было точно. И еще один проект делал тоже год назад но на STM32F103. На этом же стеке, но в IAR - и тоже без проблем. Вот и привык, что компилятор сам все адреса выравнивает... Т.е. вылезло только вчера и только на М4 и только на Keil. Цитата(Сергей Борщ @ Feb 10 2016, 11:39)  Выравнивается любая структура или массив. Но, в принципе, чтобы уйти от __attribute__(align(4)) я могу все структуры сделать как union c переменной типа UINT32: Код #pragma pack(4) typedef struct __Foo { ....
} Foo, *p_Foo #pragma pack()
union __uFoo { Foo DataStructure; UINT32 dwValue;
} uFoo, *p_uFoo;
--------------------
|
|
|
|
Сообщений в этой теме
prottoss Keil и Cortex M4 Feb 9 2016, 18:53 aaarrr Без примера некорректного размещения дать какой-ли... Feb 9 2016, 20:10 prottoss Во вложении файлы, в которых размещены дескрипторы... Feb 10 2016, 01:23 aaarrr В файлах нет типов, но на каком основании, наприме... Feb 10 2016, 01:39 prottoss Цитата(aaarrr @ Feb 10 2016, 07:39) В фай... Feb 10 2016, 02:30    Сергей Борщ Цитата(prottoss @ Feb 10 2016, 08:42) Но,... Feb 10 2016, 07:21  demiurg_spb Цитата(prottoss @ Feb 10 2016, 06:29) Бли... Feb 10 2016, 10:49 SasaVitebsk Сергей Борщ, а можно я один вопрос задам. Тему нов... Feb 10 2016, 06:42 Alechek SasaVitebsk, потому что в IAR в документации напис... Feb 10 2016, 07:01 psL вроде бы у Keil #pragma pack( 4 ) была Feb 10 2016, 09:51
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|