Altifigence Academy

15 / 24 · Übung

Praktikum: 1024 Wartefolgen prüfen

Prüfen Sie Halten, Ersetzen und Leeren mit allen Ready-Folgen über zehn Takte.

Werte und Reihenfolge während Wartezyklen erhalten

Erstellen Sie elastic-model.mjs manuell, speichern Sie den folgenden Code und führen Sie node elastic-model.mjs aus. Der Sender bietet vier geordnete Elemente an und rückt nur bei Übernahme weiter. Musterbit Null steuert Flanke 0, Bit eins Flanke 1 und so weiter. Durchlaufen Sie alle 1024 Zehn-Bit-Ready-Muster und halten Sie anschließend den Empfänger bereit, um ausstehende Arbeit zu leeren.

Geben Sie den alten Platzinhalt aus, bevor Sie über den Ersatz entscheiden. Ein leerer Platz übernimmt auch bei wartendem Empfänger ein Element. Ein voller, angehaltener Platz kann den Sender nicht weiterlaufen lassen. Würde next an jeder Flanke erhöht, würden nicht übernommene Elemente verworfen und der Testsender wäre fehlerhaft, selbst wenn der Puffer korrekt wäre.

javascript
import assert from 'node:assert/strict';
const values = [0, 9, 255, 12];
let deliveries = 0;
for (let pattern = 0; pattern < 1024; pattern++) {
  let slot = null, next = 0;
  const seen = [];
  for (let edge = 0; edge < 20; edge++) {
    const ready = edge >= 10 || ((pattern >>> edge) & 1) === 1;
    const old = slot;
    const inReady = old === null || ready;
    if (old !== null && ready) seen.push(old);
    if (inReady) {
      slot = next < values.length ? { tag: next, y: values[next] } : null;
      if (slot !== null) next++;
    } else {
      assert.deepEqual(slot, old);
    }
    assert.equal(next - seen.length, Number(slot !== null));
  }
  assert.deepEqual(seen, values.map((y, tag) => ({ tag, y })));
  assert.equal(slot, null);
  deliveries += seen.length;
}
console.log(`ELASTIC PASS: 1024 patterns, ${deliveries} deliveries`);

Beim Muster Null wartet der Empfänger an den ersten zehn Flanken. Tag0,y0 tritt an Flanke 0 in den leeren Platz ein und bleibt dort bis Flanke 9. Flanke 10 gibt es aus und speichert tag1,y9. Tags 1,2,3 werden dann an Flanke 11,12,13 übertragen. Eine gültige Null darf nicht mit null verwechselt werden. Erfolg meldet 1024 Muster und 4096 Ausgaben.

Übernommen minus ausgegeben entspricht nach jeder Flanke der aktuellen Belegung. Diese lokale Bilanz grenzt Fehler früher ein als ein abschließender Ausgabevergleich. Halteprüfungen erfassen die Nutzdatenerhaltung, wobei der Vergleich mit einer realen Implementierung deren tatsächliche Ausgabe beobachten muss und nicht nur die unveränderte Variable dieses Modells. Die vollständige Prüfung von Zehn-Takt-Mustern ist ein begrenzter Test, kein Beweis für jede mögliche Wartezeit. Ein späterer Abschluss setzt zusätzlich voraus, dass der Empfänger irgendwann bereit wird; bei unbegrenztem Rückstau ist Erhaltung erforderlich, keine garantierte Ausgabe.

Selbst ausprobieren

Wie weit rückt das next des Senders beim Muster Null an Flanke 0 bis 9 vor? Wie groß sind Belegung und next-seen.length nach Flanke 10?

Erklärung lesen

Nur das Element an Flanke 0 wird übernommen, also next=1. An Flanke 10 wird tag0 übertragen und tag1 tritt ein: next=2, seen.length=1 und sowohl Differenz als auch Platzbelegung sind eins.

Lesson files

elastic-model.mjs ↓

Deine Auswahl gilt für diesen Browser. Du kannst sie jederzeit in der Fußzeile ändern.