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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> LPC2888, Data Abort exception, при выполнении кода из Flash
artymen
сообщение Jan 11 2011, 08:28
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 6-11-09
Из: г. Омск
Пользователь №: 53 464



Вот я уже и начал менять. Походу ничего другого мне не остается. Сразу тогда по word'ам выровняю. Я их вне структур сейчас и не использую, но на всякий случай предусмотрю расширяемость. sm.gif
А побайтовый доступ - нет уж, извините, это значит придется отказаться от структур и весь код превратится в сплошную арифметику со смещениями, пускай и заданных в макросах. sm.gif

UPDATE: Не, по вордам жирновато будет rolleyes.gif

Сообщение отредактировал artymen - Jan 11 2011, 08:40


--------------------
"Сознание своего несовершенства приближает к совершенству"
Гёте
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 11 2011, 08:33
Сообщение #17


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(artymen @ Jan 11 2011, 16:28) *
А побайтовый доступ - нет уж, извините, это значит придется отказаться от структур и весь код превратится в сплошную арифметику со смещениями, пускай и заданных в макросах. sm.gif

Нда... В IAR со структурами не было бы абсолютно никаких проблем. В GCC из CW то же был какой-то метод побайтового доступа. Изменения в коде были бы только в одном месте - в месте объявления структур, а в коде вообще ничего бы не изменилось.

Сообщение отредактировал GetSmart - Jan 11 2011, 08:33


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
artymen
сообщение Jan 11 2011, 10:15
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 6-11-09
Из: г. Омск
Пользователь №: 53 464



Ну тогда я не понимаю, что вы имеете в виду под "побайтовым" доступом.


--------------------
"Сознание своего несовершенства приближает к совершенству"
Гёте
Go to the top of the page
 
+Quote Post
xelax
сообщение Jan 11 2011, 11:24
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(artymen @ Jan 11 2011, 13:40) *
Там тоже был невыровненный доступ sm.gif Но мне кажется, это недоработка со стороны аппаратной поддержки невыравниваемого доступа. Полагаю, она есть несмотря на директиву в архитектуре. По всей видимости, контроллер памяти успел провернуть трюк с двойным доступом и ротацией в RAM, а вот с флешем этот трюк уже не уложился во флешевые wait-таймы, и потому провалился по таймауту, вызвав аборт. Это всего лишь предположение, точнее очередное мое злорадство в сторону LPC2888 sm.gif


LPC2888 не причём, проблема с этим кодом может возникнуть на любом процессоре да и архитектуре в целом, требующей выровненного доступа.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 11 2011, 15:06
Сообщение #20


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(artymen @ Jan 11 2011, 18:15) *
Ну тогда я не понимаю, что вы имеете в виду под "побайтовым" доступом.


В IAR делается так
Код
#pragma pack(push, 1)
typedef union
{ float f;
  long l;
  char c[4];
} un_flc;
#pragma pack(pop)

далее можно использовать этот универсальный тип так
Код
long num = ((un_flc *)ptr)->l;

и доступ к переменной будет побайтовый.

А если pragma pack использовалась при объявлении структуры (просто добавить до и после структуры), то со структурой можно работать не думая о выравнивании (о Data Abort-ах) при явном преобразовании любых указателей или любых адресов. То есть компилятор будет ко всем переменным в структуре обращаться побайтово сам автоматически.
В GCC CW тоже есть упаковка структур, но она так побайтово не работает на все поля структуры, насколько я успел проверить. Там надо читать доку на компилятор. Или у кого-то знающего спрашивать.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
artymen
сообщение Jan 12 2011, 00:54
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 6-11-09
Из: г. Омск
Пользователь №: 53 464



Хм, классно. Выходит, IAR рулит sm.gif И все же во мне теплится надежда, что gcc не отстает в этом вопросе и где-то в его глубинах все же заложена подобная возможность, надо только 700 страниц мануала перелопатить и всего-то biggrin.gif


--------------------
"Сознание своего несовершенства приближает к совершенству"
Гёте
Go to the top of the page
 
+Quote Post
xelax
сообщение Jan 12 2011, 04:29
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(GetSmart @ Jan 11 2011, 21:06) *
А если pragma pack использовалась при объявлении структуры (просто добавить до и после структуры), то со структурой можно работать не думая о выравнивании (о Data Abort-ах) при явном преобразовании любых указателей или любых адресов. То есть компилятор будет ко всем переменным в структуре обращаться побайтово сам автоматически.
В GCC CW тоже есть упаковка структур, но она так побайтово не работает на все поля структуры, насколько я успел проверить. Там надо читать доку на компилятор. Или у кого-то знающего спрашивать.


