在 C-mbed 平台中每 10 秒调用一个函数
Call a function every 10 seconds in C - mbed platform
我可以使用:
while(1==1)
{
delay(10);
f(); // <-- function to be called every 10 seconds
otherfunctions();
}
但这只需要 10 多秒,因为其他函数需要一些时间才能执行。是否有考虑到其他函数所用时间的延迟函数,这样我就可以每 10 秒调用一次 f()
?
我听说这可以通过头文件中的一个聪明的函数来完成,但我记不起是哪一个了。我想它可能是 #include mbed.h
但即使该函数包含在这个头文件中,我也不知道它叫什么或如何搜索它。
有人知道可以实现我所追求的功能吗?
假设您有某种类型的定时器计数器,可能是由定时器驱动的中断生成的,请尝试如下操作:
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 */
/* ... */
}
这假定自动收报机递增(而不是递减),代码永远不会延迟 10 秒,并假定每秒的刻度数是一个精确的整数。由于以原始读数为基础,循环不会"drift"长时间
您当然应该从阅读 mbed handbook 开始。它不是很大 API,您可以很快地了解它。
mbed 平台是 C++ API,因此您需要使用 C++ 编译。
有几种方法可以实现您的需要,一些示例:
使用Ticker
class:
#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
class:
#include "mbed.h"
int main()
{
Timer t ;
for(;;)
{
t.start() ;
f() ;
otherfunctions() ;
t.stop() ;
wait_us( 10.0f - t.read_us() ) ;
}
}
使用Ticker
class,另一种方法:
#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() ;
}
}
如果你想要简单的试试这个
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
}
我可以使用:
while(1==1)
{
delay(10);
f(); // <-- function to be called every 10 seconds
otherfunctions();
}
但这只需要 10 多秒,因为其他函数需要一些时间才能执行。是否有考虑到其他函数所用时间的延迟函数,这样我就可以每 10 秒调用一次 f()
?
我听说这可以通过头文件中的一个聪明的函数来完成,但我记不起是哪一个了。我想它可能是 #include mbed.h
但即使该函数包含在这个头文件中,我也不知道它叫什么或如何搜索它。
有人知道可以实现我所追求的功能吗?
假设您有某种类型的定时器计数器,可能是由定时器驱动的中断生成的,请尝试如下操作:
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 */
/* ... */
}
这假定自动收报机递增(而不是递减),代码永远不会延迟 10 秒,并假定每秒的刻度数是一个精确的整数。由于以原始读数为基础,循环不会"drift"长时间
您当然应该从阅读 mbed handbook 开始。它不是很大 API,您可以很快地了解它。
mbed 平台是 C++ API,因此您需要使用 C++ 编译。
有几种方法可以实现您的需要,一些示例:
使用Ticker
class:
#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
class:
#include "mbed.h"
int main()
{
Timer t ;
for(;;)
{
t.start() ;
f() ;
otherfunctions() ;
t.stop() ;
wait_us( 10.0f - t.read_us() ) ;
}
}
使用Ticker
class,另一种方法:
#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() ;
}
}
如果你想要简单的试试这个
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
}