Есть ли что-то, что мне нужно сделать, чтобы скомпилировать код из этого вопроса?
Я попытался скомпилировать следующий код (используя Arduino 1.8.16 с esp8266-12)
extern volatile unsigned long timer0_millis;
unsigned long new_value = 0;
void setup(){
//Setup stuff
}
void loop(){
//Do stuff
//--------
//Change Millis
setMillis(new_value);
}
void setMillis(unsigned long new_millis){
uint8_t oldSREG = SREG;
cli();
timer0_millis = new_millis;
SREG = oldSREG;
}
из ответа на этот вопрос, но я получаю следующую ошибку
error: 'SREG' was not declared in this scope
uint8_t oldSREG = SREG;
^
exit status 1
'SREG' was not declared in this scope
Я бы не обязательно хотел использовать этот код для каких-либо реальных целей, кроме как в качестве упражнения в обучении. Что я упускаю? Что такое SREG ?
@TRS-80, 👍2
1 ответ
Лучший ответ:
SREG
-это регистр состояния процессора. Один из битов там-флаг прерывания, который очищается с помощью команды cli()
и сбрасывается в конце функции. Почему оригинальный плакат использовал регистр вместо простого использования cli/sei, неясно. (Примечание: Вместо cli()
и sei()
в документации arduino используются гораздо более четкие эквиваленты noInterrupts()
и interrupts()
.)
Этот регистр SREG в этой форме зависит от оборудования и, следовательно, недоступен, если вы используете набор инструментов esp8266. Приведенный выше код отлично работает с Arduino Uno или аналогичной платой. Чтобы выполнить сборку для esp8266, измените код на:
void setMillis(unsigned long new_millis){
noInterrupts();
timer0_millis = new_millis;
interrupts();
}
У меня нет такой платы, поэтому я не могу проверить, действительно ли она работает на этой плате. Вы можете получить ошибку компоновщика о несуществующей переменной timer0_millis.
- Как справиться с rollover millis()?
- Торговый автомат Arduino для мониторинга ввода монет в слот во время ожидания ввода пользователя
- Та же кнопка одним кликом и двойным кликом
- Как запустить 4 светодиода последовательно на основе кнопочного входа?
- Использование функции millis() вместо функции delay() при воспроизведении мелодии
- Как использовать Multipile millis()
- Arduino прекращает регистрацию данных примерно через 32761 секунду.
- Мой код millis() не работает
Re “ _ Почему исходный плакат использовал регистр вместо простого использования cli/sei, неясно”: Если "setMillis ()" когда-либо вызывался из критического раздела (контекст, в котором прерывания отключены), вы не хотите, чтобы он включал прерывания перед возвращением., @Edgar Bonet
Ладно, в этом есть смысл, но я думаю, что это немного выходит за рамки того, что он пытается там сказать., @PMF