【问题标题】:Comparing tasks in freertos比较 freertos 中的任务
【发布时间】:2020-06-07 14:38:53
【问题描述】:

我有一个 (cpp) 对象,它可以在多个任务之间共享,但归单个任务所有(在 TaskHandle_t ownerTask 中创建对象时保存所有者任务句柄)。现在,当我运行该对象的某个函数时,我需要检查请求该函数执行的当前任务是否是所有者任务。

如何测试当前任务是否与已保存句柄的任务相同?问题是项目中的 configuse_TRACE_FACILITY 设置为 0(并且是这样的),因此 TCB(句柄指向的)没有成员 uxTaskNumber。

自己在 TCB 中添加一个成员来跟踪任务编号(例如 taskID)是否是个好主意,然后在将任务添加到就绪列表时设置它?

【问题讨论】:

    标签: embedded real-time microcontroller freertos


    【解决方案1】:

    有一个 xTaskGetCurrentTaskHandle() 函数返回 TaskHandle_t,这就是我假设你想要的。

    然而,真正的问题是你为什么首先想要这样的功能。对我来说,这听起来像是您正在尝试创建某种自己的资源所有权逻辑 - 为什么不使用互斥锁?如果您的目标是不通过最初创建它的任务以外的任务使用给定对象,您可以例如在对象内嵌入一个递归互斥锁(而不是任务句柄),然后获取互斥锁而不将其返回。然后检查对象所有权的逻辑可以简单地尝试以 0 等待时间获取互斥锁。

    【讨论】:

    • 很好的答案!我同意在没有任何可配置的附加功能的情况下比较任务句柄将满足 OP 的要求,并且我同意问题是从一般任务中请求任务 ID 是否是糟糕的设计。
    • 好的,应用程序位于 freeRTOS 上,在系统进入 freeRTOS 任务之前,通过一些对象完成配置。现在的要求是允许根据他们想要的所有者任务修改这些对象
    • 那么你的意思是你想在 RTOS 实际运行之前使用一些 RTOS 功能(在这个例子中检索任务句柄)。这不是我所说的干净设计。如果他们决定以改变这种行为的方式改变实现——例如在 RTOS 启动后分配任务句柄值——那么你的代码就会中断。我个人会创建一个执行配置的任务,然后使用互斥锁来处理所有权。如果您仍然想按自己的方式行事,那么还有我上面提到的xTaskGetCurrentTaskHandle() 函数。
    猜你喜欢
    • 2016-08-07
    • 1970-01-01
    • 2016-12-25
    • 2021-06-05
    • 2023-03-03
    • 1970-01-01
    • 2013-12-31
    • 2020-12-17
    • 2021-02-05
    相关资源
    最近更新 更多