Как можно посмотреть код функции?

VeD
Offline
Зарегистрирован: 21.02.2016

Интересует функция millis();

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
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

VeD
Offline
Зарегистрирован: 21.02.2016

благодарю

VeD
Offline
Зарегистрирован: 21.02.2016

SREG это же тоже самое что и sei(); Да?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Sreg - регистр флагов. На выходе просто восстанавливается флаг прерываний. Вместо sei()

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

VeD пишет:

SREG это же тоже самое что и sei(); Да?

гугл в помощь http://radio-stv.ru/mikrokontrolleri/ustroystvo-i-programmirovanie-mikrokontrollerov-dlya-nachinayushhih/registr-sostoyaniya-sreg-avr

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

если на входе в millis() прерывания были запрещены, то просто разрешать их нельзя.  Поэтому, на входе запоминается весь SREG с флагом прерывния, потом запрещаются прерывания, а потом восстанавливается весь SREG, как до входа в функцию.  Так более корректно. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Так же, для повышения зависимости кода от всяких библиотек можно использовать это http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html

VeD
Offline
Зарегистрирован: 21.02.2016
я писал так.
#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. 

 

 

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Examination of the Arduino millis() Function

millis() выполнена чуть сложнее для повышения точности интервалов при выбранных параметрах таймера (см. табличку по ссылке).