xTaskCreate可以被抢占吗?

问题描述 投票:0回答:1

我理解

xTaskCreate
不会调用任务函数,而只是分配必要的调度资源并将任务标记为准备执行。

鉴于 FreeRTOS 是一个抢占式多任务环境,我是否可以保证至少在

xTaskCreate
将任务句柄写入其输出参数之前不会发生任务切换? 考虑以下代码:

typedef struct {
   // .. some data the task needs to do its work
   TaskHandle_t task_handle;
} task_data_t;

task_data_t my_task_data;
xTaskCreate(task_fn, "", 1204, &my_task_data, 
    configMAX_PRIORITIES - 1, &my_task_data.task_handle);

我可以依赖

my_task_data.task_handle
task_fn
开始之前有效吗?或者我应该使用一些额外的同步来确保
task_fn
在它有效之前不会尝试访问
my_task_data.task_handle

或者我希望任务拥有自己的任务句柄存储,而它可以在需要时调用

xTaskGetCurrentTaskHandle()
,这对我来说是 100% 可笑吗?

c freertos
1个回答
0
投票

鉴于 FreeRTOS 是一个抢占式多任务环境,我是否可以 可以保证至少在此之前不会发生任务切换 xTaskCreate 将任务句柄写入其输出参数?

你不能保证不会发生任务切换,但你可以确定在所有初始化完成之前你的任务不会进入RINNING状态。所以你的代码是 100% 安全的

我可以依赖 my_task_data.task_handle 在 task_fn 之前有效吗 开始,或者我应该使用一些额外的同步来确保 task_fn 在执行之前不会尝试访问 my_task_data.task_handle 有效吗?

或者我希望任务有自己的任务是100%可笑的吗? 任务句柄的存储,当它可以调用时 xTaskGetCurrentTaskHandle() 如果需要的话?

你制造了 XY 的问题。您可能需要一个任务句柄来对该任务之外的任务执行某些操作。如果您想访问任务中的句柄,请使用

xTaskGetCurrentTaskHandle()

我使用的 freeRTOS 端口在分配

xTaskCreate

 的参数之前不会将任务置于 RUNNABLE 状态,并且您的代码将正确工作,但不能保证其他端口的行为相同。

© www.soinside.com 2019 - 2024. All rights reserved.