|
|
  |
Odd address trap и LPC23xx, А что, LPC не генерит unaligned access exeption? |
|
|
|
Jan 17 2009, 06:46
|

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

|
Цитата(GetSmart @ Jan 17 2009, 07:12)  А вообще, тут все забыли одну вещь касательно Data Abort при невыровненных словах. Где-то читал, что в LPC он возникает только если проц работает в USER MODE. Во всех остальных MODE, в частности в SYSTEM MODE он специально заблокирован, так как все остальные режимы предназначены для системы. Так что, господа песатели, отлаживайте свои проги в USER MODE, а когда уже всё отладите можете переносить код в другие режимы  Совет хороший, и стал бы еще лучше если бы Вы его ссылкой подтвердили. А то документация производителя и google как-то скромно умалчивают про приведенные Вами факты.
|
|
|
|
|
Jan 17 2009, 08:52
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Прямо скажу, я за 3 года об АРМах столько всего начитался, что уже не помню когда и где читал. Но скорее всего где-то в разделе об ограничениях USER MODE. Точно помню, что в этом режиме нельзя изменить младшие биты регистра флагов, отвечающих за текущий режим и за запрет прерываний. Мне сейчас лень искать всем желающим нужную им инфу. Подсказки я дал. Все желающие - на поиски!!! А не вылетание в аборт при невыровненном чтении имеет свои плюсы. Жаль, что IAR это делать не умеет, но эта фича даёт возможность прочитать 32 бита с любого нечётного адреса всего за две команды LDR. Например читая слово с адреса 1 в регистр прочитаются правильно сразу три байта. Старший байт нужно будет прочитать в другой регистр из адреса 5. Потом по маске их объеденить. Браво LPC!!!  Потестировал это дело на LPC2134/01 но не срабатывает исключение ни в SYSTEM, ни в USER. Абыдно  А может где-то флажок стоит, управляющий этой фичей.
Сообщение отредактировал GetSmart - Jan 17 2009, 08:58
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
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 }
|
|
|
|
|
Jan 17 2009, 18:47
|
Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490

|
Цитата(defunct @ Jan 17 2009, 21:25)  О том что мне совесть не позволит в проц в котором нет exception'a вставить опасный код. на LPC будет как минимум: Код if (<произвольный адрес> & 0x3) { slow implementation } else { fast } Ну вообщем то так и делается  И не только для LPC Например, в WinCE'шных драйверах упомянутого выше самсунга...
|
|
|
|
|
Jan 17 2009, 19:46
|

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

|
Цитата(defunct @ Jan 17 2009, 20:25)  О том что мне совесть не позволит в проц в котором нет exception'a вставить опасный код. Ну и как это новое утверждение соотностится с Вашим предыдущим Цитата В таком случае SAM7 "порвет" LPC по производительности (т.к. не нужно будет собирать Long побайтово). , которое и вызвало моой вопрос. Повторяю вопрос - как наличие exception приводит к результату "не нужно будет собирать Long побайтово"
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 17 2009, 19:58
|

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

|
Цитата(defunct @ Jan 17 2009, 20:25)  на LPC будет как минимум: Код if (<произвольный адрес> & 0x3) { slow implementation } else { fast } ИМХО, при неработающем исключении лучше бы написать так: Код { ASSERT(((DWORD)adr & (sizeof(DWORD)-1)) == 0, "Ugly unaligned pointer"); fast implementation } ASSERT программно сгенерит недостающее исключение. Но беда в том, что я предпочитаю "традиционный вариант нормы" - то есть работающее исключение, и на такую подлянку никто не рассчитывал и, соответственно, этот ASSERT по коду не "раскидан".
|
|
|
|
|
Jan 18 2009, 00:44
|

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

|
Цитата(zltigo @ Jan 17 2009, 21:46)  Ну и как это новое утверждение соотностится с Вашим предыдущим ну.. так сказать "прямопропорционально". На SAM'е будет быстрый опасный код, на LPC - медленный и безопасный. Цитата Повторяю вопрос - как наличие exception приводит к результату "не нужно будет собирать Long побайтово" Чтобы ответить на этот вопрос, позвольте мне определить рамки в которых плаваем. Дано: 1. буферы, содержащие некие типизированные данные, например IP заголовок; 2. предполагается, что для любого буфера, IP заголовок может находиться с произвольным смещением от начала буфера; 3. предполагается, что начало IP заголовка всегда на границе 32 бит. (напр, программируем DMA так, чтобы он нам клал пакет не с начала буфера, а с некоторого смещения, так чтобы IP заголовок получался выровненным). (отступ от последнего условия - есть ситуация неординарная, возникающая возможно при фатальной ошибке программы). Теперь собсно ответ на вопрос: С наличием exception'a - я буду работать с полями IP заголовка как с U32 без проверок на выровненность. Без exception'a мне придется либо предусмотреть его программную генерацию, либо - побайтовую сборку/копирование полей с требуемым выравниванием. Оба варианта будут пагубно сказываться на быстродействии (лишний код и все-таки). Цитата ИМХО, при неработающем исключении лучше бы написать так: ... ASSERT(((DWORD)adr & (sizeof(DWORD)-1)) == 0, "Ugly unaligned pointer"); Согласен, однако это не сделает реализацию такой же быстрой как без assert'a  Проверка останется все равно.
|
|
|
|
|
Jan 18 2009, 06:15
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(defunct @ Jan 18 2009, 06:44)  Согласен, однако это не сделает реализацию такой же быстрой как без assert'a  Проверка останется все равно. С такой паранойей надо писать на ассемблере и ничего не бояться  Т.к. любители структурированного программирования на Си без забот выносят часть кода в отдельную процедуру, что сказывается на быстродействии ещё хуже чем сборка одного Long побайтово. А уж если программа написана на C++, то жаловаться на замедление просто смешно. Дам бесплатный совет. В режиме отладки ставьте ASSERT или любую проверку. В режиме Release уберите проверки и получите быстродействие ещё больше чем в SAM7, т.к. проц быстрее. Но даже если LPC будет собирать Long побайтово, то по скорости он всё равно (!) не уступит SAM7. Хочу подчеркнуть, что я предлагал собирать побайтово Long только для быстрой проверки какого-либо условия в буфере. Если же нужно выгребать множество слов из буфера, то как правильно писал zltigo, сперва нужно через memcpy скопировать буфер и выровнять его начало. Можно даже не тратить дополнительную память и скопировать внутри текущего буфера на 1, 2 или 3 байта назад. Или вперёд. Как там говорится: в чужом глазу соринку... в своём глазу бревно...
Сообщение отредактировал GetSmart - Jan 18 2009, 06:32
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 18 2009, 11:17
|

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

|
Цитата(GetSmart @ Jan 17 2009, 10:52)  А не вылетание в аборт при невыровненном чтении имеет свои плюсы. Жаль, что IAR это делать не умеет, но эта фича даёт возможность прочитать..... Сейчас попробовал переписать один относительно критичный кусочек работающий (никаих проблем не было - компилятор, естественно, сам разруливал) в кольцевом буфере с 16bit данными под описаный стиль "корреция результата после чтения по невыровненному адресу" результат мне понравился. Если до этого я в принципе пребывал на позициях - особо без разницы есть аборт или нет, то теперь чаша весов (если действительно требуется выжимать быстродействие) склоняется к безабортовому варианту.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|