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

 
 
> При USB соединении с AT91SAM7S256 перегружается комп!, в чём может быть проблема?
vdik
сообщение Nov 15 2007, 06:05
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 30-10-07
Из: Петрозаводск
Пользователь №: 31 873



help.gif вот такая убийственная проблема:
Соединяем плату с AT91SAM7S256 к компьютеру через USB - компьютер перезагружается, но не каждый раз, и начинает перегружаться после первых 20-40 соединений.
Сожжена материнская плата 01.gif . На другом компьютере тоже стал перегружаться, так что эксперементировать в том же духе не хочется.
Еще один момент - если при перезагрузке не отсоединить USB, то перегружается по кругу.
Питание платы выключено.
Соединяли через USB-хаб - не помогало (а точнее сперва соединялось, потом вобще перестало).
smile3046.gif
Ни у кого знакомых предположений о причине сего нет. Единственное - может с драйвером что? драйвер установлен с SAM-BA 1.7, может есть другие его варианты, не знаю ...

Кто-нибудь сталкивался с такой проблемой?
Нашли причину? А может даже её решение? wink.gif - поделитесь, пожжжалуйста santa2.gif


--------------------
~Venerium Rerum Omnium~
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergeeff
сообщение Nov 16 2007, 21:34
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Коллеги!

Не надо искать черную кошку в темной комнате, особенно когда ее там нет. Ищите ошибки в собственном проекте.

Еще раз повторю. Если не происходит нормально процесс подключения USB устройства к компьютеру (enumeration), то все падает в тар-тарары. Кстати меня это наводило на грустные мысли по поводу всяких там идей про ring0 - ring3 защиты в OC и прочие прибамбасы. Летит все сразу к чертям.
Go to the top of the page
 
+Quote Post
Demeny
сообщение Nov 28 2007, 00:23
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(sergeeff @ Nov 17 2007, 00:34) *
Кстати меня это наводило на грустные мысли по поводу всяких там идей про ring0 - ring3 защиты в OC и прочие прибамбасы. Летит все сразу к чертям.

Не нужно мешать всё в одну кучу. ОС (в частности Windows) устроена так, чтобы приложение только в User-mode (ring3) не могло вывести ОС из строя. А при подключении USB устройства первыми активизируются драйвера Kernel-mode (ring0), в частности драйвер шины, а в Kernel-mode разрешено всё по определению, поэтому любое неверное телодвижение сносит "крышу" однозначно. На то он и Kernel ...


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Nov 28 2007, 20:02
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(Demeny @ Nov 28 2007, 05:23) *
Не нужно мешать всё в одну кучу. ОС (в частности Windows) устроена так, чтобы приложение только в User-mode (ring3) не могло вывести ОС из строя. А при подключении USB устройства первыми активизируются драйвера Kernel-mode (ring0), в частности драйвер шины, а в Kernel-mode разрешено всё по определению, поэтому любое неверное телодвижение сносит "крышу" однозначно. На то он и Kernel ...


Ничего не понял sad.gif Сейчас пойду листать Солдатова...

А что, Винде так трудно обработать ошибочную ситуацию с подключением кривого устройства? Что, разве так сложно отключить драйвер? А как же всеми нами любимый BSOD? И почему так сразу без предупреждения сваливаться в жесткую перезагрузку? По моему, это явный баг от MS. Напильниками там ребята разучились работать, вот и говорят - "фича такая!". Да не фича это! А руки такие кривые!


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Demeny
сообщение Nov 29 2007, 00:22
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(zhevak @ Nov 28 2007, 23:02) *
Ничего не понял sad.gif Сейчас пойду листать Солдатова...

А что, Винде так трудно обработать ошибочную ситуацию с подключением кривого устройства? Что, разве так сложно отключить драйвер? А как же всеми нами любимый BSOD? И почему так сразу без предупреждения сваливаться в жесткую перезагрузку? По моему, это явный баг от MS. Напильниками там ребята разучились работать, вот и говорят - "фича такая!". Да не фича это! А руки такие кривые!

На уровне Kernel (RING0) никакой "Винды" уже практически нет - и некому "схватить за руку" зарвавшееся приложение. Привожу простой пример. Драйвер ожидает, что устройство должно прислать ему 13 байт - он выделяет буферную переменную на 13 байт. Где ? Правильно, на стеке, переменная-то локальная. А устройство, собака, прислало не 13 байт, а 14. Куда девался лишний байт ? Записался куда-то туда же на стек. Что ещё хранится на стеке ? Адрес возврата из процедуры, верно ? Значит, лишний байт запросто мог снести адрес возврата из процедуры. Куда улетит процессор после возврата из процедуры - очень вероятно, что на перезагрузку. Иногда куда-то туда, где его ещё могут тормознуть силы операционной системы, сгенерить исключение, выдать знаменитый BSOD ... Но увы, не всегда.

В User-mode такой прыжок просто приведёт к исключению (Access Violation) - и приложение будет с позором выдворено из системы. А на уровне ядра на исключения не всегда приходится рассчитывать, особенно в процедурах обработки прерываний, где код драйвера выполняется на высоких приоритетах ...


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Nov 29 2007, 07:22
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(Demeny @ Nov 29 2007, 05:22) *
На уровне Kernel (RING0) никакой "Винды" уже практически нет - и некому "схватить за руку" зарвавшееся приложение. Привожу простой пример. Драйвер ожидает, что устройство должно прислать ему 13 байт - он выделяет буферную переменную на 13 байт. Где ? Правильно, на стеке, переменная-то локальная. А устройство, собака, прислало не 13 байт, а 14. Куда девался лишний байт ? Записался куда-то туда же на стек. Что ещё хранится на стеке ? Адрес возврата из процедуры, верно ? Значит, лишний байт запросто мог снести адрес возврата из процедуры. Куда улетит процессор после возврата из процедуры - очень вероятно, что на перезагрузку. Иногда куда-то туда, где его ещё могут тормознуть силы операционной системы, сгенерить исключение, выдать знаменитый BSOD ... Но увы, не всегда.

В User-mode такой прыжок просто приведёт к исключению (Access Violation) - и приложение будет с позором выдворено из системы. А на уровне ядра на исключения не всегда приходится рассчитывать, особенно в процедурах обработки прерываний, где код драйвера выполняется на высоких приоритетах ...


Стоп, стоп! Уважаемый колега. Давайте не спеша пройдемся по механизму получения данных от устройств.

Допустим, драйвер создает переменную размереом 13 байт на стеке. Далее следует процесс копирования в нее 14 байт. Я хотел бы более подробно остановиться на этом.

Есть, собственно, два мехпанизма копирования -- аппаратный и программный. Рассмотрим оба. Для начала рассмотрим аппаратный, как наиболее вероятный. (К сожалению, я точно не знаю, что там конкретно происходит. Надеюсь, что знающие люди поправят.)

Итак, ПДП. Мы заказываем контроллеру ПДП 13 байт и получаем из южного моста посылку в 13 байт и аппаратное прерывание о том, что данные получены. Тринадцать байт -- ни больше, ни меньше. Так устроен ПДП. Что же касается 14-го байта, то он остается в аппартном буфере моста. Возможно, он помешает при следующем копировании. Но самое главное, ни о каком превышении размера, ни о каком "выезде" за границы массива, нет и речи. Стек цел и невредим. Еще раз повторю, что мне кажется, именно так и происходит получение данных от устройства в драйвер винды.

Второй способ, прграммный. (Скорее всего так не делается.) Драйвер сам бегает за каждым байтом в аппаратный порт и складывает полученные байты в массив, который на стеке. Т.е. все делается программно. Разумеется очень медленно. Отсюда вопрос: а что, слабо было разработчикам драйвера воткнуть проверку границ? Решили сделать быстро-оисполняющийся код за счет проверки? -- Так это вообще глупо -- по одному байту выкачивать инфу. Более вероятно, что просто позабыли.

Хорошо. Продожаем. Что делать, если в драйвере возникла такая ситуация? Ронять ОСь? Может просто передать "на верх" состояние ошибки? Для этого у драйверов есть мехнизм. Какие проблемы?

