4

I have seen quite a lot of code that uses the cycle time of the Runnable for implementing some timer/timeout. The problem is that if someone decides to change the cycle time of this Runnable, the timer will be incorrect. Example:

#define FOO_TIMER_100MS_REACHED (10U)

FUNC(void, FOO_CODE) FOO_Cycle_10ms( void )
{
  static uint8 t = 0;

  if( t < FOO_TIMER_100MS_REACHED )
  {
    t++;
  }
  else
  {
    ; /* 100ms elapsed - do whatever is necessary */
  }
}

So, how can I determine the cycle time of periodically triggered function FOO_Cycle_10ms from inside this Runnable? In respect to the example above I'm looking for something like:

#define FOO_TIMER_100MS_REACHED ((uint8)(100U / CYCLE_TIME_FOO_Cycle_10ms))
4

3 回答 3

0

我也有同样的讨论,因为这实际上发生在一个热修复中。我们看到了一个潜在的解决方案,可以将Os_ServiceSWS_Os_00560添加到测量时间的组件中,但从未真正尝试过。

我们也看到了Stbm解决方案,因为我们在各自的项目中没有模块。

于 2021-11-17T12:32:03.960 回答
0

问题是如果有人决定改变这个 Runnable 的循环时间,计时器就会不正确。

但这真的会发生吗?软件组件描述 (SWCD) 始终与实现紧密耦合。如果有人会更改例如 SWCD 中的可运行名称或删除访问点,则代码也不会编译。

集成商可以在后期开发阶段更改其他参数,例如可运行到任务的映射,但该时间段是 SWCD 的一部分,因此也与实施相结合。

因此,恕我直言,所描述的问题不应该发生。如果这不能回答您的问题,请提供有关实际用例的更多信息。

于 2016-09-13T18:23:24.963 回答
0

好吧,SWCD 实际上是您的合同,应该与 SWCD 和开发人员的负责人讨论更改。如果不是,那么你的过程有缺陷。

另一方面,有一些方法:

  • 也许您可以从您的 SWCD 计时事件期间创建一个常量值
  • 为 TimeService (Tm) 模块创建一个 ClientServer 接口并设置它。Tm 允许一些方便的 SW 定时器,这些定时器由一些 GPT 预定义定时器支持
  • 使用 StbM-ServiceNeeds 为您的 SWCD 创建一个 ClientServer 接口。然后您应该能够访问同步时基。
于 2017-07-18T03:20:23.317 回答