Alle öffentlichen Logbücher
Aus C und Assembler mit Raspberry
Dies ist die kombinierte Anzeige aller in C und Assembler mit Raspberry geführten Logbücher. Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seitentitels eingeschränkt werden (Groß-/Kleinschreibung muss beachtet werden).
- 08:59, 8. Aug. 2025 Satyria Diskussion Beiträge erstellte die Seite Speicherverwaltung (PI4) (Die Seite wurde neu angelegt: „Speicherverwaltung“)
- 06:29, 31. Jul. 2025 Satyria Diskussion Beiträge löschte die Seite Interrupt (PI4) (Inhalt war: „Eine neue "boot.S" mrs x1, mpidr_el1 //Lies den Inhalt des Systemregisters MPIDR_EL1 (Multiprocessor Affinity Register) und speichere ihn in Register x1. and x1, x1, #3 cbz x1, 2f 1: // Core 1-3 schlafen legen wfe b 1b Wir werden zunächst keine Multi-CPUs unterstützen. Damit der Raspberry Pi 4 nicht durcheinander kommt, verbieten wir die Ausführung der CPU 1-3. W…“. Einziger Bearbeiter: Satyria (Diskussion))
- 09:40, 28. Jul. 2025 Satyria Diskussion Beiträge erstellte die Seite Interrupt Teil 2 (PI4) (Die Seite wurde neu angelegt: „Im vorhergehenden Kapitel haben wir einen Interrupt für den Timer erstellt. Dies ist zur Zeit auch der einzige, der in unserem System, welches wir entwickeln, zur Verfügung haben. Im nächsten Kapitel wird es dann aufwendig. Wir werden uns um den USB-Eingang kümmern und zunächst einen Treiber für die Tatstatur und anschließend noch auf Mausbewegungen reagieren. Dazu werden wir dann auch Interrupts benötigen, die ausgelöst werden, wenn jemand auf…“)
- 07:45, 25. Jul. 2025 Satyria Diskussion Beiträge erstellte die Seite Beispiel Timer-Interrupt (PI4) (Die Seite wurde neu angelegt: „Nun versuchen wir, einen Timer-Interrupt zu erstellen und verwenden eine Vector-Tabelle, wie diese zuvor beschrieben wurde. Wir verzichten zunächst auf die Gleitkomma-Unterstützung. Wir verwenden die Vectortabelle aus der vorigen Beschreibung. Unterstützen allerdings nur "IRQs" und "Synchronous Exception". Andere Ausnahmen werden in eine Dauerschleife versetzt: <syntaxhighlight lang="asm"> .align 11 .globl VectorTable VectorTable: // Vektoren für EL1…“)
- 07:53, 17. Jun. 2025 Satyria Diskussion Beiträge erstellte die Seite Datei:Logo hexenlaedle.png
- 07:53, 17. Jun. 2025 Satyria Diskussion Beiträge lud Datei:Logo hexenlaedle.png hoch
- 15:56, 19. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Interrupt (PI4) (Die Seite wurde neu angelegt: „Du kannst den Source-Code als ZIP-Datei mit folgenden Link downloaden: https://www.satyria.de/arm/sources/RPI4/C/9.zip ----- {| style="width: 100%; | style="width: 33%;" | < Zurück (Systeminformationen (PI4)) | style="width: 33%; text-align:center;" | < Hauptseite > | style="width: 33%; text-align:right;" | Weiter (xyz) > |}“)
- 08:27, 19. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Systeminformationen (PI4) (Die Seite wurde neu angelegt: „Du kannst den Source-Code als ZIP-Datei mit folgenden Link downloaden: https://www.satyria.de/arm/sources/RPI4/C/8.zip“)
- 07:56, 16. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Interrupts (PI4) (Die Seite wurde neu angelegt: „Was sind Interrupts“)
- 10:23, 11. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Sprungadressen (Labels) (Die Seite wurde neu angelegt: „= Labels im ARM64-Assembler = Labels sind **Bezeichner für Adressen** im Code oder in den Datenabschnitten. Sie dienen vor allem dazu, Sprünge, Verzweigungen und Datenzugriffe lesbar und wartbar zu gestalten. Es gibt zwei Hauptarten von Labels: == 1. Benannte Labels == Ein benannter Label ist ein selbstgewählter Name, der mit einem Doppelpunkt abgeschlossen wird: <syntaxhighlight lang="asm"> loop_start: // Anweisungen b loop_start // Sp…“)
- 19:05, 8. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Übersicht der Fehlercodes (Die Seite wurde neu angelegt: „{| class="wikitable" |+ Übersicht der Fehlercodes |- ! Fehlercode !! Kurzname !! Bedeutung |- | 1 || EPERM || Vorgang nicht zulässig |- | 2 || ENOENT || Datei oder Verzeichnis nicht gefunden |- | 3 || ESRCH || Kein solcher Prozess |} #define EPERM 1 Vorgang nicht zulässig: #define ENOENT 2 No such file or directory: #define ESRCH 3 No such process: #define EINTR 4 Interrupted system call: #define EIO 5 I/O error: #de…“)
- 09:03, 8. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite NEON Coprozessor (Die Seite wurde neu angelegt: „== NEON Coprozessor == Der NEON-Coprozessor, der in ARM64-Prozessoren integriert ist, bietet erweiterte SIMD (Single Instruction, Multiple Data)-Fähigkeiten. Diese ermöglichen es, mehrere Datenpunkte mit einer einzigen Anweisung zu verarbeiten, was die Leistung bei bestimmten Arten von Berechnungen erheblich steigert. NEON-Coprozessor: Überblick Architektur und Integration: SIMD-Fähigkeiten: NEON erweitert die ARMv8-A-Architektur (auch bekannt als A…“)
- 08:48, 8. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Makros in Assembler (Die Seite wurde neu angelegt: „== Makros == .macro Name übergabe1,übergabe2,... Beispiel: .macro speicher wert1,wert2 ldr x0,=\wert1 ldr x1,=\wert2 .endm .global _start _start: speicher buffer1,buffer2 ... .data buffer1: .fill 255,1,0 buffer2: .fill 255,1,0 Beim Aufruf "speicher" wird an dieser Stelle des Codes einfach das Makro eingesetzt. Das definieren des Makros erzeugt keinen Code!“)
- 07:56, 8. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Direktiven (Die Seite wurde neu angelegt: „* .data -> Dezimalzahl: Beginnt mit 1-9 und enthält 0-9 -> Oktalzahl: Beginnt mit 0 und enthält 0-7 -> Binärzahl: Beginnt mit 0b und enthält 0-1 -> Hexadezimal: Beginnt mit 0x und enthält 0-f -> Gleitkommawerte: Beginnt mit 0f oder 0e und enthält die Gleitkomma-Zahl -> Präfix: "-" nimmt das Zweierkomplement, "~" nimmt das Einerkompliment .byte -0xa3, -22, ~0b11010010 Directive Beschreibung .ascii Eine Zeichenfolge in doppelten Anführungszeichen…“)
- 07:50, 8. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Logische Operatoren (Die Seite wurde neu angelegt: „and{s} Xd, Xs, Operand2 eor{s} Xd, Xs, Operand2 orr{s} Xd, Xs, Operand2 bic{s} Xd, Xs, Operand2 | and | eor | orr | bic | Xs | 1100 | 1100 | 1100 | 1100 | Operand2 | 1010 | 1010 | 1010 | 1010 | Ergebnis | 1000 | 0110 | 1110 | 0100 | * CMN Xn, Operand2 -> addiert Operand2 von Xn * TST Xn, Operand2 -> Bitweise AND von Operand2 und Xn“)
- 07:47, 8. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Aliase (Die Seite wurde neu angelegt: „== Aliase == -> Verwendung von Aliase, um den Code besser zu verstehen, Problem beim debuggen, objdump, da eventuell andere Aliases verwendet werden. Die von dir beobachtete Diskrepanz resultiert aus dem Unterschied zwischen der **Assembly-Syntax** und der tatsächlichen **Maschinencodierung** sowie der Art und Weise, wie `objdump` und der Assembler die Befehle interpretieren. Lass uns das Schritt für Schritt erklären: --- ### **1. ARM64-Befehlsalias…“)
- 07:45, 8. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Shiften und Rotation (Die Seite wurde neu angelegt: „ mov x0, #0b00000011 // Lege 3 nach x0 (GDB p /t $x0) lsl x0,x0,#4 // -> 00110000 In der ARM64-Assemblerprogrammierung spielen Shift- und Rotationsoperationen sowie der Umgang mit dem Carry-Flag eine wichtige Rolle für die Manipulation von Bits in Registern. Hier ist eine detaillierte Übersicht: --- ### **1. Shiften (Bitverschiebung)** #### **Logical Shift Left (LSL)** - Verschiebt die Bits eines Registers nach links. -…“)
- 07:43, 8. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Big vs. Little Endian (Die Seite wurde neu angelegt: „== Big vs. Little Endian == -> Reihenfolge der Bytes im Speicher -> ARM-Prozessor erlaubt beide Versionen -> Linux verwendet Little Endian“)
- 07:39, 8. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Diassemblieren (Die Seite wurde neu angelegt: „== Diassemblieren == -> objdump -s -d HelloWorld.o > HelloWorld.diassem Hello.o: file format elf64-littleaarch64 Contents of section .text: 0000 200080d2 e1000058 a20180d2 080880d2 ......X........ 0010 010000d4 000080d2 a80b80d2 010000d4 ................ 0020 00000000 00000000 ........ Contents of section .data: 0000 48656c6c 6f20576f 726c6421 0a Hello World!. Disassembly of section .text: 000000000000…“)
- 11:58, 7. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Gleitkommaoperationen (Die Seite wurde neu angelegt: „In diesem Kapitel werden wir uns mit Gleitkommaoperationen im ARM64-Assembler beschäftigen. Die Schwerpunkte liegen auf den FPU-Registern (Floating Point Unit), einem Überblick über die Register und deren Verwendung in Funktionen. Ebenso werden wichtige Hinweise zur Verwendung der Register für Gleitkommaoperationen gegeben. == FPU-Register: Überblick == Unter ARM64 haben wir eine dedizierte Einheit für Gleitkommaoperationen, die sogenannte FPU (Fl…“)
- 11:39, 7. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Interaktion mit C (Die Seite wurde neu angelegt: „In diesem Kapitel werden wir die Integration von ARM64-Bit-Assembler und C-Programmen beleuchten. Die folgenden Themen werden behandelt: * C-Funktionen aus Assembler aufrufen * Assemblerfunktionen in C aufrufen * Inline-Assembler in C * Bibliotheken verwenden * C-Funktionen aus Assembler aufrufen == C-Funktionen aus Assembler aufrufen == Um C-Funktionen aus Assembler heraus aufzurufen, müssen Sie die folgenden Schritte beachten: * Deklaration der C-F…“)
- 09:38, 7. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite GPIO Programmierung (Die Seite wurde neu angelegt: „GPIO-Programmierung mit ARM64-Bit-Assembler In diesem Kapitel werden wir uns mit der GPIO-Programmierung (General Purpose Input/Output) auf dem Raspberry Pi beschäftigen. Dazu besprechen wir: Grundlagen der GPIO-Programmierung Direkte Steuerung der GPIO-Pins Besondere Register und Konfiguration Grundlagen der GPIO-Programmierung GPIO steht für "General Purpose Input/Output" und bezieht sich auf die universell einsetzbaren Pins auf dem Raspberry Pi, d…“)
- 13:39, 3. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Übersicht der Linux ARM64 Systemaufrufen (Die Seite wurde neu angelegt: „https://gvisor.dev/docs/user_guide/compatibility/linux/arm64/ # Name 0 io_setup 1 io_destroy 2 io_submit 3 io_cancel 4 io_getevents 5 setxattr 6 lsetxattr 7 fsetxattr 8 getxattr 9 lgetxattr 10 fgetxattr 11 listxattr 12 llistxattr 13 flistxattr 14 removexattr 15 lremovexattr 16 fremovexattr 17 getcwd 18 lookup_dcookie 19 eventfd2 20 epoll_create1 21 epoll_ctl 22 epoll_pwait 23 dup 24 dup3 25 fcntl 26 inotify_init1 27 inotify_add_watch 28 inotify…“)
- 13:14, 3. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Systemaufrufe (Die Seite wurde neu angelegt: „Systemaufrufe In diesem Kapitel werden wir uns mit Systemaufrufen unter Linux beschäftigen. Insbesondere werden wir: Eine Einführung in Linux-Systemaufrufe geben, Grundlegende Systemaufrufe wie exit, read, write, open und close kennenlernen und Erklären, wie Parameter übergeben und Rückgabewerte entgegengenommen werden. Einführung in Linux-Systemaufrufe Systemaufrufe sind Schnittstellen, die es Programmen ermöglichen, Dienste und Funktionen des…“)
- 12:35, 3. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite Funktionen und Stack (Die Seite wurde neu angelegt: „Funktionen und Stack In diesem Kapitel werden wir uns mit der Erstellung und Verwendung von Funktionen im ARM64-Assembler beschäftigen. Insbesondere werden wir uns mit den folgenden Themen befassen: Funktion aufrufen und Rückkehr Funktionsparameter und Rückgabewerte Verwendung des Stacks für lokale Variablen und Funktionsaufrufe Regeln für das Aufrufen von Funktionen (AAPCS) Funktion aufrufen und Rückkehr Eine Funktion im ARM64-Assembler wird dur…“)
- 12:42, 1. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite General Purpose I/O(e) (Die Seite wurde neu angelegt: „In this chapter, I will discuss the GPIO pins that the Raspberry Pi can use for communication with the outside world. Ideally, a pin is connected to an LED on the board so that we can initially forego external hardware and effectively see a result. Among bare-metal programmers, this is closest to a "Hello World" program. In the first subchapter, we will make the LED blink. In the next one, we will try to bring some structure to the source code and then im…“)
- 12:17, 1. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite The First Program (Die Seite wurde neu angelegt: „Our first program will initially do nothing; it will simply run an infinite loop. We use it as a foundational building block to create all further experiments. I will first describe how such a program is created, what peculiarities there are, how it is compiled, and then how it is executed. == Creating the Source Code == First, we open our text editor to write our first assembly program. <syntaxhighlight lang="asm"> /* The first program 13.10.2020 www.s…“)
- 12:06, 1. Apr. 2025 Satyria Diskussion Beiträge erstellte die Seite System Programming / Bare Metal (Die Seite wurde neu angelegt: „In this course, we will focus on system programming for a Raspberry Pi. I will repeatedly emphasize that we have to program everything from the ground up, and fundamentally, the system knows nothing except where certain functions lie within the Raspberry's address space. These functions, referred to as registers on the Raspberry Pi, directly interact with the hardware. Certain values stored there directly interface with the hardware. We can use these regi…“)
- 11:27, 31. Mär. 2025 Satyria Diskussion Beiträge erstellte die Seite Bare-Metal Debugging with JTAG and RPI 4 (Die Seite wurde neu angelegt: „Introduction: When developing software, a debugger is often needed to find and fix errors. A common debugger is GDB. As long as the program can be started from an environment like Linux or Windows, this debugger can be used directly. However, in bare-metal development, things are somewhat more challenging because the usual operating system environment is absent. In such cases, emulators or special hardware solutions are necessary. Since emulators usually…“)
- 14:33, 13. Mär. 2025 Satyria Diskussion Beiträge erstellte die Seite Programmierumgebung erstellen unter Linux (Die Seite wurde neu angelegt: „HIer ist eine Anleitung, wie es hier im Beispiel unter Linux Mint funktioniert. Ich habe hierfür Linux Mint in der Version 22.1 verwendet. Zunächst sollte das System auf den aktuellen Stand sein. Dazu wird die Aktualiesierungverwaltung verwendet. Crosscompiler installieren: apt://gcc-aarch64-linux-gnu“)
- 13:16, 11. Mär. 2025 Satyria Diskussion Beiträge löschte die Seite Allzweckregister, Nullregister und Stapelzeiger (Inhalt war: „Die 31 Allzweckregister werden R0-R30 genannt. Das Register R31 ist ein spezielles Register, das entweder den aktuellen Stapelzeiger (Stack Pointer, SP) oder das Nullregister (Zero Register, ZR) darstellt, abhängig vom Kontext der Verwendung. Wenn die Register in einer bestimmten Befehlsvariante verwendet werden, müssen sie qualifiziert sein, um die Operandendaten- und Befeh…“. Einziger Bearbeiter: Satyria (Diskussion))
- 20:41, 9. Mär. 2025 Satyria Diskussion Beiträge erstellte die Seite Datei:Verbindung.png
- 20:41, 9. Mär. 2025 Satyria Diskussion Beiträge lud Datei:Verbindung.png hoch
- 20:09, 9. Mär. 2025 Satyria Diskussion Beiträge erstellte die Seite Datei:OpenOcd.png
- 20:09, 9. Mär. 2025 Satyria Diskussion Beiträge lud Datei:OpenOcd.png hoch
- 16:34, 7. Mär. 2025 Satyria Diskussion Beiträge erstellte die Seite Bare-Metal Debugging (JTAG, RPI 4) (Die Seite wurde neu angelegt: „Linux“)
- 09:14, 5. Mär. 2025 Satyria Diskussion Beiträge erstellte die Seite Printf in BareMetal (PI4) (Die Seite wurde neu angelegt: „== printf == Bis hierhin haben wir vieles selbst gemacht. Wir haben einen Weg gefunden, wie der Raspberry Pi Texte auf den Bildschirm anzeigen kann. Allerdings hat unsere `DrawString`-Funktion nicht viele Vorteile. Viele kennen wahrscheinlich die `printf`-Funktion aus der Programmiersprache C. Diese Funktion kann formatierte Ausgaben erzeugen, bei denen auch Variablen eingebunden werden können. Da wir in einer Umgebung ohne Betriebssystem programmieren…“)
- 09:09, 5. Mär. 2025 Satyria Diskussion Beiträge erstellte die Seite Das Terminal in C (PI4) (Die Seite wurde neu angelegt: „== Das Terminal == Nachdem wir nun Zeichen auf den Bildschirm anzeigen können, werden wir ein Terminal bauen. Ein Terminal ist ein Bereich auf dem Bildschirm, in dem Texte angezeigt werden können und später auch Eingaben erfolgen können. Ein Beispiel für ein Terminal ist die Eingabeaufforderung, die beim Starten von Linux erscheint. == Wie sieht ein Terminal aus? == Zuerst müssen wir uns überlegen, wie das Terminal aussehen soll. Da wir die Bild…“)
- 08:35, 5. Mär. 2025 Satyria Diskussion Beiträge erstellte die Seite Chars in C (PI4) (Die Seite wurde neu angelegt: „== Zeichnen von Zeichen auf dem Raspberry Pi == Nachdem wir eine Funktion zum Setzen einzelner Pixel implementiert haben, möchten wir nun dem Raspberry Pi beibringen, Text auf dem Bildschirm anzuzeigen. Texte bestehen aus Schriftzeichen, die der Computer nicht von Natur aus kennt. Ähnlich wie ein Mensch muss der Computer zunächst "lernen", wie jedes einzelne Zeichen aussieht, bevor er es darstellen kann. Diese Zeichen sind in einem bestimmten Code defi…“)
- 12:24, 26. Feb. 2025 Satyria Diskussion Beiträge erstellte die Seite Grafik in C (PI4) (Die Seite wurde neu angelegt: „Bisher sind die Ergebnisse, die wir bisher programmiert haben, nicht allzu aufwendig gewesen. Bisher konnte der Raspberry nicht wirklich mit der Ausenwelt kommunizieren. Es war "nur" eine LED, die geleuchtet oder geblinkt hat. Natürlich ist mit diesem Wissen bisher, jeder Zeit möglich, den GPIO entsprechend zu programmieren, so dass viel mehr gemacht werden kann, als diese Beispiele bisher zeigten. Im Internet gibt es viele Beispiele, für welche Dinge…“)
- 12:20, 26. Feb. 2025 Satyria Diskussion Beiträge erstellte die Seite Fehlerbehandlung in C (PI4) (Die Seite wurde neu angelegt: „Da wir bisher keine Möglichkeit haben, uns gezielt Informationen anzuzeigen, nutzen wir die LED, um zu erkennen, wenn ein Fehler auftritt. Dazu erstellen wir eine Funktion, die mithilfe der LED einen Fehlercode anzeigt. Wir erweitern dafür unseren „led.c“-Code um folgende Funktion: <syntaxhighlight lang="C"> void LED_Error(u32 errorcode) { while (TRUE) { for (u32 z = 0; z < errorcode; z++) { LED_on(); // LED e…“)
- 09:19, 26. Feb. 2025 Satyria Diskussion Beiträge erstellte die Seite Lass die LED leuchten in C (PI4) (Die Seite wurde neu angelegt: „Unser jetziges Ziel ist es, die fest eingebaute LED des Raspberry Pi zum Blinken zu bringen. Ich werde jeden Schritt erklären, warum er in diesem Projekt so implementiert wurde. === Vorbereitung des Verzeichnisses === Erstelle zunächst ein neues Verzeichnis, z.B. LED, und platziere darin das Makefile und die Datei linker.ld. Erzeuge auch das Verzeichnis include innerhalb von LED, um unsere Header-Dateien zu organisieren. === Programmierung des Startv…“)
- 08:56, 26. Feb. 2025 Satyria Diskussion Beiträge erstellte die Seite Unser erstes Programm in C (PI4) (Die Seite wurde neu angelegt: „Die Programmierung des Raspberry Pi 4 wird ähnlich durchgeführt, wie die Programmierung des Raspberry's Pi 5. Ich habe hierzu den den Kurs dort herauskopiert und es entsprechend angepasst. Ich habe es aus den Gründen gemacht, da ich USB unterstützen möchte und es inzwischen mehr Informationen zum RPI4 gibt, als für den RPI5. Idealerweise hatte ich dort ein Terminal programmiert, welches ich sehr gut zum Debuggen verwenden kann. In diesem Sinne, kan…“)
- 13:24, 6. Dez. 2024 Satyria Diskussion Beiträge erstellte die Seite Programmablauf steuern (Die Seite wurde neu angelegt: „== Bedingungsloser Sprung == -> b label * Bedingungsflags negativ: N gesetzt, wenn Ergebnis negativ ist zero: z gesetzt wenn Ergebnis null ist carry: c gesetzt, wenn es einen Überlauf gab. add -> wenn größer als Zahlenbereich (Überlauf), Subtraktion gesetzt, wenn Ergebnis keine Ausleihe. bei Verschieben letzte Bit herausgeschoben. overflow: o gesetzt bei addition und subtraktion, wenn Ergebnis größer oder gleich 2^31, oder kleiner -2^31 Flags…“)
- 15:47, 1. Dez. 2024 Satyria Diskussion Beiträge erstellte die Seite Datei:Gdb3.png
- 15:47, 1. Dez. 2024 Satyria Diskussion Beiträge lud Datei:Gdb3.png hoch
- 15:46, 1. Dez. 2024 Satyria Diskussion Beiträge erstellte die Seite Datei:Gdb2.png
- 15:46, 1. Dez. 2024 Satyria Diskussion Beiträge lud Datei:Gdb2.png hoch
- 15:46, 1. Dez. 2024 Satyria Diskussion Beiträge erstellte die Seite Datei:Gdb1.png
- 15:46, 1. Dez. 2024 Satyria Diskussion Beiträge lud Datei:Gdb1.png hoch