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 <https://github.com/jfasch/jf-linuxexamples>`__) zum Kurs :doc:`/trainings/repertoire/linux-prog/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 <https://github.com/jfasch/jf-linuxexamples/blob/master/pthread/base/message-queue.h>`__. 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 <https://www.kernel.org/doc/Documentation/gpio/sysfs.txt>`__. Unbedingt lesen. * Das Beispielprogramm, das auf den GPIOs 23 und 24 horcht, `gpio-interrupt.cc <https://github.com/jfasch/jf-linuxexamples/blob/master/demo/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 <https://www.kernel.org/doc/Documentation/networking/can.txt>`__. Schamlose Eigenwerbung: mein Vortrag bei den `Grazer Linuxtagen 2014 <https://glt14.linuxtage.at/>`__ zu dem Thema, * `Programm <https://glt14-programm.linuxtage.at/events/239.de.html>`__ * `Slides <https://glt14-programm.linuxtage.at/attachments/151_GLT2014-CANBus.pdf>`__ * `Video <https://www.youtube.com/watch?v=5XuSr4M9uNI&list=PLWHx0EvwLLUHaDLeRf7bHoVjy9wx7IbbB&index=6>`__ Das `can-utils <https://github.com/linux-can/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 <https://glt14-programm.linuxtage.at/attachments/151_GLT2014-CANBus.pdf>`__.) .. _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 <https://github.com/jfasch/jf-kernel-course>`__. 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 <http://lxr.free-electrons.com/source/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 <http://lxr.free-electrons.com/source/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 <http://lxr.free-electrons.com/source/drivers/net/can/at91_can.c>`__. Heizungssteuerung ----------------- Lacht nur! * Das OpenHeating Projekt * `Github <https://github.com/jfasch/openheating>`__ * `Homepage <https://www.openheating.org/>`__ * Ein `Vortrag <https://glt15-programm.linuxtage.at/events/15.html>`__ bei den Grazer Linuxtagen 2015 (`Folien <https://glt15-programm.linuxtage.at/system/attachments/26/original/920-glt-2015.pdf>`__)