ich habe das einfrieren/hängen Problem nun weiter analysiert bei dem SAMD21.
Es ist quasi Architekturbedingt, dass kein EEPROM vorhanden ist und die FlashStorage Library verwendet werden muss wird die Größe "#define EEPROM_EMULATION_SIZE" auch als RAM belegt. Dies führt dann dazu, dass nicht mehr genügend RAM frei ist für die initialisierung der Gruppenadressen. Wenn allerdings zu wenig EEPROM Size definiert ist reicht der Speicher dort wieder nicht.
Bei folgender Funktion ist ab einer gewissen Anzahl an Gruppenadressen dann kein RAM mehr verfügbar in der For-Schleife.
bool GroupObjectTableObject::initGroupObjects()
{
if (!_tableData)
return false;
freeGroupObjects();
uint16_t goCount = ntohs(_tableData[0]);
_groupObjects = new GroupObject[goCount];
_groupObjectCount = goCount;
for (uint16_t asap = 1; asap <= goCount; asap++)
{
GroupObject& go = _groupObjects[asap - 1];
go._asap = asap;
go._table = this;
go._dataLength = go.goSize();
go._data = new uint8_t[go._dataLength];
memset(go._data, 0, go._dataLength);
if (go.valueReadOnInit())
go.requestObjectRead();
}
return true;
}
{
if (!_tableData)
return false;
freeGroupObjects();
uint16_t goCount = ntohs(_tableData[0]);
_groupObjects = new GroupObject[goCount];
_groupObjectCount = goCount;
for (uint16_t asap = 1; asap <= goCount; asap++)
{
GroupObject& go = _groupObjects[asap - 1];
go._asap = asap;
go._table = this;
go._dataLength = go.goSize();
go._data = new uint8_t[go._dataLength];
memset(go._data, 0, go._dataLength);
if (go.valueReadOnInit())
go.requestObjectRead();
}
return true;
}


In dem Sinn ist er aktuelle eher ein Projekt für andere.
.
Einen Kommentar schreiben: