|
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:38
|

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

|
Цитата(defunct @ Jan 16 2009, 16:27)  Это все так, но давайте рассмотрим случай когда пакеты идут с разных интерфейсов. Можно многое, что искусственно придумать и еще больше "реализовать" по дурному - не вопрос  . В данном конкретном случае сразу могу спросить, а какого они идут в один и тот-же буфер? Давайте не будем развивать эту тему. Я ведь тоже все это не просто так сказал - в частности протоколы, например, входящие в стеки SS7, ISDN, V5.2, ... реализовывалитсь на разных платформах, портировались, инкапсулировались а в них разборки на порядки сложнее и ветвистее нежели IP, пусть даже он Ethernet+VLAN и т.д.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 16 2009, 13:49
|

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

|
Цитата(zltigo @ Jan 16 2009, 15:38)  В данном конкретном случае сразу могу спросить, а какого они идут в один и тот-же буфер? Ну... потому что на IP уровне и те и те - IP. Да и чтоб расход памяти соптимизировать - пользовать один и тот же пул пакетов. Цитата Давайте не будем развивать эту тему. ОК Цитата(GetSmart @ Jan 16 2009, 15:43)  Для таких случаев нужно создавать дополнительный U32 (например U32ua) внутри pragma pack (1). Не, такое - не пойдет. Тормозить будет, т.к. будет LDRB вместо LDR. Мы ж скорости хотим.  - если скорость не нужна можно везде все упаковать и будет ARM как восьмибитник работать.
|
|
|
|
|
Jan 16 2009, 14:16
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(defunct @ Jan 16 2009, 19:49)  Не, такое - не пойдет. Тормозить будет, т.к. будет LDRB вместо LDR. Мы ж скорости хотим.  - если скорость не нужна можно везде все упаковать и будет ARM как восьмибитник работать. Ещё как пойдёт. Только использовать его надо именно в местах разбора буферов, в которых есть хоть малейшая вероятность невыровненности данных. Для работы с обычными переменными (статика, локальные) надо применять тип без прагмы.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 16 2009, 18:01
|

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

|
Цитата(GetSmart @ Jan 16 2009, 16:16)  Ещё как пойдёт. Да не пойдет так! т.к. медленно. Конкретно в этом случае ожидается, что данные в буфере выровнены. Если нет - тогда это критическая ситуация и проц должен дать мне фатальный эксепшин. Цитата Только использовать его надо именно в местах разбора буферов, в которых есть хоть малейшая вероятность невыровненности данных. Для работы с обычными переменными (статика, локальные) надо применять тип без прагмы. Зачем замедлять работу программы лишними проверками и лишними побайтовыми операциями в критических для производительности местах? Из-за "малейшей" вероятности делать код вчетверо медленнее - увольте. Мне лучше эксепшн
|
|
|
|
|
Jan 17 2009, 05:12
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(defunct @ Jan 17 2009, 00:01)  Да не пойдет так! т.к. медленно. Паранойя?! Вы ещё совсем недавно всё на AVR песали и не жаловались на быстродействие. LPC раз в 5 быстрее AVR, и если на нём побайтово из буфера собирать Long, то особых тормозов не будет заметно. Дальше спорить не буду. Я всё равно останусь при своём мнении. А вообще, тут все забыли одну вещь касательно Data Abort при невыровненных словах. Где-то читал, что в LPC он возникает только если проц работает в USER MODE. Во всех остальных MODE, в частности в SYSTEM MODE он специально заблокирован, так как все остальные режимы предназначены для системы. Так что, господа песатели, отлаживайте свои проги в USER MODE, а когда уже всё отладите можете переносить код в другие режимы
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 17 2009, 17:00
|

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

|
Цитата(GetSmart @ Jan 17 2009, 07:12)  Паранойя?! Вы ещё совсем недавно всё на AVR песали и не жаловались на быстродействие. Я и до сих пор под AVR/C51 много чего пишу, и не жалуюсь на быстродействие. Но там у меня задачи нетребовательные к быстродействию. Не понимаю, Вы пытаетесь защитить/оправдать остуствие exception'a в LPC?! Цитата LPC раз в 5 быстрее AVR, и если на нём побайтово из буфера собирать Long, то особых тормозов не будет заметно. Дальше спорить не буду. Я всё равно останусь при своём мнении. В таком случае SAM7 "порвет" LPC по производительности (т.к. не нужно будет собирать Long побайтово). Цитата А вообще, тут все забыли одну вещь касательно Data Abort при невыровненных словах. Где-то читал, что в LPC он возникает только если проц работает в USER MODE. Во всех остальных MODE, в частности в SYSTEM MODE он специально заблокирован, так как все остальные режимы предназначены для системы. Если можно - более подробно на этот счет. Где читали? ;>
|
|
|
|
|
Jan 17 2009, 18:25
|

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

|
Цитата(zltigo @ Jan 17 2009, 19:13)  Вы, это, простите о чем??? О том что мне совесть не позволит в проц в котором нет exception'a вставить опасный код. Следовательно придется добавлять проверки, а они будут тормозить. на SAM'е мне ничто не мешает там где нужна скорость написать: *(U32 *)<произвольный адрес> = x; т.к. есть полная уверенность в том, что даже если произвольный адрес неправильный я это не пропущу. на LPC будет как минимум: Код if (<произвольный адрес> & 0x3) { slow implementation } else { fast }
|
|
|
|
Сообщений в этой теме
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           VslavX Цитата(GetSmart @ Jan 17 2009, 07:12) А в... Jan 17 2009, 06:46              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      GetSmart Цитата(defunct @ Jan 16 2009, 19:27) Код*... Jan 16 2009, 13:43   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
|
|
|