Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Das delay() soll bei schnellen Änderungen die durch slider o.ä. in der Visu bedingt sind sicherstellen, das das Flash nicht zu häufig beschrieben wird. Leider gibt es derzeit keine Funktion die bei Beendigung der Firmware aufgerufen wird, sonst könnte man da noch mal sicherstellen, das alles im Flash ist bevor ein Neustart passiert.
In meinem Testprogramm war es umgekehrt, ich musste ein
if delay(change(String1),xxxu64) then {......
einfügen, um sicherzustellen, dass String1 durch "stringset" auch verändert war bevor ich String1 in den Flashspeicher geschrieben habe. "stringset" wird offensichtlich "asynchron" ausgeführt und dauert länger als ein Zyklus. Trotzdem hat mich das delay() in deinem Makro in richtige Richtung gelenkt.
In meinem Testprogramm war es umgekehrt, ich musste ein
if delay(change(String1),xxxu64) then {......
einfügen, um sicherzustellen, dass String1 durch "stringset" auch verändert war bevor ich String1 in den Flashspeicher geschrieben habe. "stringset" wird offensichtlich "asynchron" ausgeführt und dauert länger als ein Zyklus.
Ich denke das ist eher das change() und das einen Zyklus braucht (siehe Handbuch). Oder meinst Du was anderes?
Ich denke das ist eher das change() und das einen Zyklus braucht (siehe Handbuch). Oder meinst Du was anderes?
Ich meine etwas anderes. In meinem Testprogram (siehe mein post vom 3.7) habe ich folgenden Programmteil ausgeführt
Code:
if change(Starttest) and Starttest==EIN then {
stringset(String1,insert1,0u16);
stringset(String1,insert2,4u16);
writestatus=writeflash(String1,1u16);
}endif
Das "writeflash" hat erst dann den veränderten "String1" geschrieben nachdem ich mit "if delay(change(String1),xxxu64)" auf Fertigstellung gewartet habe. Ich gehe davon aus, dass change() ohne das delay() auch funktioniert hätte.
Ich meine etwas anderes. In meinem Testprogram (siehe mein post vom 3.7) habe ich folgenden Programmteil ausgeführt
Es ist nicht die stringset Funktion an sich, sondern die Reihenfolge bei der Verarbeitung. Offenbar wird die Queue der Flashbearbeitung vor der stringset abgearbeitet. Ich werde mal prüfen, was man mit dem Compiler fixen kann.
Siehe hier:
[highlight=epc]
a='1/2/3'c14
Starttest=AUS
String1=$aaa$
String2=$$
insert1=0x11223344u32
insert2=0x55667788u32
if after(systemstart(),1000u64) then {
String1=$r$+$hj$;
stringset(String1,insert1,0u16);
stringset(String1,insert2,4u16);
write('1/2/3'c14,convert(String1,$$c14));
writeflash(String1,50u16)
}endif
if after(systemstart(),2000u64) then {
readflash(String2,50u16);
write('1/2/3'c14,convert(String2,$$c14))
}endif
[/highlight]
Hier ist deutlich, dass die Stringzuweisung/Verkettung noch vor dem writeflash ausgeführt wurde, aber die stringset-Funtlion erst danach (also während einer Verarbeitung).
Es ist nicht die stringset Funktion an sich, sondern die Reihenfolge bei der Verarbeitung.
Genau das meinte ich als ich einem meiner früheren posts von "asynchron" sprach.
Die Kombination "stringset" und "writeflash" scheint aber nicht die einzige Kombination zu sein, bei der dieses Phänomen auftritt. Ich habe mit einer Folge von "stringcasts" und "mpchart" gerade das Problem, dass mpchart nicht alles darstellt was "stringcast" offensichtlich übergibt. Ich bin aber überzeugt, dass ich die Probleme mit change(), after(), delay() irgendwie lösen kann. Bin nur noch nicht dazu gekommen.
Genau das meinte ich als ich einem meiner früheren posts von "asynchron" sprach. Die Kombination "stringset" und "writeflash" scheint aber nicht die einzige Kombination zu sein, bei der dieses Phänomen auftritt.
Genau betrachtet versuchen wir diese "Seiteneffekte" des Unterbaus des EibPC vor dem Anwender zu verbergen. Aber man findet da immer wieder mal eine Lücke.
Ich meine etwas anderes. In meinem Testprogram (siehe mein post vom 3.7) habe ich folgenden Programmteil ausgeführt
Code:
if change(Starttest) and Starttest==EIN then {
stringset(String1,insert1,0u16);
stringset(String1,insert2,4u16);
writestatus=writeflash(String1,1u16);
}endif
Das "writeflash" hat erst dann den veränderten "String1" geschrieben nachdem ich mit "if delay(change(String1),xxxu64)" auf Fertigstellung gewartet habe. Ich gehe davon aus, dass change() ohne das delay() auch funktioniert hätte.
Zur Info:
Ich hab das Verhalten eben durch einen Umbau im Compiler verändert. Im nächsten Release wird das dann wohl so wie ursprünglich gedacht gehen.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar