Schnellerer Matrixscan

Der Zweck eines Tastaturcontrollers ist es, nach dem Scannen der Tastenmatrix gedrückte Tasten zu melden. Je mehr Scans ein Tastaturcontroller pro Sekunde durchführen kann, desto schneller kann er auf einen Tastendruck reagieren.

Stellenmarkt
  1. Ingenieur (w/m/d) Kommunikationstechnik
    Deutscher Bundestag, Berlin
  2. Beraterinnen / Berater (w/m/d) für den Bereich "Informationssicherheitsbera- tung für den ... (m/w/d)
    Bundesamt für Sicherheit in der Informationstechnik (BSI), Bonn
Detailsuche

Wie viele Scans der Controller durchführt, hängt von mehreren Faktoren ab:

  • Taktrate des Mikrocontrollers. Es lohnt sich zu prüfen, ob das Mikrocontrollermodell höhere Taktraten unterstützt, oder die Tastatur gleich mal auf ein schnelleres Modell aufzurüsten. Die Grenze, ab der sich ein Wechsel nicht mehr lohnt, liegt vermute ich bei ≈100 MHz. Vergleicht man zum Beispiel den Kint36 mit 120 MHz mit dem Kint36 mit 180 MHz, so beträgt der Unterschied von Scan zu Scan 5 μs.
  • Wie viel anderen Code die Firmware neben dem Matrixscan ausführt. Ich empfehle, Zusatzfunktionen in QMK oder sogar selbst geschriebenen Code für die Messung zu deaktivieren.
  • Ob die Scans hintereinander oder zum Beispiel synchronisiert mit USB-Start-of-Frame-Interrupts durchgeführt werden. QMK führt Scans hintereinander durch, daher ist dieser Punkt nur bei anderen Firmwares relevant.
  • Wie lange Entprellzeit eingestellt ist. Eine Verkürzung der Pause erhöht die Scans pro Sekunde, ist die Sleep-Funktion allerdings zu kurz eingestellt, erkennt das Gerät Geistertastendrücke. Mehr dazu im nächsten Abschnitt über Kürzere Pausen.

Einzelheiten zur Messung können im Abschnitt zur Scan-to-Scan-Verzögerung weiter oben nachgelesen werden.

Golem Karrierewelt
  1. AZ-104 Microsoft Azure Administrator: virtueller Vier-Tage-Workshop
    07.-10.11.2022, virtuell
  2. Adobe Premiere Pro Aufbaukurs: virtueller Zwei-Tage-Workshop
    17./18.10.2022, Virtuell
Weitere IT-Trainings

Ich habe auch versucht, die GPIOs schneller zu konfigurieren, um herauszufinden, ob dies die erforderliche Verzögerung nach Loslassen der Taste reduzieren würde, doch leider gab es keinen Unterschied zwischen der Standardeinstellung und der schnellsten Einstellung: Drive Strength 6 (DSE=6), schnelle Slew-Rate (SRE=1), 200 MHz (Speed=3).

Kürzere Pausen

QMK nutzt im Matrixscan-Code die Funktion chThdSleepMicroseconds von ChibiOS. Leider ist die kürzeste Sleep-Dauer dieser Funktion mit 1 ChibiOS-Tick immer noch relativ lang: Die minimale Sleep-Dauer beträgt 100µs, selbst wenn wir eine geringere Dauer einstellen. Das ist bei Controllern wie dem Kint41 ein Problem - hier sollte die Pause nur 10 μs betragen.

Die Länge eines ChibiOS-Ticks hängt davon ab, wie der ARM-SysTick-Timer auf dem von uns verwendeten Mikrocontroller eingestellt ist. Man könnte den SysTick-Timer zwar so konfigurieren, dass er häufiger auslöst, allerdings ist das nicht ratsam: chSysTimerHandlerI() muss in weniger als einem Tick ausführbar sein.

Stattdessen finde ich es einfacher, durch aktives Warten (busy waiting) kurze Verzögerungen zu implementieren, bis das ARM Cycle Counter Register (CYCCNT) anzeigt, dass genügend Zeit vergangen ist. Hier ist ein Beispiel aus keyboards/kinesis/kint41/kint41.c:

  1. // delay_inline sleeps for |cycles| (e.g. sleeping for F_CPU will sleep 1s).
  2. //
  3. // delay_inline assumes the cycle counter has already been initialized and
  4. // should not be modified, i.e. is safe to call during keyboard matrix scan.
  5. //
  6. // ChibiOS enables the cycle counter in chcore_v7m.c.
  7. static void delay_inline(const uint32_t cycles) {
  8. const uint32_t start = DWT->CYCCNT;
  9. while ((DWT->CYCCNT - start) < cycles) {
  10. // busy-loop until time has passed
  11. }
  12. }
  13.  
  14. void matrix_output_unselect_delay(void) {
  15. // 600 cycles at 0.6 cycles/ns == 1&#956;s
  16. const uint32_t cycles_per_us = 600;
  17. delay_inline(10 * cycles_per_us);
  18. }

Natürlich hängt der Wert cycles/ns von der Frequenz ab, mit der unser Mikrocontroller läuft. Dieser Code muss daher für jede Plattform angepasst werden.

Ergebnisse

Wie schneiden die verschiedenen Kinesis-Tastaturcontroller im Vergleich ab, wenn in der QMK-Tastatur-Firmware die niedrigste Eingabelatenz konfiguriert ist? Ich habe die folgenden Werte gemessen:

