Calliope 2 stürzt ab bei bestimmten Array und Buffer Größen

Fortsetzung der Diskussion von Maximale Array-Größe:

Seit der Diskussion im August haben sich die Einstellungen geändert: Es gibt z.B. den Bluetooth Schalter nicht mehr. Der wäre hierfür entscheidend.

Bei Calliope 2.x mit der Standard-Konfiguration in Projekteinstellungen pxt.json:

    "yotta": {
        "config": {
            "microbit-dal": {
                "bluetooth": {
                    "pairing_mode": 1,
                    "partial_flashing": 1,
                    "dfu_service": 1,
                    "event_service": 1,
                    "device_info_service": 1
                },
                "stack_size": 2048,
                "gatt_table_size": "0x800",
                "sram_end": "0x20008000",
                "RAM_SIZE": "\"32K\""
            }
        }
    }

funktioniert

let arrayNumber: number[] // max. 32 Elemente im Array
arrayNumber = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

let bu = pins.createBuffer(240); // max. Buffer.length 240

bei 33 Array-Elementen oder Buffer.length 241 stürzt Calliope 2.x sofort nach Übertragung des Programms ab. Das ist konstant und passiert immer bei genau diesen Werten.
Es ist aber möglich, viele Arrays oder Buffer von jeweils bis zu dieser Größe 32 bzw. 240 gleichzeitig zu definieren.

let size = 240
let arrayBuffer: Buffer[] // Array aus 8 Buffern je 240 Byte
arrayBuffer = [
Buffer.create(size),
Buffer.create(size),
Buffer.create(size),
Buffer.create(size),
Buffer.create(size),
Buffer.create(size),
Buffer.create(size),
Buffer.create(size)
]

let array1 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
let array2 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
let array3 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
let array4 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
let array5 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
let array6 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
let array7 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
let array8 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

Ist irgendwo nur 1 Element zu viel (241 oder 33), stürzt Calliope 2.x sofort nach Übertragung des Programms ab.

Wenn es doch irgendwo funktioniert, dann ist die Konfiguration anders. Geladene Erweiterungen haben eine eigene Datei pxt.json. Darin versteckt sich z.B.:

    "yotta": {
        "config": {
            "microbit-dal": {
                "bluetooth": {
                    "enabled": 0
                }
            }
        }
    }

Dieser Ausschnitt ist zum Beispiel in der Erweiterung radio enthalten, welche die Blöcke Funk bereit stellt.
Das wirkt auf die Projekteinstellungen, ohne dass es dort sichtbar ist.

Die Zeile

"enabled": 0

kann man auch oben in die Projekteinstellungen hinzu fügen, ohne eine Erweiterung zu laden. Das Ergebnis ist, dass die Array- und Buffer-Grenzen aufgehoben sind. Es sind Buffer mit 1025 und mehr Bytes sowie Arrays mit beliebiger Größe (eine Grenze habe ich nicht erreicht) möglich.

Die Array Grenze von 32 und die Buffer Grenze von 240 bei Calliope 2.x lässt sich nicht mit zu wenig Speicherplatz begründen. Dann wären nämlich nicht (mit der selben Konfiguration) 8 und mehr verschiedene Arrays und Buffer bis zu dieser Grenze gleichzeitig möglich.

Mehr Speicherkapazität in der Hardware löst das Problem nicht, weil es in der Software liegt.

Ich möchte das als Fehler melden und eine Lösung beantragen.

FG Lutz

1 „Gefällt mir“

Antrag abgelehnt?

Ich habe mit der aktuellen Version MakeCode 8.1.7, Hardware v2, ein Array auf Calliope 2.1 übertragen.

Und festgestellt, dass der selbe Fehler immer noch passiert.

Gibt es eine Liste, welche Fehler in MakeCode bekannt sind und welche davon behoben wurden?

Und wird Calliope v1 und v2 in neuen MakeCode Versionen noch unterstützt, oder hat man das offiziell aufgegeben?

Das geht ganz einfach hier: GitHub · Where software is built

Das Problem ist uns auch ehrlicherweise bislang nur von drei Personen berichtet worden…
Es gibt ja aktuell aber zwei Lösungen:

  1. Du kannst die Einstellung in die pxt.json deiner Erweiterung integrieren, dann klappt es vermutlich auch so schon.
    Ich denke, dass diese Änderung in MakeCode durch Microsoft Research an dieser Stelle nicht so wahrscheinlich ist, weil dann ja Bluetooth deaktiviert wird und das betrifft einfach viel mehr Leute als die Anzahl von 32 im Array. Ohne es zu wissen, gehe ich einfach mal davon aus, dass 90% der Arrays einfach geringer sind und deshalb wenige diese Probleme haben (zu uns sind jedenfalls nur diese beiden Supportanfragen gelangt). Man kann das Problem sicherlich auch ohne die Änderung in Bluetooth lösen, da wird es vermutlich aber recht aufwändig und dementsprechend eher unwahrscheinlich.
  2. Du nutzt einfach eine ältere Version von MakeCode, dort sollte der Schalter doch enthalten sein.

Ich finde eigentlich, dass wir einen guten Support für die alten Calliope mini Versionen machen. Die Unterstützung für Calliope mini V1 und V2 haben wir nicht aufgegeben (nur, wo es technisch nicht funktioniert, mussten wir sie ausklammern), der allerneuste Calliope mini V1 ist allerdings mindestens 4,5 Jahre alt und der neuste Calliope mini V2 etwa 2,5 (die Verfügbarkeit beider Geräte haben wir zum Ende hin auslaufen lassen, also dürften die meisten deutlich älter sein). Der Calliope mini V3 ist dazu aktuell die (mit Abstand) meist genutzte Version!