Выполнение кода через функции

Я делаю светодиодный куб, в котором используется последовательное освещение. Так что по сути мне нужно повторять свои команды в течение определенного времени. После долгих поисков ничего не вышло, поэтому решил спросить здесь.


Вот код, который мне нужно воспроизвести в рабочем формате

void loop(){
  runfor(500){
    DigitalWrite(5,HIGH);   //это команда, которая будет выполнена в других
                            //функция
  }
}
void runfor(uint32_t duration){
  int timer = millis();
  while((millis()-timer)<=duration){
  //DigitalWrite(5,HIGH); будет выполнено здесь
  }
}

Таким образом, по сути, DigitalWrite (или любой другой код, если он используется) будет многократно выполняться в течение 500 миллисекунд

, 👍2


1 ответ


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

4

ИЗМЕНИТЬ из-за неправильного понимания вопроса.

Если вы хотите иметь возможность передавать инструкции в функцию, вам придется иметь функцию для каждого набора инструкций (то есть вы не можете передавать произвольные операторы в качестве параметра функции), а затем вы настраиваете свою функцию runfor() так, чтобы она принимала параметр указателя на функцию.

typedef void (*callback_function)(void);  // определение типа здесь упрощает чтение кода при использовании в других местах.

void runfor(uint32_t duration, callback_function patternCode){
  uint32_t timer = millis();
  while ((millis()-timer)<=duration) {
    //получить эти команды из вызывающей функции
    patternCode();
  }
}

void pattern1() {
  // Световой узор №1
}

void pattern2() {
  // Световой узор №2
}

void setup() {
  // Код настройки
}

void loop() {
  runfor(1000, pattern1);
  runfor(2000, pattern2);
}

ОРИГИНАЛЬНЫЙ ОТВЕТ

Ваш начальный псевдокод почти готов.

void runfor(uint32_t duration){
  uint32_t timer = millis();
  while ((millis()-timer)<=duration) {
    //получить эти команды из вызывающей функции
  }
}

Изменения, которые я внес:

  1. измените int на uint32_t, чтобы учесть все возможные значения millis().

  2. измените ключевое слово for на while, которое является правильным ключевым словом для нужного вам типа цикла.

  3. добавлена точка с запятой после назначения таймера, согласно синтаксису C.

,

Извините, я отредактирую свой пост. Спасибо за информацию!, @A.Shetye

Я не уверен, что понимаю. Какой ответ вы ищете?, @jose can u c

jose can uc Я имею в виду реформу кода, чтобы он в основном «принимал» функцию, скажем, loop() и запускал команды в последующих фигурных скобках { }. Также можете ли вы, пожалуйста, размещать комментарии к моим вопросам в комментариях к вопросам, чтобы другие могли понять?, @A.Shetye

Ваша переменная таймера должна иметь тип uint32_t., @Majenko

@A.Shetye Пример кода, предоставленный в ответе, делает то, о чем вы просите. Ваш первоначальный пример в вопросе уже был очень близок к правильному!, @jose can u c

Полагаю, меня неправильно поняли. Часть // здесь не является примером кода. Так что если я делаю **runfor(50){ <place code here}** из, скажем, loop(), он должен запустить данный код на 50 миллисекунд. Так что, полагаю, мой текущий код не может этого сделать?, @A.Shetye

Теперь, когда я вас понял, я изменил свой ответ., @jose can u c