Forum: Mikrocontroller und Digitale Elektronik Raspi Pico (RP2040): repeating timer callback


von B.W.H. (Gast)


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!

von temp (Gast)


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.

von B.W.H. (Gast)


Lesenswert?

Super, genau das war es! Und Deine Begründung habe ich auch verstanden!

Besten Dank!!

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.