Есть ли что-то, что мне нужно сделать, чтобы скомпилировать код из этого вопроса?

Я попытался скомпилировать следующий код (используя 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 ?

, 👍2


1 ответ


Лучший ответ:

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.

,

Re “ _ Почему исходный плакат использовал регистр вместо простого использования cli/sei, неясно”: Если "setMillis ()" когда-либо вызывался из критического раздела (контекст, в котором прерывания отключены), вы не хотите, чтобы он включал прерывания перед возвращением., @Edgar Bonet

Ладно, в этом есть смысл, но я думаю, что это немного выходит за рамки того, что он пытается там сказать., @PMF