Hallo!
Ich würde gerne in C eine Abfolge von Befehlen für einen Betriebsmodus
in einem Array zusammenfassen. Das Problem: Die Anzahl von und die Länge
der einzelnen Befehlen variiert von Betriebsmodus zu Betriebsmodus.
Pseudocode, mit <n=?> für Anzahl die Anzahl der Bytes eines Befehls
(BSP.: {0xDE, 0xAD, 0xBE, 0xEF} => {<n=4>}):
DerBayer schrieb:> Das Problem: Die Anzahl von und die Länge der einzelnen Befehlen> variiert von Betriebsmodus zu Betriebsmodus.
Aber es gibt eine vordefinierte Maximalgröße?
Oder ist das Alles volldynamisch?
> Wie bekomme ich das am Besten gelöst?
Das geht am ehesten in Richtung "Union".
Damit wird über einen bestimmten Speicherbereich einfach eine "Maske"
gelegt und der jeweilige Speicherinhalt einfach unterschiedlich
interpretiert.
> Wie bekomme ich das am Besten gelöst?Verhindere durch eine "geschickte" Befehlsstruktur das eigentliche
Problem:
> Die Anzahl von und die Länge der einzelnen Befehlen> variiert von Betriebsmodus zu Betriebsmodus.
Lothar M. schrieb:> Aber es gibt eine vordefinierte Maximalgröße?> Oder ist das Alles volldynamisch?
Maximalgröße? - Ja, sicherlich: 240 Bytes. Dennoch würde ich es mehr als
volldynamisch bezeichnen.
Lothar M. schrieb:> Das geht am ehesten in Richtung "Union".> Damit wird über einen bestimmten Speicherbereich einfach eine "Maske"> gelegt und der jeweilige Speicherinhalt einfach unterschiedlich> interpretiert.
Da alles Variable ist hilft mir das nicht weiter. Und bei einer Union
müsste ich auch auf irgendeine "Maske" zugreifen. Das heißt ich muss im
Programmcode wissen was kommt ...
Lothar M. schrieb:> Verhindere durch eine "geschickte" Befehlsstruktur das eigentliche> Problem:>> Die Anzahl von und die Länge der einzelnen Befehlen>> variiert von Betriebsmodus zu Betriebsmodus.
Tja ... Das kann ich nicht ändern! Das "System" mit dem ich kommuniziere
kommt ja nicht von mir bzw. "uns".
...
Mir ist nur ein Umweg über eine Struktur eingefallen. Das ganze kostet
aber dann je Befehl 5 Byte mehr Speicher. Unschön!
DerBayer schrieb:> Die Anzahl von und die Länge> der einzelnen Befehlen variiert von Betriebsmodus zu Betriebsmodus.
Ich denke, du solltest dir mal das Thema "verkettete Listen" anschauen.
vielleicht trifft das eher deinen Anwendungsfall
DerBayer schrieb:> Da alles Variable ist hilft mir das nicht weiter.
So variabel ist es anscheint nicht, wenn du alle zu sendene Befehle im
Flash legen kannst.
> Das heißt ich muss im> Programmcode wissen was kommt ...
Du musst do sowieso wissen "was kommt", sonst würdest du nicht wissen
welches Befehl zu senden ist?
> Tja ... Das kann ich nicht ändern! Das "System" mit dem ich kommuniziere> kommt ja nicht von mir bzw. "uns".
Also:
- Wieviele von diesen Befehlen gibt es?
- Sind die zur Laufzeit konstant, oder enthalten sie variabele Teile?
> Mir ist nur ein Umweg über eine Struktur eingefallen. Das ganze kostet> aber dann je Befehl 5 Byte mehr Speicher. Unschön!
? Nöh, doch nur 1 oder 2 bytes, je nachdem wie lange ein so ein Befehl
sein kann.
1
// 1st element is length, rest is data
2
uint8_tcmd1[]={3,0xF0,0x0B,0xAA};
3
uint8_tcmd2[]={245,0x00,...};
4
uint8_tcmd3[]={1,0x02};
5
6
voidsend(uint8_tcmd)
7
{
8
for(uint8_ti=1;i<=cmd[0];i++)
9
send_byte(cmd[i]);
10
}
11
12
...
13
if(need_to_send_cmd1)
14
send(cmd1);
15
else
16
send(cmd2);
17
...
EDIT: nur aufpassen wenn der Befehl 256 bytes lang ist :-)
@53453453454353:
Ähm ... Ist das nicht meine Lösung!?
Stromverdichter schrieb:> Ich denke, du solltest dir mal das Thema "verkettete Listen" anschauen.> vielleicht trifft das eher deinen Anwendungsfall
Glaube ich nicht. Wären dann sogar 9 Bytes, statt 5, da ich einen
zusätzlichen Pointer sichern müsste:
1
typedefstruct
2
{
3
constuint8_tsize;
4
constuint8_t*cmd;
5
constCMD*next;
6
}CMD;
Last but not least, sind verkettete Listen nur bei dynamischer
Speicherallokierung von Nutzen. Nicht bei statischer ...
DerBayer schrieb:> Ähm ... Ist das nicht meine Lösung!?
quasi gleiche idee ^^
das forum ist manchmal nicht so schnell in der aktualisierung.
als ich geschrieben hatte war dein post nioch nicht da
Eric B. schrieb:> So variabel ist es anscheint nicht, wenn du alle zu sendene Befehle im> Flash legen kannst.
Ja richtig. Die sind fest, ohne variablen Inhalt zur Laufzeit.
Eric B. schrieb:> if(need_to_send_cmd1)> send(cmd1);> else> send(cmd2);
Ein aufeinanderfolgendes explizites Senden von Kommandos a la
1
send(cmd1);
2
send(cmd2);
will ich ja eben vermeiden.
Eric B. schrieb:> EDIT: nur aufpassen wenn der Befehl 256 bytes lang ist :-)
Gibt es ja eben bei 8 Bit nicht ;-)
Peter D. schrieb:>
Lustig, dass das so funktioniert und mit einem Byte-Array nicht, obwohl
es prinzipiell das selbe ist, denn "Set" ist ja ein Byte-Array
{'S','e','t', 0}.
Dennoch geht das nicht:
>> Lustig, dass das so funktioniert und mit einem Byte-Array nicht, obwohl> es prinzipiell das selbe ist, denn "Set" ist ja ein Byte-Array> {'S','e','t', 0}.
cmd_str ist dan auch ein Array mit Pointern zu den Verschiedenen
Texten.
Wäre also äquivalent zu
DerBayer schrieb:> Ein aufeinanderfolgendes explizites Senden von Kommandos a la> send(cmd1);> send(cmd2);> will ich ja eben vermeiden.
Wieso, weshalb und wozu? Irgendwann wirst du doch entscheiden müssen ob
du cmd1 oder cmd2 schicken willst. Und wenn du mehrere cmd-s in Reihe
schicken möchtest, dann eben so:
Du kannst 0-terminierte Listen auch mit einem weiteren Sonderzeichen
hierarchisch aufbauen. Beispiel: alle Befehle als Strings mit 0
hintereinander, Ende ist wenn ein String mit 1 anfängt oder aufhört.
Vorteil: einfache Nutzung von stringroutinen, minimalster Overhead