mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik volatile struct in ISR?


Autor: Stm Mc (stmfresser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche Daten von einem Struct in ISR auf dem uC STM32F4 zu 
verändern. Leider klappt es nicht.


kalman_motor.c
/*  kalman_motor.c  */
#include "kalman_motor.h"

void pose_estimate(kalman_motor *k, float newPos){...}



kalman_motor.h
/*  kalman_motor.h  */

#ifndef KALMAN_MOTOR_H_
#define KALMAN_MOTOR_H_

typedef struct{
    float pos;
    float vel;

    float P1, P2, P3, P4;
    float Q1, Q2, Q3, Q4;
    float R;

    float dt;
}kalman_motor;

void pose_estimate(kalman_motor *k, float newPos);
#endif /* KALMAN_MOTOR_H_ */


main.c
#include "kalman_motor.h"

kalman_motor motor_pose1;

int main(void){

while(1){
    start= micros;
    control_loop();
    dur = micros - start;
    Delay(loop_time - dur);
}

void control_loop(void){
    pose_estimate(&motor_pose1, measuredPos1);
    motor_angle1 = motor_pose1.pos;
    motor_velocity1 = motor_pose1.vel;
}
}

Es funktioniert problemlos, wenn ich die 'control_loop' in der Main 
Schleife mit festen Takt aufrufe, sowie es man oben sieht.

Wenn ich den 'control_loop ' in einer Timer Interrupt aufrufe, bleibt 
der uController hängen. Es bleibt immer noch hängen wenn ich volatile 
kalman_motor motor_pose1 definiere.

Es gibt leider keine Compiler Fehler zu sehen. Compiler Optimierung ist 
bei -Os.

Weiss jemand woran es liegt.

Entschuldigt mich für die schlechte Formulierung. Bin kein 
Muttersprachler.

Danke im Voraus.

Autor: cdaddr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiß nicht ob das der Grund für den Absturz ist, aber Du solltest 
control_loop nicht innerhalb der main definieren.

Autor: Jim Meba (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stm M. schrieb:
> Wenn ich den 'control_loop ' in einer Timer Interrupt aufrufe, bleibt
> der uController hängen.

Wenn control_loop() langsamer ist als der Timer dann wird auch kein 
anderer Code mehr ausgeführt.

Mit den 3 Brocken Code kann Dir niemand helfen, da fehlt alles 
relevente.

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du in Interrupt-Routinen FP-Code benutzt, mußt Du dafür sorgen, daß 
die entsprechenden Register bei einem Kontext-Switch auch 
gesichert/wiederhergestellt werden.

Machst Du das?

Falls ja: ist der Stack dafür ausreichend?

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.