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;
}
На вашем компьютере. C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino в файле wiring.c
если на входе в millis() прерывания были запрещены, то просто разрешать их нельзя. Поэтому, на входе запоминается весь SREG с флагом прерывния, потом запрещаются прерывания, а потом восстанавливается весь SREG, как до входа в функцию. Так более корректно.
я писал так.
#include <avr/io.h>
#include <avr/interrupts.h>
volatile unsigned long f;
ISR(TIMER0_COMP_vect)
{
f++;
}
int main()
{
TCNT0=0;
TCCR0 |=(1<<WGM1); //режим CTC
TCCR0 |=(1<<CS02)|(1<<CS00);// делитель на 1024
TIMSK |=(1<<1);
OCR0=8;
while(1)
{
//если f равно 1 секунде
if(f==1000)
{
//то тут что то выполняем
}
}
То есть я делал, чтобы в вектор прерывания, мк заходил каждую миллисекунду, а там переменная f увеличивалась на 1. Типа как millis.
На вашем компьютере. C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino в файле wiring.c
благодарю
SREG это же тоже самое что и sei(); Да?
Sreg - регистр флагов. На выходе просто восстанавливается флаг прерываний. Вместо sei()
SREG это же тоже самое что и sei(); Да?
гугл в помощь http://radio-stv.ru/mikrokontrolleri/ustroystvo-i-programmirovanie-mikrokontrollerov-dlya-nachinayushhih/registr-sostoyaniya-sreg-avr
если на входе в millis() прерывания были запрещены, то просто разрешать их нельзя. Поэтому, на входе запоминается весь SREG с флагом прерывния, потом запрещаются прерывания, а потом восстанавливается весь SREG, как до входа в функцию. Так более корректно.
Так же, для повышения зависимости кода от всяких библиотек можно использовать это http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html
Examination of the Arduino millis() Function
millis() выполнена чуть сложнее для повышения точности интервалов при выбранных параметрах таймера (см. табличку по ссылке).