Playing with Arduino
A page to record my playing with Arduino
millis()

Abstract

The millis() returns the number of milliseconds since the board has booted.

ソースコード

Source Code

The millis() is defined in hardware/arduino/avr/cores/arduino/wiring.c as below. Only the souce code for Arduino UNO is quoted. The original source code supports many tips using #if’s.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
volatile unsigned long timer0_millis = 0;
 
unsigned long millis()
{
    unsigned long m;
    uint8_t oldSREG = SREG;
 
    // disable interrupts while we read timer0_millis or we might get an
    // inconsistent value (e.g. in the middle of a write to timer0_millis)
    cli();
    m = timer0_millis;
    SREG = oldSREG;
 
    return m;
}

The millis() has no input argument and returns unsigned long value.

First it reserves the status register SREG.

3
4
5
6
unsigned long millis()
    {
    unsigned long m;
    uint8_t oldSREG = SREG;

The SREG is a status register of ATMega328P.

Next it disables interrupt, copies the timer0_millis which holds the number of milliseconds to m, restores the reserved status register value and returns m. The timer0_millis is set in a interrupt handler named TIMER0_OVF_vect.

 8
 9
10
11
12
13
14
15
    // disable interrupts while we read timer0_millis or we might get an
    // inconsistent value (e.g. in the middle of a write to timer0_millis)
    cli();
    m = timer0_millis;
    SREG = oldSREG;
 
    return m;
}

cli() is a macro that executes an assembler macro to disable interrupt.

As SREG includes interrupt flag, it is not need to enable interrupt explicitly.

Version

Arduino 1.8.13

Last Update

June 19, 2020

inserted by FC2 system