4 \section{\LL-Status im /proc-Filesystem}
7 Das \LLCF\ unterstützt das /proc-Filesystem und stellt darüber Statistiken
8 und Informationen über interne Strukturen und Stati in lesbarer Form zur
9 Verfügung. Die Informationen können vom Benutzer beispielsweise mit\\
11 \verb+cat /proc/net/can/stats+\\
13 abgefragt werden. Im Folgenden werden die einzelnen Einträge erläutert.
15 \subsection{Versionsinformation /proc/net/can/version}
17 Die \LL-Versionsinformationen können für eine Anwendung z.B. durch das
18 Öffnen der Datei \verb+/proc/net/can/version+ ausgelesen werden. Dazu werden
19 die ersten 6 Zeichen in einen Puffer kopiert und mit
20 \verb+ llcf_version_code = strtoul(mybuffer, (char **)NULL, 16);+
21 in den LLCF\_VERSION\_CODE überführt. Der LLCF\_VERSION\_CODE wird
24 \verb-LLCF_VERSION_CODE = (((MAJORVERSION) << 16) + ((MINORVERSION) << 8) + (PATCHLEVEL))-\\
29 hartko@pplinux1:~> cat /proc/net/can/version
30 010000 [ Volkswagen AG - Low Level CAN Framework (LLCF) v1.0.0-rc1 ]
33 \subsection{Statistiken /proc/net/can/stats}
35 Über die angebotenen Statistiken kann man sich über das aktuelle
36 Datenaufkommen informieren und wie beispielsweise der Anteil der von
37 Applikationen benötigten (matched) CAN-Frames im Verhältnis aller vom CAN-Bus
38 empfangener CAN-Frames ist.\\
40 Die Informationen werden mit dem Start des \LL\ jede Sekunde aktualisiert.
43 hartko@pplinux1:~> cat /proc/net/can/stats
45 811 transmitted frames (TXF)
46 319427 received frames (RXF)
47 69504 matched frames (RXMF)
49 21 % total match ratio (RXMR)
50 0 frames/s total tx rate (TXR)
51 0 frames/s total rx rate (RXR)
53 100 % current match ratio (CRXMR)
54 2 frames/s current tx rate (CTXR)
55 166 frames/s current rx rate (CRXR)
57 100 % max match ratio (MRXMR)
58 2 frames/s max tx rate (MTXR)
59 167 frames/s max rx rate (MRXR)
61 6 current receive list entries (CRCV)
62 6 maximum receive list entries (MRCV)
65 \subsection{Zurücksetzen von Statistiken /proc/net/can/reset\_stats}
67 Das Zurücksetzen der statistischen Informationen kann durch interne
68 Überläufe von Zählern oder vom Benutzer selbst initiiert werden. Über
69 das Zurücksetzen der statistischen Informationen informiert eine
70 zusätzliche Zeile (STR). An diesem Beispiel sind die Auswirkungen in
71 einem laufenden System bezüglich der obigen Ausgabe der Statistiken
74 hartko@pplinux1:~> cat /proc/net/can/reset_stats
75 LLCF statistic reset #1 done.
76 hartko@pplinux1:~> cat /proc/net/can/stats
78 31 transmitted frames (TXF)
79 2585 received frames (RXF)
80 2585 matched frames (RXMF)
82 100 % total match ratio (RXMR)
83 1 frames/s total tx rate (TXR)
84 165 frames/s total rx rate (RXR)
86 100 % current match ratio (CRXMR)
87 2 frames/s current tx rate (CTXR)
88 165 frames/s current rx rate (CRXR)
90 100 % max match ratio (MRXMR)
91 2 frames/s max tx rate (MTXR)
92 167 frames/s max rx rate (MRXR)
94 6 current receive list entries (CRCV)
95 6 maximum receive list entries (MRCV)
97 1 statistic resets (STR)
102 \subsection{Interne Empfangslisten des RX-Dispatchers}
104 \LL-Module können sich beim \LL-RX-Dispatcher für den Empfang von
105 einzelnen CAN-IDs (oder Bereichen von CAN-IDs) von bestimmten
106 CAN-Netzwerk-Interfaces registrieren. Diese Registrierung führt zu
107 einem Eintrag in einer zugehörigen Empfangsliste, bei der
108 zu jeder registrierten CAN-ID eine Funktion mit einem Parameter
109 (z.B. eine modulspezifische Referenz wie 'userdata' oder 'sk')
110 aufgerufen wird, wenn das entsprechende CAN-Frame empfangen
111 wurde. In der Spalte 'ident' trägt sich das
112 registrierende Protokoll-Modul namentlich ein. Zusammen mit der
113 Debug-Funktionalität (siehe Kapitel \ref{modparms}) kann man anhand
114 dieser Informationen die Funktionsweise des \LL\ einfach nachvollziehen.\\
116 Zur schnellen Verarbeitung empfangener CAN-Frames sind im
117 RX-Dispatcher des \LL\ verschiedenartige Empfangslisten (für jedes
118 CAN-Netzwerk-Interface) realisiert:
121 \item[rcvlist\_all] In dieser Liste sind Registrierungen eingetragen,
122 die von einem CAN-Bus alle empfangenen CAN-Frames
123 benötigen. Typischerweise sind dieses die so genannten RAW-Sockets
124 ohne aktiven Filter (siehe Kapitel \ref{rawsocket}).
125 \item[rcvlist\_fil] In dieser Liste sind Registrierungen eingetragen,
126 die nur einen über Bitmasken definierten Bereich von CAN-Frames
127 benötigen (z.B. 0x200 - 0x2FF).
128 \item[rcvlist\_inv] In dieser Liste sind Registrierungen eingetragen,
129 die einen über Bitmasken definierten Bereich von CAN-Frames ausblenden
130 wollen - also die Umkehrung von 'rcvlist\_fil'.
131 \item[rcvlist\_eff] In dieser Liste sind Registrierungen für einzelne
132 CAN-Frames im Extended Frame Format (29 Bit Identifier) eingetragen.
133 \item[rcvlist\_sff] In dieser Liste sind Registrierungen für einzelne
134 CAN-Frames im Standard Frame Format (11 Bit Identifier) eingetragen.
137 Durch das Aufteilen der Empfangslisten, wird der Aufwand zum Suchen
138 und Vergleichen des empfangenen CAN-Frames mit den registrierten
139 Empfangsfiltern minimiert.\\
141 So wurde z.B. die Liste 'rcvlist\_sff' als Array mit 2048 Einträgen (11 Bit
142 CAN-ID) mit einer einfach verketteten Liste für die jeweiligen CAN-IDs
143 realisiert. Auf eine Überprüfung von Filtern und Inhalten kann hier
144 beim Empfang einer passenden Nachricht verzichtet werden.\\
147 wird die Funktionalität der Extended CAN-Frames in aktuellen Projekten
148 nicht genutzt, weshalb die Registrierungen für einzelne EFF-Frames in
149 eine einfach verkettete Liste eingetragen werden. Bei intensiverer
150 Nutzung der Extended CAN-Frames sollte man als 'rcvlist\_eff' eine
151 Hash-Tabelle (analog zur 'rcvlist\_sff') im \LL\ realisieren, um eine
152 effiziente Verarbeitung zu gewährleisten.\\
154 Möchte man alle Empfangslisten auf einmal ansehen, kann man zur
155 Vereinfachung folgendes eingeben:
158 hartko@pplinux1:~> cat /proc/net/can/rcvlist_*
160 receive list 'rx_all':
161 device can_id can_mask function userdata matches ident
162 can1 000 00000000 f8c995ac f0e59280 42726 raw
163 device can_id can_mask function userdata matches ident
164 can0 000 00000000 f8c995ac f0e59800 55240 raw
167 receive list 'rx_eff':
172 receive list 'rx_fil':
173 device can_id can_mask function userdata matches ident
174 can1 200 00000700 f8c995ac f0e5b380 0 raw
178 receive list 'rx_inv':
183 receive list 'rx_sff':
185 device can_id can_mask function userdata matches ident
186 can0 123 000007ff f8c86bec e2e14380 29 bcm
187 can0 456 000007ff f8c86bec ea954880 0 bcm
188 can0 789 000007ff f8c86bec e30e6200 130 bcm
189 can0 3FF 000007ff f8c86bec deaf2580 14 bcm
190 can0 740 000007ff f8c93680 e48322c4 178 tp20
194 Es geht natürlich auch so:
197 hartko@pplinux1:~> cat /proc/net/can/rcvlist_sff
199 receive list 'rx_sff':
201 device can_id can_mask function userdata matches ident
202 can0 123 000007ff f8c86bec e2e14380 29 bcm
203 can0 456 000007ff f8c86bec ea954880 0 bcm
204 can0 789 000007ff f8c86bec e30e6200 130 bcm
205 can0 3FF 000007ff f8c86bec deaf2580 14 bcm
206 can0 740 000007ff f8c93680 e48322c4 178 tp20
211 \subsection{CAN Network-Devices im Verzeichnis /proc/net/drivers}
213 In dieses Verzeichnis sollen sich CAN-Netzwerk-Treiber mit ihren
214 Proc-Filesystem-Einträgen registrieren. Derzeit ist dieses nur für den
215 mitgelieferten SJA1000-Treiber auf \verb+src/drivers/sja1000+
216 realisiert, dessen Ausgaben kurz beschrieben werden.\\
218 Im Beispiel wird der SJA1000-Netzwerk-Treiber auf dem iGate (Jaybrain
219 GW2) gezeigt. Beim ISA-Treiber (sja1000-isa) sind die ausgelesenen
220 Informationen analog.
222 \subsubsection{Treiberstatus /proc/net/drivers/sja1000-xxx}
224 Hier wird der Zustand der CAN-Controller und des jeweils zugehörigen
225 CAN-Busses angezeigt (siehe dazu die Dokumentation zum Philips
229 hartko@pplinux1:~> cat /proc/net/drivers/sja1000-gw2
230 CAN bus device statistics:
231 errwarn overrun wakeup buserr errpass arbitr restarts clock baud
232 can0: 0 0 0 0 0 0 0 20000000 500
233 can0: bus status: OK, RXERR: 0, TXERR: 0
234 can1: 0 0 0 0 0 0 0 20000000 100
235 can1: bus status: OK, RXERR: 0, TXERR: 0
236 can2: 0 0 0 0 0 0 0 20000000 100
237 can2: bus status: OK, RXERR: 0, TXERR: 0
238 can3: 0 0 0 0 0 0 0 20000000 500
239 can3: bus status: OK, RXERR: 0, TXERR: 0
242 \subsubsection{Registeranzeige /proc/net/drivers/sja1000-xxx\_regs}
244 Hier werden die 32 Register der SJA1000-CAN-Controller angezeigt
245 (siehe dazu die Dokumentation zum Philips SJA1000).
248 hartko@pplinux1:~> cat /proc/net/drivers/sja1000-gw2_regs
250 can0 SJA1000 registers:
251 00: 02 00 0c 00 05 00 40 4d 1a 1a 00 00 00 60 00 00
252 10: 65 ef d3 5f a2 08 01 05 fa ff 0e 7f 0c 00 00 cf
253 can1 SJA1000 registers:
254 00: 02 00 0c 00 05 00 43 ff 1a 1a 00 00 00 60 00 00
255 10: 61 ff de 3d 80 00 10 45 d7 ef fb 4a 06 00 00 cf
256 can2 SJA1000 registers:
257 00: 02 00 0c 00 05 00 43 ff 1a 1a 00 00 00 60 00 00
258 10: 61 fb ee 87 a0 4a 80 10 76 ff da bd 00 00 00 cf
259 can3 SJA1000 registers:
260 00: 02 00 0c 00 05 00 40 4d 1a 1a 00 00 00 60 00 00
261 10: 61 ef 7f ff 21 1c 42 08 32 df 57 6f a1 00 00 cf
264 \subsubsection{Zurücksetzen des Treibers /proc/net/drivers/sja1000-xxx\_reset}
266 Das Lesen dieses Eintrages führt einen Reset der SJA1000-CAN-Controller
267 durch. Wie man im Beispiel sieht, ist die Anzahl der 'restarts' danach
271 hartko@pplinux1:~> cat /proc/net/drivers/sja1000-gw2_reset
272 resetting can0 can1 can2 can3 done
273 hartko@pplinux1:~> cat /proc/net/drivers/sja1000-gw2
274 CAN bus device statistics:
275 errwarn overrun wakeup buserr errpass arbitr restarts clock baud
276 can0: 0 0 0 0 0 0 1 20000000 500
277 can0: bus status: OK, RXERR: 0, TXERR: 0
278 can1: 0 0 0 0 0 0 1 20000000 100
279 can1: bus status: OK, RXERR: 0, TXERR: 0
280 can2: 0 0 0 0 0 0 1 20000000 100
281 can2: bus status: OK, RXERR: 0, TXERR: 0
282 can3: 0 0 0 0 0 0 1 20000000 500
283 can3: bus status: OK, RXERR: 0, TXERR: 0
286 \subsubsection{Testprogramme}
289 \item[tst-proc] Öffnet bis zu 800 RAW-Sockets, um einen Überlauf bei
290 der Ausgabe von \verb+/proc/net/can/rcvlist_all+ zu provozieren.