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