Kursnotizen: Linux Embedded 2015-11-30 ====================================== Multithreading -------------- Ausprogrammiert haben wir den Load/Modify/Store Konflikt anhand eines parallelen Integer Increments - als Demonstration der Mutter aller Race Conditions. Danach haben wir die Race Condition mit Hilfe eines Mutex gefixt. Die Inter-Thread Kommunkation mit Hilfe von Condition Variablen habe ich nur frontal vorgeführt (mit viel Diskussion, vielen Dank an Stefan), mit Beispielcode aus meinem `Github-Projekt `__) zum Kurs :doc:`/trainings/repertoire/sysprog/index`. Das Beispiel war eine "Message Queue", händisch ausprogrammiert mit Hilfe eines Mutex und zweier Condition Variablen ("not full", "not empty"), und den Operation ``push`` und ``pop``. `Code zu bewundern hier `__. GPIOs in Userspace ------------------ Ihr könnt euch erinnern an die LED, die ich von der Commandline aus blinken liess, irgendwo in ``/sys/class/gpio``. Ein wenig später im Kurs hatten wir GPIOs, die als Interrupt (an der *Falling Edge*) konfiguriert waren, und die ich in einem kleinen C-Programm empfing. Hier ein paar Teile ... * `Dokumentation im Kernel Source `__. Unbedingt lesen. * Das Beispielprogramm, das auf den GPIOs 23 und 24 horcht, `gpio-interrupt.cc `__ CAN Bus ------- CAN wird unter Linux über normale Sockets gesprochen, siehe dazu die ausführliche Dokumentation im Kernel Source: `Documentation/networking/can.txt `__. Schamlose Eigenwerbung: mein Vortrag bei den `Grazer Linuxtagen 2014 `__ zu dem Thema, * `Programm `__ * `Slides `__ * `Video `__ Das `can-utils `__ Projekt ist das Überbleibsel des ehemaligen SocketCAN Projektes; dessen Kernel-Teil ist schon lange vom Kernel absorbiert worden. Es enthält schnuckelige kleine Utilities wie Aufzeichnen, Replay, etc. (Siehe dazu die `Folien vom Vortrag `__.) .. _records-bodenseo-2015-11-30-kernel: Driver Beispiele ---------------- Freitag war Kerneldrivertag. Sorry Emanuel für den Reboot. Die Beispieldriver sind zu finden in `meinem Github-Repository zum Kernel-Kurs `__. Beispiele für Real-Life-Driver: * Wir hatten ``/dev/random``, ``/dev/mem`` (wo der Hans-Jörg seine Register findet), ``/dev/null``, ``/dev/zero``. Diese "Devices" werden vom *mem* Driver angeboten. Er hat ganz prominent die *Major Number* 1 und ist in `drivers/char/mem.c `__. implementiert. Gutes Beispiel für den Anfang. * Der MCP2515 Driver (CAN Controller, über SPI angesprochen). Ein etwas fortgeschritteneres Beispiel, da er sich ins Network Subsystem einpflegt und als SPI Client agiert. (Kein Character Device in Sicht.) `drivers/net/can/spi/mcp251x.c `__ * Der CAN Controller im AT91 SoC - Stefan, ich glaub das ist der Chip, der auf deinem Stecker verbaut ist. `drivers/net/can/at91_can.c `__. Heizungssteuerung ----------------- Lacht nur! * Das OpenHeating Projekt * `Github `__ * `Homepage `__ * Ein `Vortrag `__ bei den Grazer Linuxtagen 2015 (`Folien `__)