Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > возврат значения функцией с временной задержкой


Автор: supercelt 3.9.2017, 00:35
Здравствуйте! подскажите пожалуйста. Вот допустим у меня есть ф-ия

Код

int chek(void){
 delay_ms(5);
 count++;
 key |= какие-то вычисления;
 if(count == 4){
   return 1;
 }
 return 0;
}


и в майне я делаю вот так

Код

d = chek();


соответственно получаю значение. НО, использовать такую задержку что бы простаивало время я не могу. Придумал сделать по таймеру. Значит настроил его так что каждые 5 мс прерывание. И в нем выставляется флаг разрешения
Код

void TIM6_DAC_IRQHandler(void){
 if(TIM6->SR & TIM_SR_UIF){
  TIM6->SR &= ~TIM_SR_UIF;
   flag =1;
  }
}


а в функции:
Код

int chek(void){
 if(flag){
  flag = 0;
  count++;
  key |= какие-то вычисления;
    if(count == 4){
    return 1;
  }
 }
 return 0;
}


так вот когда я ее вызову в майне

Код

d = chek();

На момент вызова она же выдаст d = 0? Ведь таймер ещё не отработал свои 4 раза. А если я уберу return 0, то выдает ошибку и не пропускает. П.С. по условию возвратить 1 ф-ия должна именно после 4 прогонов

Автор: Romikgy 3.9.2017, 15:21
Цитата(supercelt @  2.9.2017,  23:35 Найти цитируемый пост)
На момент вызова она же выдаст d = 0?

да 
PS вопросов более не увидел , что хотели спросить этим постом тоже не понятно...

Автор: xvr 4.9.2017, 13:02
Цитата(supercelt @  3.9.2017,  00:35 Найти цитируемый пост)
П.С. по условию возвратить 1 ф-ия должна именно после 4 прогонов

Тогда при чем тут задержки? Счетчик вызовов функции можно сделать на static переменной внутри нее. Без всяких таймеров

Автор: baldman88 4.9.2017, 21:43
Цитата(xvr @ 4.9.2017,  13:02)
Цитата(supercelt @  3.9.2017,  00:35 Найти цитируемый пост)
П.С. по условию возвратить 1 ф-ия должна именно после 4 прогонов

Тогда при чем тут задержки? Счетчик вызовов функции можно сделать на static переменной внутри нее. Без всяких таймеров

Смысл в том, что инкрементировать нужно через определенные промежутки времени, как я понимаю. Чтобы в эти промежутки времени ядро могло заниматся полезной работой и используются прерывания от таймера (чтобы не просто в цикле ждать).
А по делу да -- нужна статическая переменная.

Автор: supercelt 5.9.2017, 13:24
Про count это я знаю. Этот кусок кода я быстро сделал для примера. То есть получается что единственный выход это  отслеживать пустая ли будет переменная d или нет? Или например сделать не return, а глобальную переменную и что б она в майне видна была. И в этой ф-ии её наполнять, а в майне уже проверять. Но говорят что лучше глобальные не использовать, типа это не оч хорошо...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)