ModellCPU-GeschwindigkeitUSB-AbfrageintervallScan-to-ScanScanrateCaps-to-Report
kint41600 MHz125 μs181 μs5456 Scans/s930 µs ±17%
kinX120 MHz125 μs213 μs4694 Scans/s953 µs ±15%
kint36180 MHz1000 μs444 μs2252 Scans/s1,97 ms ±15%
kint2pp16 MHz1000 μs926 μs1078 Scans/s3,27 ms ±32%
original60 MHz10000 μs1936 μs516 Scans/s13,6 ms ±21%
Ergebnisse

Die erforderlichen Änderungen, um diese Ergebnisse zu erhalten, sind seit QMK 0.12.38 (2021-04-20) enthalten.

Die Kint41-Unterstützung mit allen erforderlichen Änderungen ist in Arbeit, wird aber kommen.

In den folgenden Abschnitten werden die Ergebnisse im Detail erläutert.

Kint41

Es freut mich, dass der neueste Teensy-4.1-Mikrocontroller die Führung übernimmt! Der Kinx-Controller erreicht zwar ähnliche Werte, doch er war relativ schwierig zu bauen, so dass ihn nur wenige Leute benutzten.

Die wichtigste Verbesserung gegenüber dem Teensy 3.6 ist, dass jetzt USB 2.0 High Speed verfügbar ist; die hohe Taktrate von 600 MHz ermöglicht einen noch schnelleren Matrixscan.

Kinx

In meinem früheren Artikel über den Kinx-Controller habe ich die Scan-Verzögerung von Kinx mit ≈100 μs gemessen. Während meiner Arbeit an diesem Artikel habe ich festgestellt, dass dieser Wert irreführend war: Der Code, der die Messungen durchführte, schaltete Interrupts aus, um nur die Scan-Funktion zu messen. Das ist zwar technisch korrekt, in der Praxis aber nicht sinnvoll, da Interrupts nicht deaktiviert werden sollen. Die Scanfunktion wird so häufig unterbrochen, dass wir einen Wert von ≈208 μs erreichen.

Ich habe außerdem das USB-Abfrageintervall in der Kinx-Firmware korrigiert, da es nicht auf bInterval=1 eingestellt war.

Originaler Kinesis

Der Original-Tastaturcontroller, mit dem die Kinesis-Advantage-2-Tastatur (KB600) ausgestattet ist, verwendet einen AT32UC3B0256-Mikrocontroller, der mit 60 MHz getaktet ist. Hier liegt die gemessene Eingabelatenz viel höher als selbst beim langsamsten Kint-Controller (Kint2pp mit 16 MHz). Was ist da los?

Ohne Zugang zur Firmware können wir auf Folgendes schließen:

1. Kinesis scheint einen eager-Entprellungsalgorithmus einzusetzen (das ist gut!), andernfalls würden wir eine noch höhere Latenz beobachten.

2. Das USB-Abfrageintervall (bInterval=10) ist übermäßig hoch eingestellt, vor allem weil USB Full Speed mit längeren USB-Frames verwendet wird. Ich würde dem Hersteller empfehlen, es auf bInterval=1 zu reduzieren. Sie könnten damit bis zu 10 ms geringere Eingabelatenzen erreichen!

3. Die Matrixscan-Rate ist nur halb so schnell wie bei meinem Kint2pp. Ich bin mir nicht sicher, warum das so ist. Vielleicht macht die Firmware zwischen den Matrixscans noch eine Menge anderer Dinge.

Bitte beachtet jedoch, dass wir die unter Reaktion der Caps-Lock-LED beschleunigen beschriebene Firmware-Änderung nicht auf den originalen Controller anwenden konnten, weshalb die Messabweichung ±21 % beträgt. Diese Abweichung beinhaltet ± 1,9 ms für den Abschluss eines Matrixscans, bevor der LED-Status aktualisiert wird.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Originaler Kinesis-ControllerFazit 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10.  


Aktuell auf der Startseite von Golem.de
Superbase V
Zendures Solarstation mit 6.400 Wh kommt mit hohem Rabatt

Vor dem Verkaufsstart über die eigene Webseite verkauft Zendure seine Superbase V über Kickstarter - mit teilweise fast 50 Prozent Rabatt.

Superbase V: Zendures Solarstation mit 6.400 Wh kommt mit hohem Rabatt
Artikel
  1. Tesla Optimus: Elon Musk zeigt Roboter-Prototyp
    Tesla Optimus
    Elon Musk zeigt Roboter-Prototyp

    Roboter könnten für Tesla aus Sicht von Elon Musk bedeutender werden als Elektroautos. Der Konzern zeigte seinen ersten Roboter-Prototypen.

  2. Microsofts E-Mail: Modern Auth in Exchange macht Admins Arbeit
    Microsofts E-Mail
    Modern Auth in Exchange macht Admins Arbeit

    Ab dem 1. Oktober 2022 müssen Exchange-Clients zwingend Microsofts moderne Authentifizierung nutzen. Das bedeutet Mehrarbeit.
    Eine Analyse von Oliver Nickel

  3. Google: Nutzer fordern Bluetooth-Freigabe für Stadia-Controller
    Google
    Nutzer fordern Bluetooth-Freigabe für Stadia-Controller

    Mit der Einstellung von Stadia können auch Tausende der speziellen Controller ohne ein Update nicht mehr drahtlos genutzt werden.

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • MindStar (u. a. LC-Power LC-M27-QHD-240-C-K 389€) und Damn-Deals (u. a. Kingston A400 240/480 GB 17,50€/32€, NZXT Kraken X73 139€) • Alternate: Weekend Sale • Razer Strider XXL 33,90€ • JBL Live Pro+ 49€ • PCGH-Ratgeber-PC 3000 Radeon Edition 2.500€ • LG OLED65CS9LA 1.699€ [Werbung]
    •  /