millis() kun je resetten

algemene C code
Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

millis() kun je resetten

Berichtdoor nicoverduin » 27 Dec 2016, 21:40

Getriggered door de vraag over de stack van Koepel, kwam in een memory dump de counter tegen van millis. Dus ff testen of je deze kan resetten. En inderdaad. Zie bijgaande sketch waarbij ik millis gelijk op 20000 zet en laat tellen. Ter lering en vermaak:
cpp code
#include "Arduino.h"

extern volatile uint32_t timer0_millis; // zo koppel je aan een systeem variabele
/**
* setup
*/
void setup()
{
Serial.begin(115200);
timer0_millis = 20000UL;
Serial.println(millis());
}

/**
* loop
*/
void loop()
{
//
// print gewoon uit en ff wachten
//
Serial.println(timer0_millis);
delay(250);
//
// bij 30000 resetten we hem weer
//
if (timer0_millis > 30000) {
timer0_millis = 20000;
}
Serial.println(millis());
}


en de output

cpp code
20000
20000
20249
20249
20500
20500
20750
20751
21001
21001
21252
21252
21502
21503
21753
21753
22003
22003
22253
22254
22504
22504
22755
22755
23005
23006
23256
23256
23507
23507
23757
23758
24007
24007
24258
24258
24508
24509
24759
24759
25010
25010
25260
25260
25511
25511
25762
25762
26011
26011
26262
26262
26512
26513
26763
26763
27014
27014
27264
27265
27515
27515
27766
27766
28015
28016
28266
28266
28517
28517
28767
28768
29018
29018
29269
29269
29519
29520
29769
29769
20000
20000
20250
20251
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: millis() kun je resetten

Berichtdoor Gij Kieken » 28 Dec 2016, 01:15

Is interessant, kan ik misschien in de toekomst nog gebruik van maken.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: millis() kun je resetten

Berichtdoor Koepel » 28 Dec 2016, 23:19

Je brengt anderen op verkeerde gedachten ;) en mij trouwens ook ;)

Mag ik dan mijn verkeerde sketch ook laten zien. Ik liep al een tijdje met een "Blink With/Without Delay" in mijn hoofd en het werkt ook nog. Kan ik meteen een ander geintje er in stoppen, om te kijken of globale variabelen met nul geschreven worden bij een soft reset. Dus zo kan ik millis() ook resetten :shock:

De loop() heeft een timing met delay. De yield() heeft een soft timer met millis(). Zolang er genoeg delay() is, werken ze onafhankelijk van elkaar.
Code: Alles selecteren
// Blink With/Without Delay
// Don't even think about to try this sketch.
// The delay() source code is here:
//   https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/wiring.c


extern volatile uint32_t timer0_millis;     // zo koppel je aan een systeem variabele

// In today's 'c' and 'c++' the variables are guaranteed cleared at startup.
int count;
unsigned long previousMillis;
int ledstate = LOW;

void setup()
{
  Serial.begin( 9600);
  Serial.println(F( "Blink With/Without Delay"));

  pinMode( LED_BUILTIN, OUTPUT);
}
 
void loop()
{
  Serial.print( count);
  Serial.print(F( ", "));
  noInterrupts();
  unsigned long milly = timer0_millis;
  interrupts();
  Serial.println( milly);
 
  count++;
  delay( 1000);

  if( count >= 20)
  {
    // That's enough of this, let's do a soft reset.
    asm volatile ("jmp 0");
  }
}

void yield()
{
  // Calling millis() from inside the yield() is valid.
 
  unsigned long currentMillis = millis();
  if( currentMillis - previousMillis > 700)
  {
    previousMillis = currentMillis;
   
    if( ledstate == HIGH)
      ledstate = LOW;
    else
      ledstate = HIGH;
    digitalWrite( LED_BUILTIN, ledstate);
  }
}

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 7 gasten