5

在 vxworks 中,是否应该使用 VX_FP_TASK 选项生成每个任务?

如果您的任务使用任何浮点运算,则需要 VX_FP_TASK 选项。但是一个人如何预测未来 - 我的意思是,一个人怎么知道他/她是否会使用浮点数?

在修复任何错误或引入新代码时,程序员是否应该找到所有任务将受到他/她的代码更改的影响,以及该任务是否使用此选项产生?这是非常乏味的。我错过了什么吗?

4

3 回答 3

6

VX_FP_TASK 强制任务上下文切换包括 FP 寄存器。这增加了上下文切换时间。如果在你的申请时间内,即使有这个开销也能满足截止日期和性能目标,那么我建议这样做几乎没有问题。没有 VX_FP_TASK 可能被认为是一种优化,只有在必要时才谨慎应用。因此,如果默认情况是使用 VX_FP_TASK,那么在您可能需要优化性能的少数情况下,您可能需要进行较少的检查;因为通常不需要优化来达到所需的结果。如果这强加的上下文切换性能开销决定了您的项目的成败,那么它在任何情况下都可能是微不足道的。

另一方面,尽管在嵌入式系统中 FPU 变得越来越普遍,但由于传统上缺乏硬件 FP 支持,嵌入式系统设计人员将 FP 用作例外而不是规则也很常见。因此,一种解决方案是制定内部设计规则,即在没有正式证明和签署的情况下不得使用浮点:即必须在设计中使用浮点,而不是程序员的决定。检查通常是一种简单的情况,即扫描floatdouble和的源math.h。(因为如果代码中不出现这些情况,可能很难使用浮点)。例如,您可以添加一个预构建静态分析检查来查找这些并标记警告。

在许多应用程序中,可以设计使 FP 数学运算自然地局限于特定任务。但是,当有人选择使用旨在用于其中一项任务的现有函数时,就会出现问题,而另一项任务不是 FP 安全的。这可能很难发现;对此的解决方案是拥有使用浮点并且可以在其他任务中使用的函数,以包括使用 taskOptionsGet() 测试任务选项的调试 ASSERT。

float因此,结合使用、double和进行扫描,math.h并向使用它们的函数添加 ASSERT 检查可能会保护您避免在代码维护中引入错误。

[添加于 2010 年 2 月 14 日]

尽管复杂的宏通常是一件坏事,但我建议以下内容可能有用(如上所述):

#if NDEBUG
    #define ASSERT_FP_SAFE() ((void) 0)
#else
    #define ASSERT_FP_SAFE() do{ int opt; \
                                 STATUS st = taskGetOptions( taskIdSelf(), &opt ); \
                                 assert( st == OK && (opt & VX_FP_TASK) != 0 ) ; \
                               }while(0) ;
#endif

这个宏应该插入到任何使用 float 或 double 的函数中,或者包含或您可能使用的任何其他 FP 相关库(您可以通过文本搜索来实现)。当从非 FP 任务调用此类函数时,断言将失败。

请注意,从 taskGetOptions() 返回的检查将捕获中断上下文中浮点的使用。尽管如果断言发生在中断中,您可能不会得到任何输出。调用 logMsg() 可能更安全;如果 st != OK 和 assert() 否则你可以使用它。

不幸的是,它是一个运行时断言,因此必须运行代码才能对其进行检查。如果能通过静态分析来检测就更好了,但是我想不出一个简单的方法。但是,如果您还使用代码覆盖率分析,那么这可能就足够了。即使您确实选择将所有任务设为 VX_FP_TASK,这也可能是一个好习惯;这样,如果有人忘记做其中一个,你就有机会抓住它。

于 2010-02-12T09:51:45.077 回答
3

根据经验,我可以给您一个简单的答案:始终使用 VX_FP_TASK 生成任务。特别是如果您的代码可用于不同的架构。

根据编译器(gnu、diab)、您使用的编译标志和体系结构,浮点寄存器不仅可以用于浮点操作。在大多数架构中,FP 寄存器比常规寄存器大,因此它们成为优化代码的完美候选者。

例如,在 PPC603 处理器中,如果您使用 C++ 而不是普通 C,FP 寄存器将用于优化,如果您没有在该任务上启用 VX_FP_TASK,它可能会损坏另一个任务的 FP 寄存器,即使它是不做任何计算!

正确执行比性能更重要,而且大多数时候性能增益并不能证明不启用它所带来的风险是合理的。

如果要确保所有任务都启用了标志,请考虑使用 taskCreateHookAdd( ) 添加一个在创建任务期间始终启用标志的钩子

于 2010-02-15T21:43:01.640 回答
2

始终使用 VX_FP_TASK!没有它的成本,以及试图追踪导致的不稳定错误的成本是令人难以置信的昂贵。

于 2012-01-21T00:22:49.657 回答