ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
869953
evgeniy1294 (09.09.2018 16:21 - 16:25, просмотров: 1713)
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 страницы. Что-то подобное видел только один раз, тогда всему виной оказался кэш. Покопаюсь ещё немного и пойду курить доку на ядро.