Hi
Ich möchte den struct membern einen Wert zuweisen. In der Bibliothek von
ST ist dazu ein struct definiert, den ich gerne verwenden möchte.
Ich habe 2 Fragen, aber voerst möchte ich nur eine stellen.
Wie weist man den struct membern Werte zu?
Ich habe nun Einiges dazu gelesen und komme nicht darauf, warum ich bei
der Anweisung unten alle configs löschen in den Hardfault Handler
springt.
Ich greife bei einem Pointer mit dem Pfeiloperator auf den member zu und
kann diesem einen WErt zuweisen. Wäre es kein Pointer, dann würde ich
dies mit dem Punktoperator machen.
Bitte um Hilfe.
. . schrieb im Beitrag
#5657166:
> In Zeile 42 sieht man doch, dass Du den falschen Pointer an> my_io_struct> übergibst.
Ausserdem nein.
Ich habe doch den typedef struct.
Die neue Typendefinition lautet so wie es da steht TSC_IOConfigTypeDef
Ich habe eine Variable von diesem Typ erstellt, mit dem Pointerparameter
in der Funktion TSC_IOConfigTypeDef* führe ich ein call by reference
durch und weise die Werte direkt zu.
Dieser Funktion muss also ein Pointer von diesem Typ mitgegeben werden.
Das tue ich auch mit my_io_struct.
Ich wüsste nicht wo da der Fehler sein soll.
Gruss
g457 schrieb:>> Ich wüsste nicht wo da der Fehler sein soll.>> Wir auch nicht, du zeigst es uns ja nicht.
Was soll ich den zeigen?
Kompilieren tut es fehlerfrei.
Debugge ich das Programm springt es ab der 1. Zeile wo ich die Channels
0 setze in den Hardfault Handler und bleibt hängen.
Was musst du denn noch wissen, ausser zu wissen, dass ich in den
Hardfault Handler komme?
Fragender schrieb:>> Ich habe eine Variable von diesem Typ erstellt, mit dem Pointerparameter> in der Funktion TSC_IOConfigTypeDef* führe ich ein call by reference> durch und weise die Werte direkt zu.>> Dieser Funktion muss also ein Pointer von diesem Typ mitgegeben werden.> Das tue ich auch mit my_io_struct.> Ich wüsste nicht wo da der Fehler sein soll.>> Gruss
Das schöne an C ist, daß man nicht "per Referenz oder per Wert" rätseln
muß, sondern man muß es hinschreiben. Bei der Funktion durch "*" und
beim Aufrufer durch "&".
Man man letzteres weg lassen, dann hagelt es Warnungen.
Kann man ignorieren, muß man aber nicht.
Solltest du aber einen Pointer auf deine Struct haben und den übergibst
du mit &
dann gibt der Compiler kein Fehler aus, aber der HardFault schlägt
bestimmt zu, weil keiner weiß was sich neben dem Pointer im Speicher
befinden, Glückssache :-D
Siehe:
1
my_structfoo;
2
my_struct*p;
3
4
p=&foo;
5
6
foo.a=1;
7
foo.b=2;
8
foo.c=3;
9
10
call_me(&p);
...mal ganz davon abgesehen, das die Werte bei 1, 2, 3 bleiben und der
µC evtl. den Speicher von anderen Variablen überschreibt.
> Was soll ich den zeigen?
Aufruf, Deklaration, Definition, Initialisierung, alles was sinnvoll
ist.
> Was musst du denn noch wissen, ausser zu wissen, dass ich in den> Hardfault Handler komme?
DU willst wissen, wo der Fehler liegt. WIR sagen Dir wiederholt, was Du
tun sollst. Tu es, oder lass es bleiben und such den Fehler selber.
g457 schrieb:> und such den Fehler selber.
:-D kann sich beim HardFault mehr oder weniger schwer gestalten...
aber der ASM Code hilft da immer!
Das was zu sehen ist, ist ja richtig... somit liegt der Fehler nicht im
gezeigten.
Carl D. schrieb:> Fragender schrieb:>>>> Ich habe eine Variable von diesem Typ erstellt, mit dem Pointerparameter>> in der Funktion TSC_IOConfigTypeDef* führe ich ein call by reference>> durch und weise die Werte direkt zu.>>>> Dieser Funktion muss also ein Pointer von diesem Typ mitgegeben werden.>> Das tue ich auch mit my_io_struct.>> Ich wüsste nicht wo da der Fehler sein soll.>>>> Gruss>> Das schöne an C ist, daß man nicht "per Referenz oder per Wert" rätseln> muß, sondern man muß es hinschreiben. Bei der Funktion durch "*" und> beim Aufrufer durch "&".> Man man letzteres weg lassen, dann hagelt es Warnungen.> Kann man ignorieren, muß man aber nicht.
OK, bevor ich mit euch weiter diskutiere. Hier mal STOP!
Ich habe das mal gemacht was Carl da schreibt. Übrigens danke Carl für
den Tipp.
meine Funktionsdefinition zuvor war:
bankConfig(TSC_IOConfigTypeDef* my_io_struct, uint8_t linearSensorBank)
Der Pointer
TSC_IOConfigTypeDef *ioConfig;
die genutzte Funktion:
bankConfig(ioConfig, TSC_BANK_LS1TO3));
So habe ich doch einen Pointer ioConfig des Typs TSC_IOConfigTypeDef und
diesen Pointer übergebe ich doch der Funktion.. Hat aber nicht
funktioniert. Warum??
Nach dem Beitrag von Carl habe ich die Funktion geändert auf
bankConfig(TSC_IOConfigTypeDef* my_io_struct, uint8_t linearSensorBank)
Keine Pointervariable
TSC_IOConfigTypeDef ioConfig;
die genutzte Funktion:
bankConfig(&ioConfig, TSC_BANK_LS1TO3));
Das funktioniert. Für mein Verständnis finde ich das untere plausibler,
aber verstehe trotzdem nicht, warum das obere nicht funktioniert.
Fragender schrieb:> bankConfig(ioConfig, TSC_BANK_LS1TO3));Fragender schrieb:> bankConfig(&ioConfig, TSC_BANK_LS1TO3));
Ich frag mich eher warum das überhaupt funktioniert?
2x Klammer zu???
Aber dann müssen wir wohl noch ein Schritt weiter zurück.
Wie hast du dem Pointer den deine Struct zugewiesen...
Irgendwie echt nervig....Zeig doch alles her und fertig.
Dann dauerts keine 10 min. und einer findet es.
Oder du hast irgendwo in den oberen Ebenen einen Logikfehler.
Fragender schrieb:> meine Funktionsdefinition zuvor war:> bankConfig(TSC_IOConfigTypeDef* my_io_struct, uint8_t linearSensorBank)> Der Pointer> TSC_IOConfigTypeDef *ioConfig;> die genutzte Funktion:> bankConfig(ioConfig, TSC_BANK_LS1TO3));
Wie sieht deine Zuweisung aus auf welche Adresse io Config zeigt?
Es ist oftmals sinnvoll mehr als zur Schnipsel zur Verfügung zu stellen
wenn man Hilfe braucht
Fragender schrieb:> meine Funktionsdefinition zuvor war:> bankConfig(TSC_IOConfigTypeDef* my_io_struct, uint8_t linearSensorBank)> Der Pointer> TSC_IOConfigTypeDef *ioConfig;> die genutzte Funktion:> bankConfig(ioConfig, TSC_BANK_LS1TO3));
Denn so sollte es in der Regel auch funktionieren...somit kann der
Fehler da auch nicht liegen.
Stefan schrieb:> Weil du ein Pointer angelegt hast, der irgendwo hinzeigt. Den Speicher> musst du schon berreitstellen.
Das wissen wir nicht, weil wir ja nur Schnipsel sehen...
Da er nix zeigt, kann man raten. Und ich unterstell ihm einfach das er
ein Anfänger ist der. Ode zusammen kopiert hat.
Aber es ist das Wahrscheinlichste, da Hardfaults auf ungültige
Speicherzugriffe hindeuten
Stefan schrieb:> Und ich unterstell ihm einfach das er> ein Anfänger ist
Daran ist ja nix verwerfliches...
aber so kann nun keiner helfen & NASA Code ist es bestimmt nicht bzgl.
Geheimhaltung ;)
Stefan schrieb:> Weil du ein Pointer angelegt hast, der irgendwo hinzeigt. Den> Speicher musst du schon berreitstellen.> Das lernt man in jedem C Buch ganz am Anfang
Meine Fresse bin ich blöd und blind und doof und deppert.
So geil..
So blind u blöd muss man echt sein, scheisse nochmal.
Danke Stefan und all den anderen. Auch dir Adam.
Ichhabe ausserdem versucht die main anzuhaengen, habe aber die Meldung
Datei zu gross bekommen. und das bei 60kB.
Keine Ahnung. Und hätte ich den ganzen Code gleich geladen hätte
wahrscheinlich jemand gesagt er hätte keine Lust ihn durchzulesen..
Fragender schrieb:> So habe ich doch einen Pointer ioConfig des Typs TSC_IOConfigTypeDef und> diesen Pointer übergebe ich doch der Funktion.. Hat aber nicht> funktioniert. Warum??
Weil der Pointer in den Wald zeigt.
Hast Du alle Warnings an (-Wall im gcc)? Der Compiler hätte hier in
meinen Augen eine Warning ausspucken sollen - Benutzung einer nicht
gesetzten Pointer Variable.