evgeniy1294 (09.09.2018 16:21 - 16:25, просмотров: 1837)
Wiznet w7500p, интересная магия. Этот контроллер имеет на борту аппаратный TCP/IP стек, буферы под сокеты которого расположены в отдельной области ОЗУ. Размер буферов задается при их настройке, переполнится они не могут, проверено. Т.е. буферы закольцованы аппаратно.
Постановка проблемы:
Отваливается web-интерфейс, страницы не загружаются.
Первичный анализ:
Вместо правильного запроса ("GET /index.shtml") я получаю битые данные ("eET /index.shtml").
Дальнейший разбор показал следующее:
1) Данный косяк вылазит только в TCP-режиме
2) Вылазит не сразу. Нужно больше 10 посылок, количество рандомное.
3) Битым оказывается случайный(!!!) байт, причем только один.
4) Положение и значение битого байта не изменяется при приёме последующих пакетов. Меняется только после перезагрузки МК.
Пример:
01 02 03 04 05 - отправлено
01 02 00 04 05 - принято
22 32 41 02 01 - отправлено
22 32 00 02 01 - принято
И так до перезагрузки.
Анализируем дальше, пробую изменить значения в буфере через отладчик:
22 32 00 02 01 - битые данные
<Прописываю в нулевой байт(!) его же значение>
<buf[0] = buf[0];>
22 32 41 02 01 - И получаю верную последовательность!!!
Что-то странное, а если это проделать с битым байтом:
22 32 00 02 01 - Битая последовательнось.
22 32 00 02 01 - Ничего не изменилось.
Т.е операции с уже битым байтом ничего не дадут. Однако, битым может оказаться только один байт, поэтому провернем это с двумя байтами:
buf[0]++; buf[0]--;
buf[1]++; buf[1]--;
Бага исчезла, но это просто лютейший костыль. В errat'e пусто, она вообще подозрительно тонкая для контроллера, в котором половина периферии не работает, всего 2 страницы. Что-то подобное видел только один раз, тогда всему виной оказался кэш. Покопаюсь ещё немного и пойду курить доку на ядро.