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

 
 
> Odd address trap и LPC23xx, А что, LPC не генерит unaligned access exeption?
VslavX
сообщение Jan 15 2009, 18:43
Сообщение #1


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 читается/пишется переставленный мусор, и все это МОЛЧА. Такая низость в самом деле имеет место, или я чего-то недопонимаю?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
meister
сообщение Jan 16 2009, 08:33
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jan 16 2009, 09:02
Сообщение #3


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-ом веке - не судьба.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 16 2009, 09:58
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jan 16 2009, 11:03
Сообщение #5


embarrassed systems engineer
*****

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



Цитата(zltigo @ Jan 16 2009, 11:58) *
Вообще-то "это отлаживать" - Вам "низачет", ибо нужно не с последствиями бороться а банально этои 200К строк (кстати для 8bit это число надуманное)

Увы, не надуманное. "У меня линейка есть" - поэтому я абсолютно спокоен. smile.gif
Самый старый проект был начат в 1992-ом, пережил asm x86, BCC3.1, Watcom, IAR AVR 1.30, IAR MSP, Softune LX16, GCC ARM, GCC PPC, сотни две вариаций и моделей, десяток языков (рус, укр, англ, нем, ...), сотни флагов условной компиляции. Так что 200К - это весьма и весьма скромно, могу Вас заверить. Много лет это "утаптывали ногами" в 128К меги - ей просто не было даже близкой конкуренции по цене, и там _очень_ много финтов направленных на "лишь бы влезло" и "хто украл 10 байт RAMы" - хроника одного байта - во всей красе. На проектах на ARM-ах - еще веселее - 200K - " это только лицо" ©, т.е. приложение. Сейчас моя "зона ответственности" - системный софт - HAL + TN + TCP + FAT + USB-host за 100К грозит играючи перейти. Впрочем, сложность - понятие относительное, посмотрим на исходники Линукса - там никакой "линейки" хватит.

Цитата(zltigo @ Jan 16 2009, 11:58) *
хоть мельком, но просмотреть. И вообще с этим хорошие компиляторы хорошо справляются - warning-ов хватает, если, конечно перворначальный код не совсем через заденпроходное отверстие писан, но незачем такое и портировать.

Да это все понятно, компилятором ловится 95% проблем, потом на других ARM-платформах отловили еще 3-4%. А вот вчера меня программеры ткнули носом в листинг - "ldrh R0, [R4, #0x209]" и спросили - "почему бнопня лезет?". И пришлось мне, "случайно, совершенно случайно", стряхнуть пыль с теста обработчика исключения. Профтыкал-с, признаю. И вот этот оставшийся 1% - самое трудное. В сумме несколько десятков человек тестировало пару месяцев изделие, а вот на баг только вчера попали sad.gif.

Цитата(zltigo @ Jan 16 2009, 11:58) *
Тут странное дело - когда давно поверял работу своего обработчика exception на чем-то вроде LPC2114 - точно работало, а потом на свежих чипах как-то исчезло, хотя недавно переписывал слегка и некоторым удивлением обнаружил, что на одном из китов с LPC2148 тоже отработал!

Да, интересно. Само исключение есть, и работает - я ж обработчик таки при написании проверял. (как оказалось по черновым тестам - записью невыравненного слова во флеш - по адресу 1) . Но, судя по доке, возникает при обращении к несуществующей памяти и при записи во флэшку. Есть плата на свежем 2148revB и есть китовая от MT на 2148rev- - попробую на них.

P.S. Таки купили Вы меня на "надуманное", ну и ладно, сделаю вид что провокации не было cheers.gif

Цитата(defunct @ Jan 16 2009, 12:20) *
Компиляторы не помогут когда адрес вычисляется диамически. sad.gif
Например, сравнение IPшника приятого пакета с сетевой маской.

IP-шник - неудачный пример. И вообще протоколы для "внешних сношений". Если учитывать endianess, то разбор такой структуры все равно макросами надо делать, и в них aligment учесть. У меня, например, в TCP в итоге получилось 4 варианта макроса считывания поля IP - BE/LE + aligned/unaligned.
А вот со своими внутренними структурами - там да, некоторый unaligned трабл у прикладников был. Вот еще беспокойство есть насчет оставшегося 1% sad.gif. Предполагался сценарий - "odd address trap" -> "bug report" -> e-mail -> база ошибок. Увы, мечты были грубо разрушены злобным NXP smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 16 2009, 12:07
Сообщение #6


Гуру
******

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



Цитата(VslavX @ Jan 16 2009, 14:03) *
Самый старый проект был начат в 1992-ом, пережил asm x86, BCC3.1, Watcom, IAR AVR 1.30, IAR MSP, Softune LX16, GCC ARM, GCC PPC, сотни две вариаций и моделей.....

Все верно, у меня практически такие-же вещи по полной программе, НО все это не делалось единовременно вдруг с 8 на 32. При переходе ровным счетом ни одной проблемы в работе, именно с выравниванием не вызвало. Все отсеялось в процессе портирования при работе с исходниками.
Цитата
На проектах на ARM-ах - еще веселее - 200K - " это только лицо" ©, т.е. приложение.

Посторяю - 200K чего? Кода или сишных строк??? Вот прям сейчас сижу в начале обычного проекта: ARM 94 файла 40767 текстовых строк из них всего 21943 стороки с кодом. Бинарник 134504 байта. Процентов 15% пришло с 8bit. Еще 20% вообще сразу живут на всех платформах. Будет развиваится и раздуваться еще несколько лет. Естественно есть и уже перевалившие за 300K бинарника. Говорите, что у Вас "200К строк С-шного кода" причем, как ранее говорили, для чего-либо врезультате влезающего в AVR128 и затем портированых? Так вот не верю.
Цитата
P.S. Таки купили Вы меня на "надуманное", ну и ладно, сделаю вид что провокации не было cheers.gif

Никаких провокаций - просто удивился. Полагаю обосновано.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jan 16 2009, 16:23
Сообщение #7


embarrassed systems engineer
*****

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



Цитата(zltigo @ Jan 16 2009, 14:07) *
Все верно, у меня практически такие-же вещи по полной программе, НО все это не делалось единовременно вдруг с 8 на 32. При переходе ровным счетом ни одной проблемы в работе, именно с выравниванием не вызвало. Все отсеялось в процессе портирования при работе с исходниками.

Да, понятно, что на любом проекте крупнее среднего будет практически то же самое. Но у нас некоторая разница в подходах - Вы пишете что "все отсеялось" (ну так уж и все?), а я пишу - "1% остался". И вчера мне мои прикладники показали часть от этого "1%".

Цитата(zltigo @ Jan 16 2009, 14:07) *
Посторяю - 200K чего? Кода или сишных строк??? Вот прям сейчас сижу в начале обычного проекта: ARM 94 файла 40767 текстовых строк из них всего 21943 стороки с кодом. Бинарник 134504 байта. Процентов

Дело было давно (в районе 2000-го) - из любопытства написал простой скриптик подсчета текстовых строк на Perl и прогнал на каталоге с исходниками для одной платформы (AVR, кажись). Тогда вышло около 150К - всех текстовых строк - с хидерами, C- кодом, комментариями, но без документации, makefiles и всяких вспомогательных скриптов (то отдельно все лежит). Сейчас не считал, по минимуму полагаю 200K.
Эти все 200К написаны прикладниками - без платформозависимого и системного кода, который пишу я. ИМХО, по стилю там тяжеловато - с комментами напряг, и макросов засилье изрядное, так что текст - "плотненький", сколько строк именно с кодом - не скажу, но тоже не менее 50%.

Цитата(zltigo @ Jan 16 2009, 14:07) *
несколько лет. Естественно есть и уже перевалившие за 300K бинарника. Говорите, что у Вас "200К строк С-шного кода" причем, как ранее говорили, для чего-либо врезультате влезающего в AVR128 и затем портированых?

Это где я говорил что все 200К строк исходников одновременно влезают в 128К? Я сказал, что в сумме есть 200К строк из которых получается сотня различных вариантов путем условной компиляции.

Цитата(zltigo @ Jan 16 2009, 14:07) *
Процентов 15% пришло с 8bit. Еще 20% вообще сразу живут на всех платформах

В-о-о-о-т. А у нас 75-90% пришло с 8-битника и эти же 75-90% живут на всех 8/32-битных платформах. Из оставшихся 10-25% для 32-битников - 80% (ОС, стеки) тоже живут на всех 32-битных платформах. Итого - у меня "не живущая" и заново пишущаяся для платформы часть составляет 2-5% - против Ваших 65%. Отсюда и Ваш совет - "при портировании надо пересмотреть код". Когда пишешь заново - не вопрос - само собой так получается, а вот когда оно уже написано, отлажено и работает - хто ж в здравом уме туда полезет?

Цитата(zltigo @ Jan 16 2009, 14:07) *
Так вот не верю.

Чему именно? Что бывают проекты где 75-90% процентов платформо-независимо и может жить на 8/16/32?


Цитата(defunct @ Jan 16 2009, 15:49) *
Не, такое - не пойдет. Тормозить будет, т.к. будет LDRB вместо LDR.
Мы ж скорости хотим. smile.gif - если скорость не нужна можно везде все упаковать и будет ARM как восьмибитник работать.

У меня эту проблему в общем случае решить не удалось. Для TCP/IP у меня такая реализация:
Код
LW_INLINE_FORCED
DWORD
lw_ipload(
    PLW_IP_ADDR ptr)
{
#if LW_ALIGNED_HDR
    //
    // Вариант перестановки для выравненного доступа
    //
    DWORD    v, t1, t2;

    v = *(PDWORD)ptr;

    t1 = v ^ ((v << 16) | v >> 16);        // t1 =  2143 ^ 4321
    t2 = (v >> 8) | (v << 24);            // t2 =  1432
    t1 = t1 & 0xFF00FFFF;                // t1 =  2043 ^ 4021
    return t2 ^ (t1 >> 8);                // 1432 ^ (0204 ^ 0402)
#else
    //
    // Вариант перестановки для невыравненного доступа
    //
    return  (DWORD)((PBYTE)ptr)[3]
         | ((DWORD)((PBYTE)ptr)[2] << 8)
         | ((DWORD)((PBYTE)ptr)[1] << 16)
         | ((DWORD)((PBYTE)ptr)[0] << 24);
#endif
}


Для PowerPC в bigendian это выглядит так:
Код
LW_INLINE_FORCED
DWORD
lw_ipload(
    PLW_IP_ADDR ptr)
{
    return *(PDWORD)ptr;
}


Если в проекте есть хоть один сетевой интерфейс для которого поле IP может быть невыравнено, то в кофигурации указан LW_ALIGNED_HDR нулевой. Но обычно есть только один ethernet, я стараюсь чтобы было выравнивание (гы, на SAM7X - получилось выровнять пакеты при приеме, на LPC - нет smile.gif) и работает выравненный вариант.

Пример работы с полем:
Код
{
    DWORD ip;

    ip = lw_ipload(&iphdr->ipsrc);
    //
    // Делаем с IP чего надо
    //
{


Но тут как раз проблема ловли исключений не так остро стоит - этот код свой и писался изначально под разные платформы с разной endianess и alignment. Проблема острее стоит в портированном "старье".
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - defunct   Цитата(zltigo @ Jan 16 2009, 11:58) (кста...   Jan 16 2009, 10:20
||- - zltigo   Цитата(defunct @ Jan 16 2009, 13:20) Комп...   Jan 16 2009, 10:30
||- - defunct   Цитата(zltigo @ Jan 16 2009, 12:30) Отнюд...   Jan 16 2009, 13:27
||- - 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
||- - GetSmart   Цитата(defunct @ Jan 16 2009, 19:27) Код*...   Jan 16 2009, 13:43
|- - meister   Цитата(zltigo @ Jan 16 2009, 13:58) Тут с...   Jan 16 2009, 11:11
|- - 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


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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 22:35
Рейтинг@Mail.ru


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