Forum: Mikrocontroller und Digitale Elektronik Hardfault Handler


von Fragender (Gast)


Lesenswert?

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.
1
typedef struct
2
{
3
  uint32_t ChannelIOs;  /*!< Channel IOs mask */
4
  uint32_t ShieldIOs;   /*!< Shield IOs mask */
5
  uint32_t SamplingIOs; /*!< Sampling IOs mask */
6
} TSC_IOConfigTypeDef;
1
void bankConfig(TSC_IOConfigTypeDef* my_io_struct, uint8_t linearSensorBank)
2
{
3
  // alle configs löschen
4
  my_io_struct->ChannelIOs = 0;
5
  my_io_struct->ShieldIOs = 0;
6
  my_io_struct->SamplingIOs = 0;
7
  
8
        ....
9
         ...

von . . (Gast)


Lesenswert?

In Zeile 42 sieht man doch, dass Du den falschen Pointer an my_io_struct 
übergibst.

von Fragender (Gast)


Lesenswert?

.                                                . schrieb im Beitrag 
#5657166:
> In Zeile 42 sieht man doch, dass Du den falschen Pointer an
> my_io_struct
> übergibst.

Zeile 42?

von Fragender (Gast)


Lesenswert?

.                                                . 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

von g457 (Gast)


Lesenswert?

> Ich wüsste nicht wo da der Fehler sein soll.

Wir auch nicht, du zeigst es uns ja nicht.

von Fragender (Gast)


Lesenswert?

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?

von Adam P. (adamap)


Lesenswert?

Zeig mal den Funktionsaufruf mit der Übergabe deiner Variable.

von aldesser (Gast)


Lesenswert?

Zeig uns doch einfach den Code wo du bankConfig(...) aufrufst, besser 
lade die komplette main/code hoch

von Carl D. (jcw2)


Lesenswert?

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.

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

Mach es so, dann läufts:
1
#include <stdio.h>
2
3
typedef unsigned char uint8_t;
4
5
typedef struct
6
{
7
    uint8_t a;
8
    uint8_t b;
9
    uint8_t c;
10
} my_struct;
11
12
void call_me(my_struct *param)
13
{
14
    param->a = 0;
15
    param->b = 0;
16
    param->c = 0;
17
}
18
19
int main()
20
{
21
    my_struct foo;
22
    
23
    foo.a = 1;
24
    foo.b = 2;
25
    foo.c = 3;
26
    
27
    printf("%d %d %d\n", foo.a, foo.b, foo.c);
28
    call_me(&foo);
29
    printf("%d %d %d\n", foo.a, foo.b, foo.c);
30
    
31
32
    return 0;
33
}

von Adam P. (adamap)


Lesenswert?

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_struct foo;
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.

: Bearbeitet durch User
von g457 (Gast)


Lesenswert?

> 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.

von Adam P. (adamap)


Lesenswert?

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.

von Fragender (Gast)


Lesenswert?

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.

von Adam P. (adamap)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Adam P. (adamap)


Lesenswert?

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.

von Adam P. (adamap)


Lesenswert?

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...

von Stefan (Gast)


Lesenswert?

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

von Adam P. (adamap)


Lesenswert?

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 ;)

von Fragender (Gast)


Lesenswert?

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..

von Jim M. (turboj)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.