Всем доброго здравия.
Есть устройство 9G45. Ядро 3.2.18.
Обнаружил две неприятные проблемы, у которых, скорее всего один корень.
1. При подключении микросхемы MCP2515 (CAN-to-SPI) имеют место быть серьезные потери пакетов на скоростях CAN > 100kBit/s (а типичная скорость обмена по CAN - 1Mbit/s). Также бывают (нечасто - раз в несколько часов при постоянном обмене) искажения принятых кадров.
2. Если устройство ведет обмен по USART, используя протокол Modbus RTU на высоких скоростях (я точно видел на 115200), и при этом параллельно запустить подключение по GPRS (pppd), то начинаются искажения принятых кадров (примерно 1 из 50).
Причина, как я понял, в том, что в драйверах используются workqueue, которые имеют Normal priority, а хотелось бы Realtime.
Гутарят, что начиная с 3.4 ядра вроде как все должно стать лучше, во всяком случае со SPI, но так ли это?
Есть тут люди, которые использовали с линуксом достаточно скоростные устройства? Каково оно было?
Я глянул spi-atmel.c для разных версий ядра - что-то начало меняться только в ветке 3.8.
А обновить ядро даже на 3.7 (есть патч от sasamy) у меня с ходу не получилось - не работает сеть (вместо Atmel MACB там теперь какой-то Cadence) и моя микросхема MCP2515 (из-за которой весь сыр-бор) на новом ядре пишет, что probe failed. Да и смысла мне обновляться на это ядро никакого, ибо там Atmel SPI тот же, что и в 3.2.
А вот попробовать самому с более свежим ядром пока нет ни времени, ни особой уверенности в успехе.
В общем, пока проблему если не закрыл, то сильно облегчил - компильнул ядро (3.2) с драйвером MCP2515, который сделали в сообществе Rapsberry Pi, он базируется на spi_async().
Я вам скажу, что результат виден сразу - практически пропали пропадания кадров (раз в пять-шесть часов, вместо нескольких раз в минуту).
Так что может кому и поможет - http://elinux.org/RPi_CANBus