Skip to content
Snippets Groups Projects
Commit bc171f45 authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Notizen und Beispiele 27.4.2020

parent 07d80472
No related branches found
No related tags found
No related merge requests found
Makefile-2
\ No newline at end of file
obj-m += hellomod-1.o obj-m += hellomod-1.o
obj-m += hellomod-2.o
obj-m += chardev-1.o obj-m += chardev-1.o
all: all:
......
#include <avr/io.h>
#define F_CPU 16000000l
#include <util/delay.h>
int main (void)
{
DDRD = 0x01;
PORTD |= 0x01;
while (1)
{
_delay_ms (500);
PORTD &= ~0x01;
_delay_ms (500);
PORTD |= 0x01;
}
return 0;
}
27.04.2020, 14:57:44
~~~~~~~~~~~~~~~~~~~~
* am Anfang der Lehrveranstaltung:
Mikrocontroller, PC früher (DOS): Hardware direkt ansprechen
* letzte Woche: Unix-Shell, einschließlich Shell-Skripte
* vom "Mikrocontoller" zur Shell: Bootvorgang
- Rechner einschalten
- Software wird (wie beim Mikrocontroller) aus dem ROM heraus gestartet:
früher: BIOS
heute: UEFI - so groß und mächtig wie ein Betrisbssystem
- Logo erscheint auf dem Bildschirm
- Hardware prüfen
- Festplatten suchen
- Master Boot Record (MBR, 512 Bytes) von der ersten Festplatte laden,
darin enthaltenes Programm (440 Bytes) starten: Bootloader
- Bootloader lädet ein etwas größeres Programm:
nächste "Stage" des Bootloaders
- Kernel und ladbare Module (Treiber) für Zugriff auf Festplatten,
Tastatur usw. ("kleines Betriebssystem")
- Boot-Menü
- Auswahl, welches Betriebssystem gebootet werden soll
- Parameter einstellen, z.B.:
Linux mit Parameter "init=/bin/bash" --> direkt Root-Shell
- Passwort-Abfrage für verschlüsselte Festplatte
- Boot-Loader lädt Kernel von Festplatte in den Speicher
- Boot-Loader lädt zusätzlich eine RAM-Disk in den Speicher
("initrd", virtuelle Festplatte),
damit der Kernel nicht selbst auf die Festplatte zugreifen muß.
Das kann er aber erst, wenn die dafür notwendigen Treiber-Module
geladen sind. Die befinden sich in der RAM-Disk.
- Kernel (= laufendes Programm im Speicher)
startet 1 weiteres Programm:
früher: /sbin/init
heute: /bin/systemd = Link nach /lib/systemd/systemd
- Meldungen mit grünem "[ OK ]" dahinter
- früher: /sbin/init
- per inittab gestartet: /etc/init.d/rc
- Dieses Shell-Skript ruft weitere Shell-Skripte mit Parametern
"start" bzw. "stop" auf.
- Die aufgerufenen Shell-Skripte befinden sich in /etc/init.d.
- Für Run-Level 2: Symbolische Links in /etc/init.d/rc2.d,
die mit "S" anfangen --> mit "start" aufrufen - oder
die mit "K" anfangen --> mit "stop" aufrufen
- insbesondere: "S03slim" startet "slim", den Anmeldebildschirm
("Display Manager")
- heute: /bin/systemd
- übernimmt die Funktionen von /etc/init.d/rc
- Konfigurationsdateien in /lib/systemd/system
anstelle von Shell-Skripts in /etc/init.d
und Symlinks in /etc/init.d/rc[0-6].d
* Aktuelles Problem: Programme, die auf dem CVH-Server die
Nutzung von VNC und Jitsi aufrechterhalten, müssen im Moment
noch von Hand gestartet werden.
--> Mögliches Projekt: Skripte für systemd schreiben,
um dies zu automatisieren,
Direkte Anbindung an Jitsi Meet anstatt Umweg über die
Log-Dateien des Apache-Web-Servers
--> Schnelle Lösung: @reboot-Eintrag in crontab
- Anmeldebildschirm
- Textmodus: Programm "getty" schreibt "Debian GNU/Linux ... cassini"
auf den Bildschirm und ruft anschließend ein Program "login" auf,
das "login: " auf den Bildschirm schreibt.
Dort kann man dann Benutzernamen und Passwort eingeben.
- Grafikmodus: Display Manager
nach Anmeldung: startet Fenster-Manager und Desktop-Umgebung
- Oberfläche ("Shell", einschließlich GUI)
- Rechner ist einsatzbereit
* Hardware ansprechen: Kernel-Module
- Gerätedateien: Verzeichnis /dev
- /dev/null = "virtueller Mülleimer"
(Immer leer; was man hineinschreibt, ist weg.)
- /dev/pts/24 = Ausgabedatei für ein Bildschirmfenster
- /dev/pts/35 = Ausgabedatei für ein anderes Bildschirmfenster
- Das "c" in "ls -l" steht für "Character Device"
(zeichenorientierte Gerätedatei).
- selbst erzeugen: Kernel-Modul schreiben
- Struktur eines Kernel-Moduls
- "zwei Hauptprogramme": init_module(), cleanup_module()
- printk() (in den Kernel-Speicher schreiben)
statt printf() (zur Standardausgabe schreiben)
- Kernel-Modul compilieren
- make: siehe:
https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191212/hp-20191212.pdf
- standardisiertes Makefile: Makefile-2
- benötigte Werkzeuge: siehe Skript, Seite 10
- Modul laden: sudo insmod ./hellomod-1.ko
- Modul entladen: sudo rmmod ./hellomod-1.ko
- Output des Moduls: sudo tail /var/log/kern.log
- Lizenz des Moduls angeben. Wenn nicht GPL-kompatibel: Fehlermeldungen.
* Die Software-Schichten dazwischen: Kernel, System-Bibliothek
von der Shell bis zur Hardware
cassini/home/peter/bo/2020ss/bs/20200427> mknod chardev c 241 0
mknod: chardev: Die Operation ist nicht erlaubt
cassini/home/peter/bo/2020ss/bs/20200427> sudo mknod chardev c 241 0
cassini/home/peter/bo/2020ss/bs/20200427> ls -l chardev*
crw-r--r-- 1 root root 241, 0 Apr 27 18:15 chardev
-rw-r--r-- 1 peter peter 4069 Apr 4 2014 chardev-1.c
-rw-r--r-- 1 peter peter 323208 Apr 27 18:14 chardev-1.ko
-rw-r--r-- 1 peter peter 994 Apr 27 18:14 chardev-1.mod.c
-rw-r--r-- 1 peter peter 140296 Apr 27 18:14 chardev-1.mod.o
-rw-r--r-- 1 peter peter 184400 Apr 27 18:14 chardev-1.o
-rw-r--r-- 1 peter peter 4659 Mai 5 2017 chardev-2.c
-rw-r--r-- 1 peter peter 4997 Apr 26 2019 chardev-3.c
cassini/home/peter/bo/2020ss/bs/20200427> cat chardev
I already told you 0 times Hello world!
cassini/home/peter/bo/2020ss/bs/20200427> cat chardev
I already told you 1 times Hello world!
cassini/home/peter/bo/2020ss/bs/20200427> cat chardev
I already told you 2 times Hello world!
cassini/home/peter/bo/2020ss/bs/20200427> sudo rmmod ./chardev-1.ko
cassini/home/peter/bo/2020ss/bs/20200427> cat chardev
cat: chardev: Kein passendes Gerät bzw. keine passende Adresse gefunden
cassini/home/peter/bo/2020ss/bs/20200427>
cassini/home/peter/bo/2020ss/bs/20200427> sudo insmod ./chardev-1.ko
cassini/home/peter/bo/2020ss/bs/20200427> echo "Test" > chardev
bash: chardev: Keine Berechtigung
cassini/home/peter/bo/2020ss/bs/20200427> sudo chmod 666 chardev
cassini/home/peter/bo/2020ss/bs/20200427> ls -l chardev
crw-rw-rw- 1 root root 241, 0 Apr 27 18:15 chardev
cassini/home/peter/bo/2020ss/bs/20200427> echo "Test" > chardev
bash: echo: Schreibfehler: Das Argument ist ungültig.
cassini/home/peter/bo/2020ss/bs/20200427> sudo tail /var/log/kern.log
Apr 27 18:18:08 cassini kernel: [447493.757673] Try various minor numbers. Try to cat and echo to
Apr 27 18:18:08 cassini kernel: [447493.757673] the device file.
Apr 27 18:18:08 cassini kernel: [447493.757674] Remove the device file and module when done.
Apr 27 18:18:45 cassini kernel: [447530.149301] I was assigned major number 241. To talk to
Apr 27 18:18:45 cassini kernel: [447530.149302] the driver, create a dev file with
Apr 27 18:18:45 cassini kernel: [447530.149303] 'mknod /dev/chardev c 241 0'.
Apr 27 18:18:45 cassini kernel: [447530.149303] Try various minor numbers. Try to cat and echo to
Apr 27 18:18:45 cassini kernel: [447530.149303] the device file.
Apr 27 18:18:45 cassini kernel: [447530.149304] Remove the device file and module when done.
Apr 27 18:19:16 cassini kernel: [447561.746791] Sorry, this operation isn't supported.
cassini/home/peter/bo/2020ss/bs/20200427>
cassini/dev> ls -l null
crw-rw-rw- 1 root root 1, 3 Apr 22 14:00 null
cassini/dev> cat null
cassini/dev> echo "Test" > null
cassini/dev> cat null
cassini/dev>
Hallo
Hallo
cassini/home/peter/bo/2020ss/bs/20200427> cat hello-1.c
#include <stdio.h>
int main (void)
{
puts ("Hello, world!");
return 0;
}
cassini/home/peter/bo/2020ss/bs/20200427> gcc -Wall -O hello-1.c -o hello1
cassini/home/peter/bo/2020ss/bs/20200427> ./hello1
Hello, world!
cassini/home/peter/bo/2020ss/bs/20200427> rm hello1
cassini/home/peter/bo/2020ss/bs/20200427> cat Makefile-1
hello-1: hello-1.c
gcc -Wall -O hello-1.c -o hello-1
cassini/home/peter/bo/2020ss/bs/20200427> ln -s Makefile-1 Makefile
cassini/home/peter/bo/2020ss/bs/20200427> cat Makefile
hello-1: hello-1.c
gcc -Wall -O hello-1.c -o hello-1
cassini/home/peter/bo/2020ss/bs/20200427> make
gcc -Wall -O hello-1.c -o hello-1
cassini/home/peter/bo/2020ss/bs/20200427> ./hello-1
Hello, world!
cassini/home/peter/bo/2020ss/bs/20200427> make
make: „hello-1“ ist bereits aktuell.
cassini/home/peter/bo/2020ss/bs/20200427>
cassini/home/peter/bo/2020ss/bs/20200427> cat blink-1.c
#include <avr/io.h>
#define F_CPU 16000000l
#include <util/delay.h>
int main (void)
{
DDRD = 0x01;
PORTD |= 0x01;
while (1)
{
_delay_ms (500);
PORTD &= ~0x01;
_delay_ms (500);
PORTD |= 0x01;
}
return 0;
}
cassini/home/peter/bo/2020ss/bs/20200427> cat Makefile
TARGET = blink-1
$(TARGET).elf: $(TARGET).c
avr-gcc -Wall -Os -c -mmcu=atmega328p $(TARGET).c -o $(TARGET).elf
$(TARGET).hex: $(TARGET).elf
avr-objcopy -O ihex $(TARGET).elf $(TARGET).hex
upload: $(TARGET).hex
avrdude -P /dev/ttyACM0 -c arduino -p m328p -U flash:w:$(TARGET).hex
cassini/home/peter/bo/2020ss/bs/20200427> make upload
avr-gcc -Wall -Os -c -mmcu=atmega328p blink-1.c -o blink-1.elf
avr-objcopy -O ihex blink-1.elf blink-1.hex
avrdude -P /dev/ttyACM0 -c arduino -p m328p -U flash:w:blink-1.hex
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "blink-1.hex"
avrdude: input file blink-1.hex auto detected as Intel Hex
avrdude: writing flash (46 bytes):
Writing | ################################################## | 100% 0.02s
avrdude: 46 bytes of flash written
avrdude: verifying flash memory against blink-1.hex:
avrdude: load data flash data from input file blink-1.hex:
avrdude: input file blink-1.hex auto detected as Intel Hex
avrdude: input file blink-1.hex contains 46 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.02s
avrdude: verifying ...
avrdude: 46 bytes of flash verified
avrdude: safemode: Fuses OK (E:00, H:00, L:00)
avrdude done. Thank you.
cassini/home/peter/bo/2020ss/bs/20200427>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment