![]() |
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Also das ist der Befehl, wie er im Delphi-Disassembler angezeigt wurde.
EAX enthält dabei die Adresse im Stack, die von einer Funktion vorher ermittelt wurde und ESI den Wert, der da hin geschrieben werden soll. Das ganze sieht im Delphi-Code so aus:
Delphi-Quellcode:
Push gibt als Result die Stack-Adresse (von 0 an gezählt) zurück und
Procedure TRutisStack.PushCardinal(Val : Cardinal);
Begin PCardinal(Data[Push(4)])^ := Val; End; die Array-property Data gibt zu einer Stack-Adresse die absolute Adresse als Pointer zurück. Der gesamte ASM Code sieht dann so aus:
Code:
MFG
Rutis_Defs.pas.1628: Begin
00493D48 53 push ebx 00493D49 56 push esi 00493D4A 8BF2 mov esi,edx 00493D4C 8BD8 mov ebx,eax Rutis_Defs.pas.1629: PCardinal(Data[Push(4)])^ := Val; 00493D4E 33C9 xor ecx,ecx 00493D50 BA04000000 mov edx,$00000004 00493D55 8BC3 mov eax,ebx 00493D57 E804FCFFFF call TRutisStack.Push 00493D5C 8BD0 mov edx,eax 00493D5E 8BC3 mov eax,ebx 00493D60 E887F2FFFF call TRutisStack.GetData 00493D65 8930 mov [eax],esi Rutis_Defs.pas.1630: End; 00493D67 5E pop esi 00493D68 5B pop ebx 00493D69 C3 ret |
Re: RUTIS Engine (Scripting) [WinCE spinnt]
EDIT: Sry Doppelpost - war ein Versehen
Ich habe mal (wieder) eine kleine Testanwendung zu diesem Problem programmiert: Dabei handelt es sich um folgenden simplen Code:
Delphi-Quellcode:
Wenn man nun ins Editfeld für die Adresse Werte wie 0,4,8,12,... eingibt, lassen sich die Werte problemlos in Data eintragen.
var
Data : Array [0..128] of Byte; procedure TForm1.BtnWriteClick(Sender: TObject); var adr,val: Cardinal; begin adr := StrToInt(EdAddress.Text); val := StrToInt(EdValue.Text); PCardinal(@Data[adr])^ := val; end; procedure TForm1.BtnReadClick(Sender: TObject); var adr,val: Cardinal; begin adr := StrToInt(EdAddress.Text); val := PCardinal(@Data[adr])^; EdValue.Text := IntToStr(val); end; Sobald man aber von diesem Raster abweicht (also z.B. als Adresse 1 eingibt), wird das Programm umgehend ohne jegliche Fehlermeldung terminiert. MFG |
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Ich vermute mal, dass Arrays unter WinCE anders verwaltet werden. Du gehst bei dir davon aus, dass im Speicher immer alle Felder direkt hintereinander stehen, anscheinend ist das unter WinCE nicht so. Du könntest es mal mit dem Keyword packed probieren. Wenn das nicht hilft, wirst du dir eine andere Möglichkeit einfallen lassen müssen, um Speicher zu reservieren.
|
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Nein, die Daten liegen alle hintereinander im Speicher.
Denn das Problem tritt auch auf, wenn ich z.B. anstatt eines Arrays ein Record nehme oder auch nur einen Int64 Wert und da ein Cardinal außerhalb des Rasters abfrage. MFG |
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Wie ist es, wenn du Daten aus einem Memorystream liest?
|
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Das ist eine sehr gute Frage.
Nur... Ein Memory-Stream wär viel langsamer als Stack und es fehlt eine Wichtige Eigenschaft: Der Speicherbereich vom Stack darf seine Adresse nicht verändern - also nicht durch ein Realloc verschoben werden (wegen Pointern). ... Ne mir fällt grad ein das geht nicht. Der kopiert ja bei einem Stream ja einfach einzeln die Bytes. Das könnte ich ja genau so gut mit meinem Stack machen. Dann würde das auch vermutlich funktionieren. Jedoch wär das ja viel langsamer und sehr uneffektiv. MFG |
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Das sollte auch weniger ein Vorschlag zur Nutzung des MemoryStreams sein, sondern war eine Frage bzw. eine dezente Anregung. Denn beim Memorystream muss es ja zwangsläufig möglich sein, unabhängig vom Raster Daten einzulesen. Falls es dort funktioniert (was es ja wie gesagt eigentlich muss), könnte man sich ja mal anschauen, wie es dort gelöst wurde.
Nebenbei: Wieso sollte der Stream im Gegensatz zum Array einfach nur so zum Spaß die Position seines alloziierten Speicherbereichs verändern? Solange du die Größe nicht veränderst, bleibt der Streaminahlt am gleichen Ort. Umgekehrt kann auch das Array verschoben werden, wenn du die Größe veränderst. |
Re: RUTIS Engine (Scripting) [WinCE spinnt]
1.) Ich hab doch gesagt wie das beim Stream läuft:
Es werden x Bytes von A nach B kopiert - also alle Bytes einzeln. Das funktioniert auch bei meinem Stack ja problemlos. Aber ich möchte ja direkt auf die Variablen zugreifen, die Per pointer ansprechen usw. und nicht immer byteweise kopieren, verarbeiten und wieder byteweise abspeichern. 2.) Wenn z.B. mehr Variablen angelegt werden oder eine Funktion sich sehr oft rekursiv aufruft, so muss der Stack vergrößert werden. Und das passiert bei Speicherbereichen normalerweise über ein ReallocMem. Lässt der Speicher sich aber an seinem aktuellen Speicherort nicht mehr weiter vergrößern, so muss der ja verschoben und sein inhalt kopiert werden. Das darf aber in RUTIS nicht passieren. MFG |
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Hallo,
ich beschäftige mich zwar nicht mt der WinCE-Programmierung, kenne das Problem aber aus der Zeit der "alten" Motorola-CPUs M680xx. Bei ihnen waren Wort- und Doppelwort-Zugriffe nur auf geraden Adressen möglich. Vielleicht ist dies ja auch hier die Ursache des Fehlers: ![]() Gruß Hawkeye |
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Zitat:
CU, der Poelser |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz