|
Большое число программных прерываний в ОС Linux при приеме информации по интерфейсу CAN на AM3517, Нужно уменьшить число программных прерываний в ОС Linux |
|
|
|
Sep 18 2013, 09:49
|
Группа: Участник
Сообщений: 14
Регистрация: 18-09-13
Пользователь №: 78 372

|
На AM3517 при получении информации через интерфейс CAN (скорость передачи данных 1 Мбит/с шина CAN загружена около 80%) в ОС Linux генерируется много программных прерываний (около 45% загрузки процессора). Можно ли уменьшить количество программных прерываний при приеме?
|
|
|
|
|
 |
Ответов
|
Sep 18 2013, 19:24
|
Знающий
   
Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960

|
Цитата(Tarbal @ Sep 18 2013, 21:00)  Уточните насчет программных прерываний. Может все-таки это реальные прерывания вызванные железом? Если так, то число прерываний должно совпадать с числом принятых сообщений, переданых сообщений и еще какой-нибудь байды, которая разрешена. Я посмотрел драйвер TI тот что в mainline. Там обработка приема делается поллингом так что количество хардверных прерываний от кан интерфейса будет меньше либо равно количеству принятых пакетов. С подтверждением прерываний может быть проблема это есть смысл проверить. Также не исключено что высокая загрузка это норма для скорости 1М. Ядро обрабатывает принятые пакеты софтверно. Какой софт у вас получает пакеты ?
|
|
|
|
|
Sep 19 2013, 05:54
|
Группа: Участник
Сообщений: 14
Регистрация: 18-09-13
Пользователь №: 78 372

|
Цитата(_3m @ Sep 19 2013, 01:24)  Я посмотрел драйвер TI тот что в mainline. Там обработка приема делается поллингом так что количество хардверных прерываний от кан интерфейса будет меньше либо равно количеству принятых пакетов. С подтверждением прерываний может быть проблема это есть смысл проверить. Также не исключено что высокая загрузка это норма для скорости 1М. Ядро обрабатывает принятые пакеты софтверно. Какой софт у вас получает пакеты ? Чтобы проверить прием была написана технологическая программа. Она ни чего не выводит, просто читает из сокета пакеты CAN в фоновом режиме и увеличивает счетчик принятых пракетов (по шине CAN непрерывно передается информация). Загрузку смотрю утилитой top. Так же привожу кол-во прерываний, кол-во принятых пакетов и размер принятых данных (cat /proc/interrupts ; ifconfig). CODE Mem: 32336K used, 204116K free, 0K shrd, 1568K buff, 6260K cached CPU: 0% usr 21% sys 0% nic 35% idle 0% io 0% irq 42% sirq Load average: 0.03 0.04 0.05 1/58 1009 PID PPID USER STAT VSZ %MEM %CPU COMMAND 1008 951 root R 1472 1% 44% ./a.out 622 2 root SW 0 0% 6% [kworker/0:2] 644 2 root SW 0 0% 1% [ksdioirqd/mmc1] 1009 951 root R 2844 1% 1% top 45 2 root SW 0 0% 0% [irq/74-serial i] 951 949 root S 2844 1% 0% -sh 924 1 root S 2732 1% 0% /sbin/syslogd -n -C64 -m 20 926 1 root S 2668 1% 0% /sbin/klogd -n 917 1 root S 2668 1% 0% /usr/sbin/telnetd 912 1 messageb S 2436 1% 0% /usr/bin/dbus-daemon --system 949 1 root S 2400 1% 0% login -- root 692 1 root S < 2188 1% 0% /sbin/udevd -d 726 692 root S < 2184 1% 0% /sbin/udevd -d 727 692 root S < 2184 1% 0% /sbin/udevd -d 933 1 root S 2064 1% 0% /usr/sbin/thttpd -d /srv/www -p 8080 - 1 0 root S 1628 1% 0% init [5] 588 2 root SW 0 0% 0% [w1_bus_master1] 5 2 root SW 0 0% 0% [kworker/u:0] 633 2 root SW 0 0% 0% [mmcqd/0] 3 2 root SW 0 0% 0% [ksoftirqd/0] CODE root@am3517-evm:~# cat /proc/interrupts ; ifconfig CPU0 11: 0 INTC prcm 12: 1873 INTC DMA 20: 0 INTC gpmc 24: 12114477 INTC can0 25: 2 INTC OMAP DSS 37: 454780 INTC gp timer 56: 1874385 INTC omap_i2c 57: 0 INTC omap_i2c 58: 84972 INTC omap_hdq 61: 0 INTC omap_i2c 71: 1 INTC musb-hdrc.0 72: 0 INTC serial idle 73: 0 INTC serial idle 74: 22509 INTC serial idle, OMAP UART2 77: 0 INTC ehci_hcd:usb2 83: 2765 INTC mmc0 86: 286560 INTC mmc1 160: 0 GPIO tps6507x 162: 1 GPIO mmc1 184: 0 GPIO ds1374 186: 0 GPIO tca8418-keypad 224: 0 GPIO mmc0 Err: 0
can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 UP RUNNING NOARP MTU:16 Metric:1 RX packets:12732263 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:10 RX bytes:88788609 (84.6 MiB) TX bytes:0 (0.0 B) Interrupt:24 CODE 1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/socket.h> 4 #include <sys/ioctl.h> 5 #include <net/if.h> 6 7 #include <linux/can.h> 8 #include <linux/can/raw.h> 9 #include <string.h> 10 11 /* At time of writing, these constants are not defined in the headers */ 12 #ifndef PF_CAN 13 #define PF_CAN 29 14 #endif 15 16 #ifndef AF_CAN 17 #define AF_CAN PF_CAN 18 #endif 19 20 int main(int argc, char *argv[]) 21 { 22 /* create a frame */ 23 struct can_frame frame; 24 /* interface */ 25 struct ifreq ifr; 26 /* number of te */ 27 int bytes_read; 28 /* create the socket */ 29 int skt = socket( PF_CAN, SOCK_RAW, CAN_RAW ); 30 /* socket address */ 31 struct sockaddr_can addr; 32 /* counter SFF */ 33 unsigned long countSFF; 34 /* counter EFF*/ 35 unsigned long countEFF; 36 37 countSFF = 0; 38 countEFF = 0; 39 /* locate the interface you wish to use */ 40 strcpy( ifr.ifr_name, "can0" ); 41 ioctl( skt, SIOCGIFINDEX, &ifr ); /* ifr.ifr_ifindex gets filled with that device's index */ 42 /* select that CAN interface, and bind the socket to it. */ 43 addr.can_family = AF_CAN; 44 addr.can_ifindex = ifr.ifr_ifindex; 45 bind( skt, ( struct sockaddr * ) &addr, sizeof( addr ) ); 46 while(1) 47 { 48 bytes_read = read( skt, &frame, sizeof( frame ) ); 49 if( bytes_read < 0 ) 50 { 51 printf( "CAN\n" ); 52 } 53 else if ( bytes_read > 0 ) 54 { 55 if( !( frame.can_id & 0x80000000U ) ) 56 { 57 countSFF++; 58 } 59 else 60 { 61 countEFF++; 62 } 63 } 64 } 65 66 return 0; 67 } Цитата(kurtis @ Sep 18 2013, 18:45)  У вас случайно прерывания не по gpio идут? Если по gpio, то по фронту или по уровню? Прерывания CAN осуществляется не по GPIO (фрагмент из команды "cat /proc/interrupts" 24: 12114477 INTC can0). Цитата(Tarbal @ Sep 19 2013, 07:13)  Положим одна транзакция 100 бит. Значит при 80% загрузке в секунду приходит 8000 сообщений. А сколько у вас прерываний случается? Из "cat /proc/interrupts" следует, что за несколько минут, при загрузки шины CAN примерно 80% количество прерываний 12114477.
|
|
|
|
|
Sep 19 2013, 07:16
|
Знающий
   
Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960

|
Цитата(Таратухин Сергей @ Sep 19 2013, 09:54)  Чтобы проверить прием была написана технологическая программа. Она ни чего не выводит, просто читает из сокета пакеты CAN в фоновом режиме и увеличивает счетчик принятых пракетов ... Пока не вижу криминала. По вашим данным 12114477 INTC can0 12732263 RX packets У вас 0,95 прерывания на пакет. Абсолютное большинство пакетов система успевает забрать и обработать до прихода следующего. Возможно это нормальная работа socketcan. Там довольно накручено поэтому еще живы альтернативные решения, например lincan. Вот бенчмарки CAN driver benchmarkВ бенчмарке есть хорошая идея - тестировать socketcan при одновременной нагрузке ethernet. Цитата(Tarbal @ Sep 19 2013, 05:13)  Положим одна транзакция 100 бит. Значит при 80% загрузке в секунду приходит 8000 сообщений. А сколько у вас прерываний случается? По моим расчетам (я мог ошибиться) для скорости 1М максимальный темп передачи пакетов CAN при 100% загрузке шины и длине данных 8 бит составляет 63 и 81мкс для стандартных и расширенных пакетов соответственно что дает 15873 и 12345 пакетов в секунду. У ТС загрузка шины 80% значит пакеты поступают каждые 79мкс.
|
|
|
|
Сообщений в этой теме
Таратухин Сергей Большое число программных прерываний в ОС Linux при приеме информации по интерфейсу CAN на AM3517 Sep 18 2013, 09:49 kurtis У вас случайно прерывания не по gpio идут? Если по... Sep 18 2013, 12:45    Tarbal Цитата(_3m @ Sep 19 2013, 11:16) Пока не ... Sep 19 2013, 13:19     Таратухин Сергей Цитата(Tarbal @ Sep 19 2013, 19:19) Ваши ... Sep 20 2013, 09:13      sasamy Цитата(Таратухин Сергей @ Sep 20 2013, 13... Sep 20 2013, 10:42       Таратухин Сергей Цитата(sasamy @ Sep 20 2013, 16:42) В ста... Sep 20 2013, 12:23        sasamy Цитата(Таратухин Сергей @ Sep 20 2013, 16... Sep 20 2013, 12:55         sasamy Цитата(sasamy @ Sep 20 2013, 16:55) Посмо... Sep 20 2013, 14:30          AndrewN QUOTE (sasamy @ Sep 20 2013, 18:30) Кстат... Sep 21 2013, 18:38          Таратухин Сергей Цитата(sasamy @ Sep 20 2013, 20:30) Кстат... Sep 23 2013, 06:26           Tarbal Цитата(Таратухин Сергей @ Sep 23 2013, 10... Sep 23 2013, 12:20            Таратухин Сергей Цитата(Tarbal @ Sep 23 2013, 18:20) Для ... Sep 23 2013, 12:45             Tarbal Цитата(Таратухин Сергей @ Sep 23 2013, 16... Sep 23 2013, 13:33              Таратухин Сергей Цитата(Tarbal @ Sep 23 2013, 19:33) Я не ... Oct 8 2013, 05:27               Tarbal Цитата(Таратухин Сергей @ Oct 8 2013, 09... Oct 8 2013, 12:21                Таратухин Сергей Цитата(Tarbal @ Oct 8 2013, 18:21) Вы пол... Oct 15 2013, 09:11                 Tarbal Цитата(Таратухин Сергей @ Oct 15 2013, 13... Oct 15 2013, 12:12                  Таратухин Сергей Цитата(Tarbal @ Oct 15 2013, 18:12) laten... Oct 16 2013, 11:30             sasamy Цитата(Таратухин Сергей @ Sep 23 2013, 16... Sep 23 2013, 13:38              AndrewN QUOTE (sasamy @ Sep 23 2013, 16:38) почем... Sep 23 2013, 21:51               A. Fig Lee Цитата(AndrewN @ Sep 23 2013, 17:51) Колл... Sep 24 2013, 00:34               Tarbal Цитата(AndrewN @ Sep 24 2013, 01:51) Колл... Sep 24 2013, 00:54                AndrewN QUOTE (Tarbal @ Sep 24 2013, 04:54) Цыпля... Sep 24 2013, 02:56                 Tarbal Цитата(AndrewN @ Sep 24 2013, 06:56) Упс.... Sep 24 2013, 03:12                 _3m Цитата(AndrewN @ Sep 24 2013, 06:56) Инте... Sep 24 2013, 06:17                  AndrewN QUOTE (_3m @ Sep 24 2013, 10:17) Такты сч... Sep 24 2013, 21:50                   Tarbal Цитата(AndrewN @ Sep 25 2013, 01:50) Пото... Sep 25 2013, 01:45      Tarbal Цитата(Таратухин Сергей @ Sep 20 2013, 13... Sep 20 2013, 12:30       Таратухин Сергей Цитата(Tarbal @ Sep 20 2013, 18:30) У люб... Sep 21 2013, 15:53        Tarbal Цитата(Таратухин Сергей @ Sep 21 2013, 19... Sep 21 2013, 16:39         Таратухин Сергей Цитата(Tarbal @ Sep 21 2013, 22:39) Ну то... Sep 23 2013, 11:54          Tarbal Цитата(Таратухин Сергей @ Sep 23 2013, 15... Sep 23 2013, 12:05           Таратухин Сергей Цитата(Tarbal @ Sep 23 2013, 18:05) Я поп... Sep 23 2013, 12:14 Tarbal Положим одна транзакция 100 бит. Значит при 80% за... Sep 19 2013, 01:13 A. Fig Lee Цитата(Таратухин Сергей @ Sep 18 2013, 05... Sep 20 2013, 12:11 Tarbal Вы уверены, что вы починили функциональность, а не... Oct 16 2013, 11:42 Таратухин Сергей Цитата(Tarbal @ Oct 16 2013, 17:42) Вы ув... Oct 16 2013, 11:53  Tarbal Цитата(Таратухин Сергей @ Oct 16 2013, 15... Oct 16 2013, 12:47   Таратухин Сергей Цитата(Tarbal @ Oct 16 2013, 18:47) И не ... Oct 17 2013, 05:25 Tarbal Отгадать не получится. Надо дебагировать. Oct 18 2013, 01:47 Grommerin Здравствуйте. Уже месяц бьюсь над такой-же проблем... Nov 3 2014, 12:02 ZASADA Цитата(Grommerin @ Nov 3 2014, 15:02) Здр... Nov 4 2014, 10:39 Grommerin Цитата(ZASADA @ Nov 4 2014, 13:39) вы неп... Nov 11 2014, 08:50 _3m Чтобы не начинать похожую тему напишу сюда.
Разыс... Apr 6 2016, 14:17
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|