gpt4 book ai didi

vxworks - 在 vxworks 中,每个任务都应该使用 VX_FP_TASK 选项生成吗?

转载 作者:行者123 更新时间:2023-12-02 17:09:06 28 4
gpt4 key购买 nike

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

如果您的任务使用任何浮点运算,则需要 VX_FP_TASK 选项。但是一个人如何预测 future ——我的意思是,一个人如何知道他/她是否会使用 float 呢?

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

最佳答案

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

另一方面,尽管在嵌入式系统中 FPU 变得越来越普遍,但由于传统上缺乏硬件 FP 支持,嵌入式系统设计人员通常将 FP 作为异常(exception)而不是规则。因此,一种解决方案是制定一项内部设计规则,即未经正式论证和签署,不得使用浮点:即浮点的使用必须在设计中,而不是程序员决定。检查通常是扫描源 float 的简单情况。 , double ,和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 的函数中,或者包含 <math.h> 的函数中。或您可能使用的任何其他 FP 依赖库(您可以通过文本搜索来实现)。当从非 FP 任务调用此类函数时,断言将失败。

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

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

关于vxworks - 在 vxworks 中,每个任务都应该使用 VX_FP_TASK 选项生成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250476/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com