Мне кажется, что все-таки корень проблемы лежит не в нарушении стека, а где-то в области динамической подгрузки драйверов нижнего уровня. Что-то там видимо разработчики накосячили. А может просто сам механизм динамической загрузки не отработан.

Тема интересная. Если есть что сказать, говорите. А я сейчас наверно попытаюсь выкроить время -- полезу в книжку разбираться.

Цитата(Harbour @ Nov 29 2007, 12:01) *
Теоретически [ wink.gif ] такие глюки возможны и в Linux'е, вопрос в том что они будут моментально отловлены и менее чем за сутки будет выпущено исправление, дабы оное безобразие никогда больше не повторилось. Любителям остальных ОС можно порекомендовать техподдержку wink.gif


Извините, коллега, вопрос не в том, что "за сутки или за пол-года".

Вопрос в том -- реально (не теоретически!) наблюдаются-ли в других ОСях (в Linux'е, в частности) такие же явления с USB-устройствами?


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Harbour
сообщение Nov 30 2007, 06:51
Сообщение #7


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



Цитата(zhevak @ Nov 29 2007, 09:22) *
Извините, коллега, вопрос не в том, что "за сутки или за пол-года".
Вопрос в том -- реально (не теоретически!) наблюдаются-ли в других ОСях (в Linux'е, в частности) такие же явления с USB-устройствами?


Про остальные ОС не в курсе, но в Linux'е такое наблюдаться никак не может. Как уже было сказано - неверно работающее устройство будет остановлено с выводом сообщения о причине остановки в kernel log. При задании нужного уровня отладки для xhci_hcd, usbcore или конкретного драйвера usb устройства можно увидеть _весь_ протокол обмена с глючным USB устройством, что собственнно и рекомендовалось для отладки подобных девайсов.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- vdik   При USB соединении с AT91SAM7S256 перегружается комп!   Nov 15 2007, 06:05
- - zhevak   Хм... забавно! А питалово с ЮСБ берете? Не пр...   Nov 15 2007, 06:37
- - Harbour   скорее всего каличный usb2serial драйвер - отсутст...   Nov 15 2007, 07:54
- - sergeeff   Лично убеждался - если есть хоть какие-то ошибки в...   Nov 15 2007, 10:37
|- - Kitsok   Насчет сгоревшей мамки - сильно сомневаюсь, у меня...   Nov 15 2007, 12:52
- - vdik   Спасибо огромное всем за советы!!! .....   Nov 16 2007, 11:04
|- - Master   Цитата(Kitsok @ Nov 15 2007, 16:52) Насче...   Nov 16 2007, 14:33
- - Толик   Цитата(sergeeff @ Nov 17 2007, 00:34) Ищи...   Nov 19 2007, 07:48
|- - cebotor   Цитата(Толик @ Nov 19 2007, 10:48) В часн...   Nov 20 2007, 08:51
||- - Толик   Цитата(cebotor @ Nov 20 2007, 11:51) На б...   Nov 20 2007, 13:04
||- - Kitsok   Цитата(Толик @ Nov 20 2007, 16:04) Устрой...   Nov 20 2007, 13:53
|- - Kitsok   Цитата(Толик @ Nov 19 2007, 10:48) В часн...   Nov 20 2007, 10:39
- - VAI   Мне кажется, здесь еще обойдён такой вопрос: У нас...   Nov 29 2007, 05:08
|- - zhevak   Цитата(VAI @ Nov 29 2007, 10:08) Мне каже...   Nov 29 2007, 06:24
|- - alexander55   Цитата(VAI @ Nov 29 2007, 08:08) У нас, к...   Nov 29 2007, 07:31
- - Harbour   Теоретически [ ] такие глюки возможны и в Linux...   Nov 29 2007, 07:01
- - amw   Цитата(Harbour @ Nov 29 2007, 09:01) Теор...   Nov 29 2007, 12:06


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

 


RSS Текстовая версия Сейчас: 26th July 2025 - 15:38
Рейтинг@Mail.ru


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