【问题标题】:Is it a good habit to implement functions inside FreeRTOS Tasks?在 FreeRTOS 任务中实现功能是一个好习惯吗?
【发布时间】:2020-12-04 13:42:09
【问题描述】:

我是 FreeRTOS 和实时操作系统的新手。我想知道在 FreeRTOS 任务中实现功能是否是一种好的编程风格。举例

void displayTask(void* param) {

    static void Factorial (params) {
        // doSth
   }

   for(;;) {

       //call it here
       Factorial(params);
   }

}

还是只在任务之外实现它更好?因为如果我有很多功能,我猜想阅读代码会很困难。

【问题讨论】:

  • 取决于您的功能。如果您在其中做繁重的工作,我的意思是,长时间消耗 CPU 的工作说 10 毫秒,那么这样做不是一个好习惯。但是,如果你的函数做了一些不会大量消耗 CPU 的工作,例如只需进行一些基本计算并快速返回就不会出现问题。
  • 标准 C 中不允许嵌套函数。GNU C 编译器将其作为 GNU 扩展支持。 FreeRTOS 任务只是具有特定参数列表的 C 函数。
  • @Kozmotronik 您是否可能误读了这个问题?这不是关于是否应该从任务中调用函数,而是函数定义是否应该出现在任务函数中嵌套。这是一个坏主意,因为它不是有效的 C,而不是因为函数的运行时。这在任何情况下都无关紧要,因为它是一个抢占式调度程序,只要使用 RMA 原则通过适当的优先级分配来满足实时截止日期,低优先级任务长时间运行可能是完全合法的。
  • @Clifford 你是对的,我误读了这个问题。

标签: c embedded freertos


【解决方案1】:

嵌套函数不是有效的 C。您的编译器可能支持它,但在大多数情况下不建议编写只能由特定编译器编译的代码。在您可能希望使用的许多目标不支持 GCC 的嵌入式系统中尤其如此。

以这种方式嵌套函数的唯一好处是限制其范围,使其只能在封闭函数内调用。

在任务中使用该特性在很大程度上是无关紧要的,嵌套函数对运行时没有影响,它像普通函数一样被编译、调用和运行,唯一的区别是在编译时与可见性有关其他代码中的函数。

所以这只是任何功能中的“坏习惯”,而不是具体的任务。

【讨论】:

    猜你喜欢
    • 2011-11-15
    • 2011-08-23
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2017-03-22
    • 2018-08-09
    • 2014-12-22
    • 2020-08-25
    相关资源
    最近更新 更多