Ничего подобного, gcc также как и iar делает побайтовый доступ к эелементам пакованной структуры.
В то же время и в iar'ре никто не застрахован от дата абортов.
Всё зависит от грамотности кода на С.
Есть пример кода, который IAR правильно скомпилирует, а GCC нет?
Go to the top of the page
 
+Quote Post
artymen
сообщение Jan 12 2011, 05:03
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 6-11-09
Из: г. Омск
Пользователь №: 53 464



Ну елки палки ! Выровнял я свои данные. Теперь Qt'шный gcc и Yagarto'вский gcc по-разному стали размещать поля в структурах, объявленных с аттрибутом aligned(2) (до этого packed были). angry.gif
Дело в том, что у меня кроссплатформенный код. На Qt все работает нормально, как и было до выравнивания. Другого быть впрчоем и не может, потому что другая программа на том же самом Qt и запихала данные в структуру, и прочитались они соответсвенно аналогичным образом. А вот теперь в АРМе они читаются по-другому.
UPDATE: Выяснил. Опять дата аборт. Теперь он произошел при word'овом доступе. Ясно теперь, откуда взялись лишние 2 байта в структуре... Вобщем, еще немножко переделаю, раз уж такие интересные подробности выравнивания структуры и эелемнтов внутри нее выяснились sm.gif

Сообщение отредактировал artymen - Jan 12 2011, 05:45


--------------------
"Сознание своего несовершенства приближает к совершенству"
Гёте
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 12 2011, 05:41
Сообщение #24


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(artymen @ Jan 12 2011, 13:03) *
Ну елки палки ! Выровнял я свои данные. Теперь Qt'шный gcc и Yagarto'вский gcc по-разному стали размещать поля в структурах, объявленных с аттрибутом aligned(2) (до этого packed были). angry.gif

В упакованные побайтно структуры все компиляторы должны размещать переменные одинаково. По крайней мере на платформах в которых байты 8-битные. Поэтому с ними проще всего сделать универсальный код. А вот с неупакованными структурами делать сложнее, там надо вручную всё выравнивать чтобы на всех платформах структуры были побайтно одинаковые.

xelax, будет время приведу. Но на грабли эти я вставал, помню точно.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
artymen
сообщение Jan 12 2011, 06:07
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 6-11-09
Из: г. Омск
Пользователь №: 53 464



Все, победил ! yeah.gif Всем спасибо. Теперь буду знать об этих граблях sm.gif
Цитата
В упакованные побайтно структуры все компиляторы должны размещать переменные одинаково. По крайней мере на платформах в которых байты 8-битные. Поэтому с ними проще всего сделать универсальный код. А вот с неупакованными структурами делать сложнее, там надо вручную всё выравнивать чтобы на всех платформах структуры были побайтно одинаковые.
Не, все нормально, компилятор то один и тот же. Это я, просто сначала сделав правильные аттрибуты (aligned(2), packed), неверно кое-что истолковал и убрал packed, потом понял, что я неверно истолковал и вернул обратно. Теперь все работает, как надо sm.gif

Сообщение отредактировал artymen - Jan 12 2011, 06:10


--------------------
"Сознание своего несовершенства приближает к совершенству"
Гёте
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 12 2011, 06:43
Сообщение #26


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(GetSmart @ Jan 12 2011, 12:41) *
В упакованные побайтно структуры все компиляторы должны размещать переменные одинаково. По крайней мере на платформах в которых байты 8-битные. Поэтому с ними проще всего сделать универсальный код. А вот с неупакованными структурами делать сложнее, там надо вручную всё выравнивать чтобы на всех платформах структуры были побайтно одинаковые.

xelax, будет время приведу. Но на грабли эти я вставал, помню точно.


Вовсе нет. Пример: Keil C51 и SDCC. Они int упаковывают по разному. Соответственно и структуры, содержащие переменные этих типов, будут представлены по разному, даже при их байтной упаковке.
Go to the top of the page
 
+Quote Post
xelax
сообщение Jan 12 2011, 09:34
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(sergeeff @ Jan 12 2011, 12:43) *
Вовсе нет. Пример: Keil C51 и SDCC. Они int упаковывают по разному. Соответственно и структуры, содержащие переменные этих типов, будут представлены по разному, даже при их байтной упаковке.


wacko.gif Как можно структуру упаковать поразному с выравниванием 1?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 31st August 2025 - 19:38
Рейтинг@Mail.ru


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