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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Большое число программных прерываний в ОС Linux при приеме информации по интерфейсу CAN на AM3517, Нужно уменьшить число программных прерываний в ОС Linux
Таратухин Сергей
сообщение Sep 21 2013, 15:53
Сообщение #16





Группа: Участник
Сообщений: 14
Регистрация: 18-09-13
Пользователь №: 78 372



Цитата(Tarbal @ Sep 20 2013, 18:30) *
У любого устройства есть свои пределы. CAN довольно неудобно обрабатывать на Линуксе. Она довольно неоднородна (имею ввиду сложность сообщений) и на каждое сообщение может требоваться индивидуальная реакция. Поэтому классический подход разгрузки прерываний в Линусе -- ПДП применить непросто, а может и невозможно.

Я уверен что процессор без ОС или с какой-нибудь реал-тайм ОС покажет лучшие результаты чем Линукс. Дело в том, что в Линуксе плата за универсальность долгий вход в обработчик прерывания.

Если вам будет интересно сделать CAN на другом процессоре, я лет 10 назад писал драйверы для RTOS SALVO на микрочипе. Причем там есть как с внутренним контроллером так и с подключенным как в статье по SPI. Mогу дать код.

Прерывание тупо кладет (если нет ошибок) в очередь, а тред уже забирает оттуда и обрабатывает. Система быстро выходит из прерывания, а значит имет лучше динамические характеристики.



Сейчас поставлена задача реализовать все под Linux, к тамуже там еще будет графическое приложение на Qt. Да к томуже сейчас мне работодатель не даст возможности эксперементировать с другими операционными системами, в целом интересно, но пока нет времени рассматривать это направление, а вот на исходники интересно будет посмотреть.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 21 2013, 16:39
Сообщение #17


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Таратухин Сергей @ Sep 21 2013, 19:53) *
Сейчас поставлена задача реализовать все под Linux, к тамуже там еще будет графическое приложение на Qt. Да к томуже сейчас мне работодатель не даст возможности эксперементировать с другими операционными системами, в целом интересно, но пока нет времени рассматривать это направление, а вот на исходники интересно будет посмотреть.


Ну тогда я вижу только один способ уменьшить нагрузку. Сделать меньше сообщений.
Не знаю насколько это приемлимо. Дайте ваш емайл адрес в приватном сообщении и я пошлю вам примеры кода драйвера.
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Sep 21 2013, 18:38
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



QUOTE (sasamy @ Sep 20 2013, 18:30) *
Кстати - в ванильном ядре и HECC NAPI поддерживает
http://lxr.free-electrons.com/source/drive.../ti_hecc.c#L604
Ну и жуткий же акцент в комментариях, страх божий... Не зря весельчаки так странно контроллер назвали, от комментариев так и хочется спросить "what the heck?!"... :)))
Go to the top of the page
 
+Quote Post
Таратухин Сергей
сообщение Sep 23 2013, 06:26
Сообщение #19





Группа: Участник
Сообщений: 14
Регистрация: 18-09-13
Пользователь №: 78 372



Цитата(sasamy @ Sep 20 2013, 20:30) *
Кстати - в ванильном ядре и HECC NAPI поддерживает
http://lxr.free-electrons.com/source/drive.../ti_hecc.c#L604

насколько я понял
http://processors.wiki.ti.com/index.php/Si...29_Linux_Driver

у вас на процессоре такой контроллер используется.

PS я пропустил сообщение _3m
http://electronix.ru/forum/index.php?showt...t&p=1194005
он вам об этом уже говорил


Все верно, но как задействовать NAPI?
Go to the top of the page
 
+Quote Post
Таратухин Сергей
сообщение Sep 23 2013, 11:54
Сообщение #20





Группа: Участник
Сообщений: 14
Регистрация: 18-09-13
Пользователь №: 78 372



Цитата(Tarbal @ Sep 21 2013, 22:39) *
Ну тогда я вижу только один способ уменьшить нагрузку. Сделать меньше сообщений.
Не знаю насколько это приемлимо. Дайте ваш емайл адрес в приватном сообщении и я пошлю вам примеры кода драйвера.


Мне форум не дает послать вам сообщение.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 23 2013, 12:05
Сообщение #21


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Таратухин Сергей @ Sep 23 2013, 15:54) *
Мне форум не дает послать вам сообщение.




Я попробовал послать вам, но получил такую ошибку:

"Обнаружены следующие ошибки
Невозможно отправить это сообщение, так как получатель отключил свой личный ящик, или он попросту переполнен.

Это личное сообщение не отправлено"

Может у вас есть сообщения, которые можно стереть? Я не знаю правил функционирования личной почты. Может хранятся посланные сообщения и их предел достигнут.
Go to the top of the page
 
+Quote Post
Таратухин Сергей
сообщение Sep 23 2013, 12:14
Сообщение #22





Группа: Участник
Сообщений: 14
Регистрация: 18-09-13
Пользователь №: 78 372



Цитата(Tarbal @ Sep 23 2013, 18:05) *
Я попробовал послать вам, но получил такую ошибку:

"Обнаружены следующие ошибки
Невозможно отправить это сообщение, так как получатель отключил свой личный ящик, или он попросту переполнен.

Это личное сообщение не отправлено"

Может у вас есть сообщения, которые можно стереть? Я не знаю правил функционирования личной почты. Может хранятся посланные сообщения и их предел достигнут.


У меня такая же ошибка, у меня сообщений вообще нет, так же пробовал настраивать обмен сообщениями, ни к чему положительному не привело, помощь тоже не работает.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 23 2013, 12:20
Сообщение #23


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Таратухин Сергей @ Sep 23 2013, 10:26) *
Все верно, но как задействовать NAPI?


Для ARM архитектуры, я делаю так

В корне кернела исполнить команду:
make ARCH=arm menuconfig

Нажмите прмяой слеш : '/'
в строке поиска введите NAPI

Получите список всех возможных функций имэущих NAPI в названии ключа компиляции.
Там будет отражено состояние ключа, разрешающего функцию, путь к нему и зависимость его от других ключей.
Go to the top of the page
 
+Quote Post
Таратухин Сергей
сообщение Sep 23 2013, 12:45
Сообщение #24





Группа: Участник
Сообщений: 14
Регистрация: 18-09-13
Пользователь №: 78 372



Цитата(Tarbal @ Sep 23 2013, 18:20) *
Для ARM архитектуры, я делаю так

В корне кернела исполнить команду:
make ARCH=arm menuconfig

Нажмите прмяой слеш : '/'
в строке поиска введите NAPI

Получите список всех возможных функций имэущих NAPI в названии ключа компиляции.
Там будет отражено состояние ключа, разрешающего функцию, путь к нему и зависимость его от других ключей.


Это я делал, находил две опции:

CODE
Symbol: TULIP_NAPI [=n]
Type : boolean
Prompt: Use RX polling (NAPI)
Defined at drivers/net/tulip/Kconfig:79
Depends on: NETDEVICES [=y] && NET_ETHERNET [=y] && NET_TULIP [=n] && TULIP [=n]
Location:
-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Ethernet (10 or 100Mbit) (NET_ETHERNET [=y])
-> "Tulip" family network device support (NET_TULIP [=n])
-> DECchip Tulip (dc2114x) PCI support (TULIP [=n])


Symbol: TULIP_NAPI_HW_MITIGATION [=n]
Type : boolean
Prompt: Use Interrupt Mitigation
Defined at drivers/net/tulip/Kconfig:93
Depends on: NETDEVICES [=y] && NET_ETHERNET [=y] && NET_TULIP [=n] && TULIP_NAPI [=n]
Location:
-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Ethernet (10 or 100Mbit) (NET_ETHERNET [=y])
-> "Tulip" family network device support (NET_TULIP [=n])
-> DECchip Tulip (dc2114x) PCI support (TULIP [=n])
-> Use RX polling (NAPI) (TULIP_NAPI [=n])


но как эти опции влияют на CAN не понимаю, я их не включал. Если их включить как они повлияют на обработку приема по интерфейсу CAN и как необходимо переписать программу приема, чтоб использовать NAPI?
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 23 2013, 13:33
Сообщение #25


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Таратухин Сергей @ Sep 23 2013, 16:45) *
но как эти опции влияют на CAN не понимаю, я их не включал. Если их включить как они повлияют на обработку приема по интерфейсу CAN и как необходимо переписать программу приема, чтоб использовать NAPI?


Я не знаком с NAPI и CAN драйверы на Линуксе я тоже не делал. Полагаю, что CAN драйвер надо настроить (или дописать), чтобы использовал механизм NAPI. Если вы не работали с кернелом, то вам будет непросто выполнить эту задачу.

Прежде чем начинать надо оценить насколько оно вам поможет.
Я отношусь скептически к использованию поллинга при большом количестве сообщений. Уменьшение нагрузки на процессор в случае поллинга возможно за счет потери сообщений. Возможно более короткий обработчик (чем прерывание) положительный фактор, однако частые обращения, когда не надо и запоздалые, когда надо -- это негативная сторона поллинга.
Ведь вашему процессору все-равно необходимо работать над каждым сообщением в прерывании или нет. Он все равно потратит на обработку сообщений много времени. Использование поллинга не всегда гарантирует, что все сообщения будут приняты. Особенно в сложной обстановке с массовым потоком сообщений.

Решение задачи я вижу только в одном из направлений:
1. Снижение интенсивности сообщений
2. Использование более мощного процессора.
3. Установка дополнительного устройства, ответственного за обработку (хотя бы частичную) сообщений.

В третьем случае может понадобится написать драйвер.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Sep 23 2013, 13:38
Сообщение #26


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(Таратухин Сергей @ Sep 23 2013, 16:45) *
Это я делал, находил две опции:
..
но как эти опции влияют на CAN не понимаю, я их не включал.


Эти - никак не влияют.

Цитата
как необходимо переписать программу приема, чтоб использовать NAPI?


Ничего переписывать не надо - NAPI должен поддерживать драйвер, некоторые делают опциаональные настройки - выбор между обычным и New API, у вашего контроллера NAPI используется всегда

