Vielen herzlichen Dank, Asa!
Dank deinen Bemühungen kann ich das Phänomen nun nachvollziehen!
Es tritt anscheinend auf, wenn ChannelListSaver in Slot 0 startet. Was durch deinen Versuchsaufbau getriggert wird (als erstes TAP startet BackupSettings, dieses ist solange aktiv, bis die anderen AutoStart-TAPs geladen wurden, und beendet sich dann - so dass Slot 0 frei ist).
In dieser Situation wird der CLS am Ende der TAP_Main() Methode nicht korrekt beendet.
Wenn man ein zusätzliches TAP_Exit auslöst (entweder im Code, oder durch manuelles Schließen über die TAP-Übersicht), dann wird CLS zwar beendet - dazu aber ein weiteres TAP. In meinen Experimenten traf es meist als erstes TimerDiags, danach TMSRemote. Ebenso kann es dann zum Crash kommen.
Auch mit dem Minimal-Beispiel-TAP tritt das Phänomen (reproduzierbar) auf.
Was bedeutet: Josef hat recht - es liegt definitiv an der Methode, die die *.std exportiert. Lustigerweise ist diese allerdings fast 100% identisch mit der in BackupSettings...
Entweder hier liegt (mal wieder) ein lustiger neuer Firmware-Bug vor, oder irgendwas läuft beim Abspeichern der std falsch...
Leider habe ich aktuell nicht die leiseste Ahnung, was genau es sein könnte. Womöglich hat Alex noch eine schlaue Idee? *hoffnungsvoll schau*
Das ist der Code, der die std speichert. Aufrufen dieser Funktion (egal ob aus der TAP_Main oder dem EventHandler, egal ob TSR oder Non-TSR) scheint - bei Ausführung in Slot 0 - zur endlosen Ausführung des TAPs zu führen.
Code: Alles auswählen
bool HDD_ImExportChData(char *FileName, char *AbsDirectory, bool Import)
{
// static char AbsDir2[FBLIB_DIR_SIZE];
static tDirEntry *_hddTapFolder = NULL;
tDirEntry FolderStruct, OldTapFolder;
char AbsFileName[FBLIB_DIR_SIZE];
bool ret = FALSE;
TRACEENTER();
HDD_TAP_PushDir();
WriteLogMCf(PROGRAM_NAME, (Import ? "[Action] Importing '%s' (System)..." : "[Action] Exporting '%s' (System)..."), FileName);
WriteLogMC(PROGRAM_NAME, "----------------------------------------");
TAP_SPrint(AbsFileName, sizeof(AbsFileName), "%s/%s", AbsDirectory, FileName);
// Create/empty the file, if not exists
if(!Import)
fclose(fopen(AbsFileName, "w"));
//Get the current TAP folder variable
if(!_hddTapFolder)
{
_hddTapFolder = (tDirEntry*)FIS_vHddTapFolder();
if(!_hddTapFolder)
{
TRACEEXIT();
return FALSE;
}
}
//Initialize the directory structure
memset(&FolderStruct, 0, sizeof(tDirEntry));
FolderStruct.Magic = 0xbacaed31;
//Save the current directory resources and change into our directory (current directory of the TAP)
ApplHdd_SaveWorkFolder();
// strcpy(AbsDir2, &AbsDirectory[1]); // must be static! Do not include the leading slash! --> wird aber nur mit Konstante aufgerufen
if (!ApplHdd_SelectFolder(&FolderStruct, &AbsDirectory[1]))
{
ApplHdd_SetWorkFolder(&FolderStruct);
memcpy(&OldTapFolder, (void*)_hddTapFolder, sizeof(OldTapFolder));
memcpy((void*)_hddTapFolder, &FolderStruct, sizeof(FolderStruct));
if (Import)
ret = Appl_ImportChData(FileName);
else
ret = Appl_ExportChData(FileName);
memcpy((void*)_hddTapFolder, &OldTapFolder, sizeof(OldTapFolder));
}
ApplHdd_RestoreWorkFolder();
if (ret)
{
if (!Import)
HDD_SetFileDateTime(FileName, AbsDirectory, Now(NULL));
WriteLogMCf(PROGRAM_NAME, (Import ? "--> Import '%s' successful." : "--> Export '%s' successful."), FileName);
}
else
{
if(!Import)
remove(AbsFileName);
WriteLogMCf(PROGRAM_NAME, (Import ? "--> Error during import '%s'!" : "--> Error during export '%s'!"), FileName);
}
HDD_TAP_PopDir();
TRACEEXIT();
return ret;
}