|
Odd address trap и LPC23xx, А что, LPC не генерит unaligned access exeption? |
|
|
|
Jan 15 2009, 18:43
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
У меня в тестовой прошивке есть такой небольшой чудный кусочек кода: Код { ungigned long *p; dprintf("\r\nNon aligned DWORD read.. "); dflush(); p = (unsigned long*)(0x209 + LPC_ISRAM); dprintf("%08X", *p); } Назначение этого кусочка - протестировать работу соответствующего обработчика исключения. Код прекрасно отработал на S3C44BOX, S3C2410, IXP42x, SAM7xx, PXA2xx/3xx и много лет все было чудесно. И вот, "понимаете, в машине в которой мы ехали, случайно, совершенно случайно, оказался цемент" ©. Я "совершенно случайно" запустил этот код на LPC2388, и... не увидел свой любимый "ODD ADDRESS TRAP". Смотрим документацию, "усер мануал" на LPC23xx вообще не содержит слова "unaligned". В-общем, красота - при невыравненном адресе - на LPC23xx читается/пишется переставленный мусор, и все это МОЛЧА. Такая низость в самом деле имеет место, или я чего-то недопонимаю?
|
|
|
|
|
 |
Ответов
|
Jan 16 2009, 08:33
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(VslavX @ Jan 15 2009, 22:43)  В-общем, красота - при невыравненном адресе - на LPC23xx читается/пишется переставленный мусор, и все это МОЛЧА. Такая низость в самом деле имеет место, или я чего-то недопонимаю? У меня есть файл arm7tdmi_instruction_set_reference.pdf, там написано следующее: Код If the memory address is not word-aligned, the value read is rotated right by 8 times the value of bits [1:0] of the memory address. If R15 is specified as the destination, the value is loaded from memory and written to the PC, effecting a branch.
|
|
|
|
|
Jan 16 2009, 09:02
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Код If the memory address is not word-aligned, the value read is rotated right by 8 times the value of bits [1:0] of the memory address. If R15 is specified as the destination, the value is loaded from memory and written to the PC, effecting a branch. Именно это я подразумевал под словом "переставленный". Для ARM7TDMI, который работает только в LE - будет такой вариант как Вы отцитировали. Для старших ARM-ов работающих в BE/LE вполне могут быть и отличия. В любом случае - в результате невыравненного доступа получаем отнюдь не тот результат какой ожидали, а поскольку исключения нет - то "дорогая не узнает, какой у парня был конец" ©. Очень весело отлавливать такие проблемы при портировании 200К строк С-шного кода с 8-битника, например. NXP - "низачот", первый раз такой облом вижу. В 70-ых на PDP такое счастье как OAT было, а вот в 21-ом веке - не судьба.
|
|
|
|
|
Jan 16 2009, 09:58
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(VslavX @ Jan 16 2009, 12:02)  Очень весело отлавливать такие проблемы при портировании 200К строк С-шного кода с 8-битника, например. Вообще-то "это отлаживать" - Вам "низачет", ибо нужно не с последствиями бороться а банально этои 200К строк (кстати для 8bit это число строк кода СИЛЬНО СИЛЬНО надуманное - "урежте осетра" как минимум на порядок, тогда еще где-то в 64-128K бинарника поверю ) хоть мельком, но просмотреть. И вообще с этим хорошие компиляторы хорошо справляются - warning-ов хватает, если, конечно перворначальный код не совсем через заденпроходное отверстие писан, но незачем такое и портировать. Цитата NXP - "низачот", первый раз такой облом вижу. В 70-ых на PDP такое счастье как OAT было, а вот в 21-ом веке - не судьба. Тут странное дело - когда давно поверял работу своего обработчика exception на чем-то вроде LPC2114 - точно работало, а потом на свежих чипах как-то исчезло, хотя недавно переписывал слегка и некоторым удивлением обнаружил, что на одном из китов с LPC2148 тоже отработал!
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 16 2009, 10:20
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(zltigo @ Jan 16 2009, 11:58)  (кстати для 8bit это число строк кода СИЛЬНО СИЛЬНО надуманное - "урежте осетра" как минимум на порядок, тогда еще где-то в 64-128K бинарника поверю ) Я прочитал как 200KB  200K строк действительно многовато. Цитата И вообще с этим хорошие компиляторы хорошо справляются - warning-ов хватает, если, конечно перворначальный код не совсем через заденпроходное отверстие писан, то незачем такое и портировать. Компиляторы не помогут когда адрес вычисляется диамически.  Например, сравнение IPшника приятого пакета с сетевой маской.
|
|
|
|
|
Jan 16 2009, 10:30
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(defunct @ Jan 16 2009, 13:20)  Компиляторы не помогут когда адрес вычисляется диамически.  Например, сравнение IPшника приятого пакета с сетевой маской. Отнюдь. В реальности буфера под фреймы выделяются выровненые а нормальная разборка ведется по наложенной структуре. При работе с невыровнеными элемсентами структуры полусите предупреждение. Есть масса более ветвистых протоколов, то там в основном и разборка побайтовая. Если кто-то нагородил нечто непотребное в стиле "я пишу на любом языке, как в машинных кодах", то, простите, портировать такое просто не надо - проблемы будут по любому.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 16 2009, 13:27
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(zltigo @ Jan 16 2009, 12:30)  Отнюдь. В реальности буфера под фреймы выделяются выровненые а нормальная разборка ведется по наложенной структуре. Это все так, но давайте рассмотрим случай когда пакеты идут с разных интерфейсов. Eth и PPP-Link (у одного перед IP header'ом 14 байт eth заголовка, у второго длина ppp заголовка зависит от настроек канала и может быть от 1 байта и выше... И там и там "по-умолчанию" IP заголовок получается невыровненым относительно начала пакета. А мы хотим проверить по маске быстро (чтобы "одной" командой): Код *(U32 *)(packet + offset) & mask Вот тут недостача align exception'а может сыграть злую шутку Цитата Если кто-то нагородил нечто непотребное в стиле "я пишу на любом языке, как в машинных кодах", то, простите, портировать такое просто не надо - проблемы будут по любому. Я безотносительно, ни к чьему коду не привязываясь. Просто интересно получить ответы на следующие вопросы: Что у NXP есть по поводу misalign'a - как они предлагают обрабатывать такие ситуации в run-time (какие-нить их доки на этот счет)? Может быть есть сводка в каких NXP чипах align exception поддерживается, а в каких нет?
|
|
|
|
|
Jan 16 2009, 13:43
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(defunct @ Jan 16 2009, 19:27)  Код *(U32 *)(packet + offset) & mask Вот тут недостача align exception'а может сыграть злую шутку Для таких случаев нужно создавать дополнительный U32 (например U32ua) внутри pragma pack (1). Это конечно не совместимость снизу вверх, но так можно написать универсальный код, правильно работающий на 8, 16 и 32 платформах.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
Сообщений в этой теме
VslavX Odd address trap и LPC23xx Jan 15 2009, 18:43 aaarrr Цитата(VslavX @ Jan 15 2009, 21:43) Такая... Jan 15 2009, 19:37 VslavX Цитата(aaarrr @ Jan 15 2009, 21:37) Имеет... Jan 15 2009, 20:08  abcdefg Цитата(VslavX @ Jan 15 2009, 23:08) P.S. ... Jan 16 2009, 07:35   VslavX Цитата(abcdefg @ Jan 16 2009, 09:35) в ко... Jan 16 2009, 07:56 amw Цитата(VslavX @ Jan 15 2009, 20:43) У мен... Jan 16 2009, 07:43  meister Цитата(VslavX @ Jan 16 2009, 13:02) В люб... Jan 16 2009, 09:04      zltigo Цитата(defunct @ Jan 16 2009, 16:27) Это ... Jan 16 2009, 13:38       defunct Цитата(zltigo @ Jan 16 2009, 15:38) В дан... Jan 16 2009, 13:49        GetSmart Цитата(defunct @ Jan 16 2009, 19:49) Не, ... Jan 16 2009, 14:16         defunct Цитата(GetSmart @ Jan 16 2009, 16:16) Ещё... Jan 16 2009, 18:01          GetSmart Цитата(defunct @ Jan 17 2009, 00:01) Да н... Jan 17 2009, 05:12           VslavX Цитата(GetSmart @ Jan 17 2009, 07:12) А в... Jan 17 2009, 06:46           defunct Цитата(GetSmart @ Jan 17 2009, 07:12) Пар... Jan 17 2009, 17:00            zltigo Цитата(defunct @ Jan 17 2009, 19:00) В та... Jan 17 2009, 17:13             defunct Цитата(zltigo @ Jan 17 2009, 19:13) Вы, э... Jan 17 2009, 18:25              aaarrr Цитата(defunct @ Jan 17 2009, 21:25) т.к.... Jan 17 2009, 18:41              abcdefg Цитата(defunct @ Jan 17 2009, 21:25) О то... Jan 17 2009, 18:47              zltigo Цитата(defunct @ Jan 17 2009, 20:25) О то... Jan 17 2009, 19:46               defunct Цитата(zltigo @ Jan 17 2009, 21:46) Ну и ... Jan 18 2009, 00:44                GetSmart Цитата(defunct @ Jan 18 2009, 06:44) Согл... Jan 18 2009, 06:15                 defunct Цитата(GetSmart @ Jan 18 2009, 08:15) Дам... Jan 18 2009, 21:46              VslavX Цитата(defunct @ Jan 17 2009, 20:25) на L... Jan 17 2009, 19:58   VslavX Цитата(zltigo @ Jan 16 2009, 11:58) Вообщ... Jan 16 2009, 11:03    meister Цитата(zltigo @ Jan 16 2009, 13:58) Тут с... Jan 16 2009, 11:11    zltigo Цитата(VslavX @ Jan 16 2009, 14:03) Самый... Jan 16 2009, 12:07     VslavX Цитата(zltigo @ Jan 16 2009, 14:07) Все в... Jan 16 2009, 16:23      zltigo Цитата(VslavX @ Jan 16 2009, 19:06) Чему ... Jan 16 2009, 16:38       VslavX Цитата(zltigo @ Jan 16 2009, 18:24) проек... Jan 16 2009, 16:39        zltigo Цитата(VslavX @ Jan 16 2009, 19:39) А мож... Jan 16 2009, 17:01         VslavX Цитата(zltigo @ Jan 16 2009, 19:01) memcp... Jan 16 2009, 18:06          zltigo Цитата(VslavX @ Jan 16 2009, 21:06) Ну и ... Jan 16 2009, 18:52           VslavX Цитата(zltigo @ Jan 16 2009, 20:52) Посме... Jan 16 2009, 20:28            zltigo Цитата(VslavX @ Jan 16 2009, 22:28) Гы, я... Jan 16 2009, 21:45 GetSmart Прямо скажу, я за 3 года об АРМах столько всего на... Jan 17 2009, 08:52 zltigo Цитата(GetSmart @ Jan 17 2009, 10:52) А н... Jan 18 2009, 11:17  aaarrr Цитата(zltigo @ Jan 18 2009, 14:17) Если ... Jan 18 2009, 12:10   zltigo Цитата(aaarrr @ Jan 18 2009, 14:10) генер... Jan 18 2009, 12:14  VslavX Имхо, это уж совсем клиническая ситуация - "н... Jan 18 2009, 13:06 zltigo ЦитатаИмхо, это уж совсем клиническая ситуация - ... Jan 18 2009, 13:18 VslavX Мне правда интересно. На ARM-е можно любой невырав... Jan 18 2009, 13:30  zltigo Цитата(VslavX @ Jan 18 2009, 15:30) Не по... Jan 18 2009, 13:53   VslavX Цитата(zltigo @ Jan 18 2009, 15:53) У мен... Jan 18 2009, 14:29    zltigo Цитата(VslavX @ Jan 18 2009, 16:29) Ну, д... Jan 18 2009, 15:32     VslavX Кодtst R0,#0x3
ldrh R0,[R0, #+0]
lsrne ... Jan 18 2009, 15:47     GetSmart Цитата(zltigo @ Jan 18 2009, 21:32) Кодls... Jan 18 2009, 16:28      zltigo Цитата(GetSmart @ Jan 18 2009, 18:28) Это... Jan 18 2009, 17:27       VslavX КодBYTE tbuff[8] = { 0x01, 0x02, 0x03, 0x0... Jan 18 2009, 19:32        zltigo Цитата(VslavX @ Jan 18 2009, 21:32) А чег... Jan 18 2009, 20:06         VslavX Цитата(zltigo @ Jan 18 2009, 22:06) Писал... Jan 18 2009, 20:37          zltigo Цитата(VslavX @ Jan 18 2009, 22:37) Я так... Jan 18 2009, 20:55 Rst7 Цитатаtst R0,#0x3
ldrh R0,[R0, #+0]
lsrne... Jan 18 2009, 15:43 zltigo Цитата(Rst7 @ Jan 18 2009, 17:43) Простит... Jan 18 2009, 16:05  VslavX Цитата(zltigo @ Jan 18 2009, 18:05) Я НЕ ... Jan 18 2009, 16:28 GetSmart Понятно, хочется переложить на процессор собственн... Jan 19 2009, 06:00 defunct Цитата(GetSmart @ Jan 19 2009, 08:00) Пон... Jan 19 2009, 11:39  GetSmart Цитата(defunct @ Jan 19 2009, 17:39) Два ... Jan 19 2009, 12:28
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|