Forum: Mikrocontroller und Digitale Elektronik Problem mit Keil Compiler V6


von sChrott (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich wollte gerade den "neuen" Compiler von Keil testen, dann bin ich auf 
ein Problem gestoßen. Das Programm funktioniert ohne Probleme mit der 
Compiler Version 5.
Beide auf der Optimierungsstufe -O1 und in beiden Fällen wird systick_ms 
durch die Interrupt inkrementiert.

Der Compiler baut eine unendliche Schleife ein. Woher kommt das 
Verhalten, denkt der Compiler der Rückgabewert von systick_get() wird 
sich nie ändern, deswegen ende Gelände?

Mein timer.c
1
static uint32_t systick_ms=0;
2
3
void systick_add(void)
4
{
5
    systick_ms++;
6
}    
7
8
uint32_t systick_get(void)
9
{
10
    return systick_ms;
11
}    
12
13
void systick_delay_ms(uint32_t delay_ms)
14
{
15
    delay_ms += systick_get();    
16
    while(delay_ms>systick_get());
17
}

timer.h
1
#ifndef TIMER_H
2
#define TIMER_H
3
4
5
#include <stdint.h>
6
#include "stm32f10x.h"
7
8
// Systick
9
void systick_add(void);
10
uint32_t systick_get(void);
11
void systick_delay_ms(uint32_t delay_ms);
12
void systick_CMD(uint8_t enable_disable);
13
    
14
#endif




stm32f10x_it.c
1
#include "timer.h"
2
3
void SysTick_Handler(void)
4
{
5
    systick_add();
6
}

Läuft auf dem STM32f103C8
Keil uVision 5.28
Compiler V5.06 update 6 und V6.12

von Stefan (Gast)


Lesenswert?

Ja, der Compiler darf annehmen, dass sich systick nicht ändert. Du hast 
das volatile vergessen.
Also kein Problem mit dem Compiler sondern deinem Code

von sChrott (Gast)


Lesenswert?

Perfekt, ja hab mir schon gedacht das der Fehler bei mir liegt.
Dankeschön!

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.