Вызов функции каждую секунду во время выполнения другой функции в течение интервала

#c #function #stm32f4

Вопрос:

Я пишу программу на языке Си для микроконтроллера STM32F439, который вызывает функцию func1 каждую секунду. Я использую таймер 7 для отсчета времени. Я также хочу выполнить другую функцию func2 в промежутке между каждым выполнением func1 . Я написал следующий код в main() функции, где count1s-это количество циклов, необходимое для подсчета до 1 с. Код, настраивающий таймер 7 вне main() функции, опущен.

 int main()
{
    while (1)
    {
      TIM7->CR1 amp;= ~TIM_CR1_CEN;
      TIM7->ARR |= count1s;
      TIM7->SR amp;= ~(TIM_SR_UIF);
      TIM7->CR1 |= TIM_CR1_CEN; 
      while ( (TIM7->SR amp; TIM_SR_UIF) == 0)
      {
        func2();
      }
      func1();
    }
}
 

Я хотел бы спросить, если func2() выполнение занимает более одной секунды, будет ли программа ждать завершения выполнения для выполнения func2() func1() ? Или программа прекратит выполнение func2() , как только истечет срок действия таймера? Я хотел бы, чтобы код гарантировал, что func1() он не будет вызываться до func2() завершения выполнения и func1() вызывается как можно ближе к каждой секунде. Как вы думаете, что является лучшим способом достижения моих целей?

Ответ №1:

Я хотел бы спросить, если выполнение функции func2() занимает более одной секунды, будет ли программа ждать завершения выполнения функции func2() для выполнения функции func1()?

Да, естественно. Это программа с одним потоком, и в ней нет прерываний, поэтому она может выполнять только одну вещь за раз.

Или программа прекратит выполнение функции func2 (), как только истечет срок действия таймера?

Нет, потому что, как только он окажется внутри func2, программа не сможет определить, истек ли таймер.

Я хотел бы, чтобы код гарантировал, что функция func1() не будет вызвана до тех пор, пока функция func2() не завершит выполнение, а функция func2()

Казалось бы, ваш код уже делает это.

Комментарии:

1. Спасибо вам за ваше объяснение. Поскольку функция func2() всегда будет полностью выполняться независимо от того, сколько времени потребуется для выполнения функции func2 (), как я могу убедиться, что функция func1() вызывается каждую секунду?

2. @YuanLinTech В случае, если эти функции не зависят друг от друга и важно время выполнения функции func1, вместо этого вы можете выполнить функцию func1 внутри прерывания циклического таймера. Тогда функция func2 будет приостановлена в пользу выполнения функции func1.

3. Не могли бы вы, пожалуйста, показать мне, как это сделать в своем ответе?

4. @YuanLinTech Нет, потому что изучение того, как использовать прерывания, — это большая тема. И затем вам нужно выяснить, как это сделать и для этого конкретного периферийного устройства таймера.

Ответ №2:

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