Forum: Mikrocontroller und Digitale Elektronik Hardfault Handler


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Fragender (Gast)


Bewertung
0 lesenswert
nicht 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)


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

von Fragender (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

Wir auch nicht, du zeigst es uns ja nicht.

von Fragender (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Zeig mal den Funktionsaufruf mit der Übergabe deiner Variable.

von aldesser (Gast)


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

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.