便携式航电实时系统测试平台时序框架

70 阅读3分钟

1.1 时序框架

Etest实时脚本API提供了Frequency_T、Period_T、Ticker_T和 Timer_T等类,以便进行与时序有关的操作。

1.1.1 使用方法及范例

创建周期性触发的系统时钟使用Ticker_T类型。可以先创建一个Ticker_T对象,指定其触发周期,然后使用Start方法启动定时器,在启动的时候给出的参数为每次时钟周期到时被调用的函数。最后可以使用stop方法停止定时器。如以下范例:

#define MC_APPNAME "TickerTest" // 自动用作输出前缀 #include <Rasl/rasl.hpp> #include "rasl-dpd/user.hpp" #include "UserChannels.rasi" namespace { using namespace Kiyun::LowerComputer::Rasl::Frame; using namespace std; } int kiyunMain() { KYIO(log) << "Setting ..."; unsigned mtCount = 0; Ticker_T ticker1 = Ticker_T::get(2.0_s); // 2.0 秒,指定周期值 Ticker_T ticker2 = Ticker_T::get(0.8_hz); // 0.8 赫兹,指定频率值 Ticker_T ticker3 = Ticker_T::get(0.8); // Ticker 默认接受频率值 auto ticker4 = Ticker_T::get(10_hz); ticker1.start( -> bool { KYIO(out) << " =-+---- 2.0 seconds "; return true; }); ticker2.start( -> bool { KYIO(out) << " =-+---- 0.8 herz"; return true; }); ticker3.start( -> bool { KYIO(out) << " =-+---- 0.8"; return true; }); // ticker4.start([&mtCount]{ ++mtCount; return true; }); KYIO(log) << "Fired ..."; Timer_T::delay(5.0); // Timer 默认接受时长(周期),5秒后停止时钟 KYIO(out) << "Ticker count : " << mtCount; ticker1.stop(); ticker2.stop(); ticker3.stop(); ticker4.stop(); return 0; }

创建一次性的系统延时可以使用Timer_T类型的delay方法。

使用方法为:

Timer_T::delay(5.0); // Timer 结束时长(单位为秒)

1.1.2 Frequency_T类与 Period_T 类

所在命名空间:Kiyun::LowerComputer::Rasl::Frame

这两个类分别代表 频率 与 周期(时长)。其中 Period_T 有别名为 Timeout_T(时长)。

  1. 构造函数

函数原型:

Frequency_T(float);

Period_T(float);

函数功能:初始化一个Ticker_T对象

参数:step:频率(​以赫兹为单位)或周期(以秒为单位)的浮点值。

返回值:Frequency_T / Peroid_T对象

  1. 自定义字面量

_hz 后缀可构造 Frequency_T 的对象;_s 后缀可构造 Period_T 的对象。如:

Frequency_T 频率 = 0.5_hz; Period_T 周期 = 1e-3_s; // 1毫秒
  1. 算术运算

Frequency_T 和 Period_T 对象支持带量纲的算术运算。如下所示:

auto f1 = 0.5_hz * 2; // => 1_hz f1 = f1 / 2.0; // => 0.5_hz auto t1 = 1.0 / 0.5_hz; // => 2_s float res = 2.0_hz * 4_s; // => 8.0 (无量纲) t1 = 10_s - 5_s; // => 5_s t1 = 5_s + 5_s; // => 10_s t1 = 1_s * 0.1; // => 0.1_s f1 = 1.0 / t1; // => 10_hz

注意:Frequency_T 对象不支持加减运算,因为其物理意义不明确。

各算术运算对应的赋值操作是支持的。如:

auto f1 = 0.5_hz * 2; // => 1_hz f1 /= 2; // => 0.5_hz

1.1.3 Ticker_T类

所在命名空间:Kiyun::LowerComputer::Rasl::Frame

4) get方法一

函数原型:static Ticker_T get(Step_t&& step)

函数功能:初始化一个Ticker_T对象

参数:step:用于计算“下一时刻”的函数对象。类型描述为

typedef std::function<unsigned(unsigned)> Step_T;

注意 Frequency_T 和 Timer_T 类的对象均符合这一定义。

返回值:Ticker_T对象

  1. get方法二

函数原型:static Ticker_T get(const Step_t& step)

函数功能:同上。

  1. get方法三

函数原型:static Ticker_T get(Frequency_T freq)

函数功能:初始化一个Ticker_T对象

参数:freq:频率对象。

返回值:Ticker_T对象

  1. start方法

函数原型:void start(Listener_T&& hdl)

函数功能:启动一个系统时钟

参数:hdl: 回调函数,类型描述为:

typedef std::function<bool()> Listener_T;

返回值:无

u 注:hdl返回值为false时,系统时钟对象会被析构

  1. stop方法

函数原型:void stop()

函数功能:停止系统时钟

参数:无

返回值: 无

1.1.4 Timer_T类

实现系统延时功能。

  1. delay方法

函数原型:static void delay(Timeout_T t);

参数:t:延时时间。

typedef Period_T Timeout_T;

返回值:无。

  1. make方法

函数原型:static Timer_T make(Timeout_T t, Listener_T&& lis);

此方法立即返回,并在指定的延时后调用指定的函数。

参数:t:延时时间。

typedef Period_T Timeout_T;

参数:lis:延时到达后调用的回调函数。其原型为:void(Timer_T)

返回值:Timer_T 对象,可供调用 cancel 方法。

  1. cancel方法

函数原型:void cancel();

此方法只能在 make 方法的返回值对象上调用,取消定时器。

  1. restart方法

函数原型:void restart();

此方法只能在 make 方法的返回值对象上调用,定时器将重新开始计时。