Forum: Mikrocontroller und Digitale Elektronik volatile struct in ISR?


von Stm M. (stmfresser)


Lesenswert?

Hallo,

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


kalman_motor.c
1
/*  kalman_motor.c  */
2
#include "kalman_motor.h"
3
4
void pose_estimate(kalman_motor *k, float newPos){...}



kalman_motor.h
1
/*  kalman_motor.h  */
2
3
#ifndef KALMAN_MOTOR_H_
4
#define KALMAN_MOTOR_H_
5
6
typedef struct{
7
    float pos;
8
    float vel;
9
10
    float P1, P2, P3, P4;
11
    float Q1, Q2, Q3, Q4;
12
    float R;
13
14
    float dt;
15
}kalman_motor;
16
17
void pose_estimate(kalman_motor *k, float newPos);
18
#endif /* KALMAN_MOTOR_H_ */


main.c
1
#include "kalman_motor.h"
2
3
kalman_motor motor_pose1;
4
5
int main(void){
6
7
while(1){
8
    start= micros;
9
    control_loop();
10
    dur = micros - start;
11
    Delay(loop_time - dur);
12
}
13
14
void control_loop(void){
15
    pose_estimate(&motor_pose1, measuredPos1);
16
    motor_angle1 = motor_pose1.pos;
17
    motor_velocity1 = motor_pose1.vel;
18
}
19
}

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.

von cdaddr (Gast)


Lesenswert?

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

von Jim M. (turboj)


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.

von Markus F. (mfro)


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?

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.