|
LPC2888, Data Abort exception, при выполнении кода из Flash |
|
|
|
Jan 11 2011, 08:28
|

Участник

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

|
Вот я уже и начал менять. Походу ничего другого мне не остается. Сразу тогда по word'ам выровняю. Я их вне структур сейчас и не использую, но на всякий случай предусмотрю расширяемость.  А побайтовый доступ - нет уж, извините, это значит придется отказаться от структур и весь код превратится в сплошную арифметику со смещениями, пускай и заданных в макросах.  UPDATE: Не, по вордам жирновато будет
Сообщение отредактировал artymen - Jan 11 2011, 08:40
--------------------
"Сознание своего несовершенства приближает к совершенству" Гёте
|
|
|
|
|
Jan 11 2011, 10:15
|

Участник

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

|
Ну тогда я не понимаю, что вы имеете в виду под "побайтовым" доступом.
--------------------
"Сознание своего несовершенства приближает к совершенству" Гёте
|
|
|
|
|
Jan 11 2011, 11:24
|

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

|
Цитата(artymen @ Jan 11 2011, 13:40)  Там тоже был невыровненный доступ  Но мне кажется, это недоработка со стороны аппаратной поддержки невыравниваемого доступа. Полагаю, она есть несмотря на директиву в архитектуре. По всей видимости, контроллер памяти успел провернуть трюк с двойным доступом и ротацией в RAM, а вот с флешем этот трюк уже не уложился во флешевые wait-таймы, и потому провалился по таймауту, вызвав аборт. Это всего лишь предположение, точнее очередное мое злорадство в сторону LPC2888  LPC2888 не причём, проблема с этим кодом может возникнуть на любом процессоре да и архитектуре в целом, требующей выровненного доступа.
|
|
|
|
|
Jan 11 2011, 15:06
|
.
     
Группа: Участник
Сообщений: 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 тоже есть упаковка структур, но она так побайтово не работает на все поля структуры, насколько я успел проверить. Там надо читать доку на компилятор. Или у кого-то знающего спрашивать.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 12 2011, 00:54
|

Участник

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

|
Хм, классно. Выходит, IAR рулит  И все же во мне теплится надежда, что gcc не отстает в этом вопросе и где-то в его глубинах все же заложена подобная возможность, надо только 700 страниц мануала перелопатить и всего-то
--------------------
"Сознание своего несовершенства приближает к совершенству" Гёте
|
|
|
|
|
Jan 12 2011, 04:29
|

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

|
Цитата(GetSmart @ Jan 11 2011, 21:06)  А если pragma pack использовалась при объявлении структуры (просто добавить до и после структуры), то со структурой можно работать не думая о выравнивании (о Data Abort-ах) при явном преобразовании любых указателей или любых адресов. То есть компилятор будет ко всем переменным в структуре обращаться побайтово сам автоматически. В GCC CW тоже есть упаковка структур, но она так побайтово не работает на все поля структуры, насколько я успел проверить. Там надо читать доку на компилятор. Или у кого-то знающего спрашивать. Ничего подобного, gcc также как и iar делает побайтовый доступ к эелементам пакованной структуры. В то же время и в iar'ре никто не застрахован от дата абортов. Всё зависит от грамотности кода на С. Есть пример кода, который IAR правильно скомпилирует, а GCC нет?
|
|
|
|
|
Jan 12 2011, 05:03
|

Участник

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

|
Ну елки палки ! Выровнял я свои данные. Теперь Qt'шный gcc и Yagarto'вский gcc по-разному стали размещать поля в структурах, объявленных с аттрибутом aligned(2) (до этого packed были).  Дело в том, что у меня кроссплатформенный код. На Qt все работает нормально, как и было до выравнивания. Другого быть впрчоем и не может, потому что другая программа на том же самом Qt и запихала данные в структуру, и прочитались они соответсвенно аналогичным образом. А вот теперь в АРМе они читаются по-другому. UPDATE: Выяснил. Опять дата аборт. Теперь он произошел при word'овом доступе. Ясно теперь, откуда взялись лишние 2 байта в структуре... Вобщем, еще немножко переделаю, раз уж такие интересные подробности выравнивания структуры и эелемнтов внутри нее выяснились
Сообщение отредактировал artymen - Jan 12 2011, 05:45
--------------------
"Сознание своего несовершенства приближает к совершенству" Гёте
|
|
|
|
|
Jan 12 2011, 06:07
|

Участник

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

|
Все, победил !  Всем спасибо. Теперь буду знать об этих граблях  Цитата В упакованные побайтно структуры все компиляторы должны размещать переменные одинаково. По крайней мере на платформах в которых байты 8-битные. Поэтому с ними проще всего сделать универсальный код. А вот с неупакованными структурами делать сложнее, там надо вручную всё выравнивать чтобы на всех платформах структуры были побайтно одинаковые. Не, все нормально, компилятор то один и тот же. Это я, просто сначала сделав правильные аттрибуты (aligned(2), packed), неверно кое-что истолковал и убрал packed, потом понял, что я неверно истолковал и вернул обратно. Теперь все работает, как надо
Сообщение отредактировал artymen - Jan 12 2011, 06:10
--------------------
"Сознание своего несовершенства приближает к совершенству" Гёте
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|