2015-03-13 2 views
0

я мог бы использовать:Вызов функции каждые 10 секунд в C - mbed платформы

while(1==1) 
{ 

    delay(10); 

    f();  // <-- function to be called every 10 seconds 

    otherfunctions(); 

} 

Но это займет чуть более 10 секунд, потому что другие функции потребуется некоторое время для выполнения. Есть ли функция задержки, которая учитывает время, затраченное на другие функции, поэтому я могу позвонить f() ровно каждые 10 секунд?

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

Кто-нибудь знает о функции, которая может делать то, что я хочу?

+0

В какой операционной системе вы работаете? Стандартная библиотека AFAIK C не имеет функций таймера. – dhke

+0

Как ваша программа реализована? У вас есть темы? Что работает программа? – DigitalNinja

+0

Программа работает на микроконтроллере Keil (используется процессор Arm). '#include time.h' имеет функцию задержки. – Blue7

ответ

4

Вы должны, конечно же, начать с чтения mbed handbook. Это не большой API, и вы можете получить хороший обзор его очень быстро.

Платформа mbed - это C++ API, поэтому вам нужно будет использовать компиляцию на C++.

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

Использование Ticker класс:

#include "mbed.h" 

Ticker TenSecondStuff ; 

void TenSecondFunction() 
{ 
    f(); 
    otherfunctions(); 
} 

int main() 
{ 
    TenSecondStuff.attach(TenSecondFunction, 10.0f) ; 

    // spin in a main loop. 
    for(;;) 
    { 
     continuousStuff() ; 
    } 
} 

Использование wait_us() и Timer класс:

#include "mbed.h" 

int main() 
{ 
    Timer t ; 
    for(;;) 
    { 
     t.start() ; 
     f() ; 
     otherfunctions() ; 
     t.stop() ; 

     wait_us(10.0f - t.read_us()) ; 
    } 
} 

Используя Ticker класс, альтернативный метод:

#include "mbed.h" 

Ticker ticksec ; 
volatile static unsigned seconds_tick = 0 ; 
void tick_sec() 
{ 
    seconds_tick++ ; 
} 

int main() 
{ 
    ticksec.attach(tick_sec, 1.0f) ; 

    unsigned next_ten_sec = seconds_tick + 10 ; 
    for(;;) 
    { 
     if((seconds_tick - next_ten_sec) >= 0) 
     { 
      next_ten_sec += 10 ; 
      f() ; 
      otherfunctions() ; 
     } 

     continuousStuff() ; 
    } 
} 

Использование mbed RTOS Таймер

#include "mbed.h" 
#include "rtos.h" 

void TenSecondFunction(void const*) 
{ 
    f(); 
    otherfunctions(); 
} 

int main() 
{ 
    RtosTimer every_ten_seconds(TenSecondFunction, osTimerPeriodic, 0); 

    for(;;) 
    { 
     continuousStuff() ; 
    } 
} 
0

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

volatile int *pticker;  /* pointer to ticker */ 
    tickpersecond = ... ; /* number of ticks per second */ 
    /* ... */ 
    tickcount = *pticker; /* get original reading of timer */ 
    while(1){ 
     tickcount += 10 * tickspersecond; 
     delaycount = tickcount-*pticker; 
     delay(delaycount); /* delay delaycount ticks */ 
     /* ... */ 
    } 

Это предполагает, что приращения тикер (вместо уменьшений), что Codde никогда получить 10 секунд за задержкой и предполагает, что количество тиков в секунду является точным целым числом. Поскольку в качестве основы используется исходное чтение, цикл не будет «дрейфовать» в течение длительного периода времени.

1

Если вы хотите просто попробовать этот

int delayTime = DELAY_10_SECS; 

while(1==1) 
{ 
    delay(delayTime); 

    lastTime = getCurrTicks(); //Or start some timer with interrupt which tracks time 

    f();  // <-- function to be called every 10 seconds 
    otherfunctions(); 

    delayTime = DELAY_10_SECS - (getCurrTicks() - lastTime); //Or stop timer and get the time 
} 
Смежные вопросы