http://lxr.free-electrons.com/source/drive.../ti_hecc.c#L860

почему поллинг не снижает количество прерываний - это надо разбираться с этим драйвером и контроллером.
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Sep 23 2013, 21:51
Сообщение #27


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



QUOTE (sasamy @ Sep 23 2013, 16:38) *
почему поллинг не снижает количество прерываний - это надо разбираться с этим драйвером и контроллером
Коллеги, никак не пойму, что за проблему вы тут обсуждаете? Один мегабит в секунду - это 128KB/s, т.е. цыплячья скорость UARTа, и это нагружает Ослинукс на 600 мегагерцовом процессоре???? Я или сам ослинукс или мне просто смешно...

Интервал между двумя последовательными байтами 4,700 клоков - этого мало _один_ байт обработать???? А 0.8 на шине, т.е. 0.8*128 это уже 5,900 клоков на байт - за такое время не только пообедать, но и посуду можно вымыть...
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Sep 24 2013, 00:34
Сообщение #28


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(AndrewN @ Sep 23 2013, 17:51) *
Коллеги, никак не пойму, что за проблему вы тут обсуждаете? Один мегабит в секунду - это 128KB/s, т.е. цыплячья скорость UARTа, и это нагружает Ослинукс на 600 мегагерцовом процессоре???? Я или сам ослинукс или мне просто смешно...

Интервал между двумя последовательными байтами 4,700 клоков - этого мало _один_ байт обработать???? А 0.8 на шине, т.е. 0.8*128 это уже 5,900 клоков на байт - за такое время не только пообедать, но и посуду можно вымыть...

Мда..

Вы линукс то видали?
Сколько там процессов/тредов бежит смотрели?


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 24 2013, 00:54
Сообщение #29


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(AndrewN @ Sep 24 2013, 01:51) *
Коллеги, никак не пойму, что за проблему вы тут обсуждаете? Один мегабит в секунду - это 128KB/s, т.е. цыплячья скорость UARTа, и это нагружает Ослинукс на 600 мегагерцовом процессоре???? Я или сам ослинукс или мне просто смешно...

Интервал между двумя последовательными байтами 4,700 клоков - этого мало _один_ байт обработать???? А 0.8 на шине, т.е. 0.8*128 это уже 5,900 клоков на байт - за такое время не только пообедать, но и посуду можно вымыть...


Цыплячья скорость UART в 10 раз ниже 115kBit/S. У UART сообщения однобайтовые и все. У CAN надо каждое сообщение обрабатывать. Значит ПДП не обойдешься как можно было бы на UART сделать.

Сколько времени занимает вход в в прерывание (~5uS)? Умножте это на 2000 (128000/64). Столько времени надо отдать на накладные расходы каждую секунду. Идет борьба за это время.
2000*5uS = 10mS. Что есть один процент. Похоже вы правы. Надо исследовать и найти что пожирает время.

Я честно боролся за оптимизацию sm.gif


Простейший способ проверить время обработки прерывания дергать свободную ножку при входе вверх, а при завершении обработки вниз. Правда одной ножкой не обойдешся.
надо одну дергать вверх при входе в прерывание и вскоре вниз. Вторую в нашем обработчике CAN. В начале вверх, а в конце вниз. Синхронизироваться от второй ножки и посмотрель осциллографом время от начала первого импульса до конца второго.

Могу помочь найти как сконфигурировать ножки и место куда вставить команды.

Цитата(A. Fig Lee @ Sep 24 2013, 04:34) *
Мда..

Вы линукс то видали?
Сколько там процессов/тредов бежит смотрели?


Как я понял разница когда есть поток сообщений и когда нет отличаются на 60% занятости процессора.

Сообщение отредактировал Tarbal - Sep 24 2013, 00:49
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Sep 24 2013, 02:56
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



QUOTE (Tarbal @ Sep 24 2013, 04:54) *
Цыплячья скорость UART в 10 раз ниже 115kBit/S
Упс..., промашку давал... Утячья скорость получается - в полёте... :)

QUOTE (Tarbal @ Sep 24 2013, 04:54) *
Сколько времени занимает вход в в прерывание (~5uS)? Умножте это на 2000 (128000/64)
Интересно. Т.е. 1 интеррапт на каждые 64 байта? Это облегчает задачу. EDMA же привязана к ивенту, она и сложит эти 64 байта в угол, т.е. в буфер...

5 микросек это 3000 клоков процессора. На вход многовато, вход прост (разумно предположить такое?), а вот выход сложнее из-за перепланировки (знать бы алгоритм...). Ну условно можно считать, что 5 на вход и выход - разумное число. Хотя, это же Ослинукс, кто его разберёт... При 0.8 загрузке 5,900*64 клоков на 64 байта это 377К, от коего числа 3К на оверхед интеррапта составляет 0.0079 - т.е. 8 промилле. Меньше, чем процент.

Сообщение отредактировал AndrewN - Sep 24 2013, 03:06
Go to the top of the page
 
+Quote Post

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

 


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


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