Raspi Pico (RP2040): repeating timer callback

Gast #6981905
Lesenswert?

Hallo,

auf Basis des Beispiels in Kapitel 4.1.24 (hardware_timer) der 
"Raspberr-pi-pico-c-sdk"-Doku erzeuge ich mir Ticks für den Aufbau eines 
Zeitrasters.
Dazu erzeuge ich mir innerhalb "main" mittels "add_repeating_timer..." 
eine callback-Funktion ("repeating_timer_callback", oberhalb "main"), 
die während der Aufrufintervalle die "systemTimeInTicks" hochzählt (und 
zwecks Kontrolle des Durchlaufs einmalig die onboard-LED25 einschaltet).

Listing in Auszügen für den Fall ok:
1
#include .....
2
  .
3
  .
4
  .
5
  .
6

7
//void _initSystemTime(void);
8
  .
9
  .
10
  .
11

12
const uint8_t led_pin = 25;
13
volatile uint16_t systemTimeInTicks=0;
14
/*--------------------------------------------------*/
15
bool repeating_timer_callback(struct repeating_timer *t) 
16
{
17
    systemTimeInTicks++;
18
    gpio_put(led_pin, true);
19

20
    return true;
21
}
22
//********************************************************************
23
int main(void){   
24
    
25
    stdio_init_all();
26
    
27
    _initPortDirections();
28
    _initPorts();
29
    //_initSystemTime();   // <-------------------------------!!
30
    bool rm_art;               // Rueckmeldung add_repeating_timer
31

32
    systemTimeInTicks=0;
33
    struct repeating_timer timer;
34
    rm_art = add_repeating_timer_ms(-2, repeating_timer_callback, NULL, &timer);
35
  .
36
  .
37
  .
38
  .
39
}
40
  .
41
  .
42
  .
Nun möchte ich allerdings die Anweisungen für den callback (und im 
weiteren Verlauf auch weitere timing-bezogenen Routinen) in eine 
Funktion auslagern und diese dann in "main" aufrufen.
Leider wird jetzt die callback-Funktion nicht mehr durchlaufen, was sich 
im Ausbleiben der LED anzeigt und nach ca. 20 Sekunden auch durch das 
Aussteigen der USB-Verbindung (vermutlich weil der Pico intern 
"überläuft").

Listing in Auszügen für den Fall nicht ok:
1
#include .....
2
  .
3
  .
4
  .
5
  .
6

7
void _initSystemTime(void);
8
  .
9
  .
10
  .
11

12
const uint8_t led_pin = 25;
13
volatile uint16_t systemTimeInTicks=0;
14
/*--------------------------------------------------*/
15
bool repeating_timer_callback(struct repeating_timer *t) 
16
{
17
    systemTimeInTicks++;
18
    gpio_put(led_pin, true);
19

20
    return true;
21
}
22
//************************************************************************
23
int main(void){   
24
    
25
    stdio_init_all();
26
    
27
    _initPortDirections();
28
    _initPorts();
29
    _initSystemTime();   // <-------------------------------!!
30
    
31
  .
32
  .
33
  .
34
}
35
  .
36
  .
37
  .
38
    
39
void _initSystemTime(void)
40
{
41
    bool rm_art;               // Rueckmeldung add_repeating_timer
42

43
    systemTimeInTicks=0;
44
    struct repeating_timer timer;
45
    rm_art = add_repeating_timer_ms(-2, repeating_timer_callback, NULL, &timer); 
46
}
Wer kennt eine Lösung bzw. was mache ich falsch?

Danke für Tipps!
Gast #6981925
Lesenswert?

Dein "struct repeating_timer timer;" solltest entweder global machen 
oder static davor schreiben. So wie du das machst, wird die Struktur auf 
dem Stack angelegt und ist Geschichte wenn _initSystemTime() zu Ende 
ist. Die muss aber solange erhalten bleiben wie dein Timer laufen soll.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren