不要直接从用户代码更改任务的优先级。大多数 RTOS 提供了使我们能够做到这一点的 API,但这是一种糟糕的风格,因为它产生的问题比它所能解决的要多。一个例外是当某些 RTOS 在内部对此起作用时(例如,具有优先级继承的互斥锁以避免某些多任务问题)。
我猜您只想在系统的启动阶段或运行时的另一个非常特殊的阶段拥有更长的关键部分。否则,您应该真正听取@Clifford 的评论并质疑您的优先分配和任务分解。
如果您仅在初始化/上电阶段需要该连续周期,这也是一种典型的情况,也可以通过良好的任务设计来实现。在这种情况下,您需要的是运行级别管理。
运行级别管理
实现这一点的最简单方法是在 RTOS 之上编写一个小库,使用两个计数信号量资源:一个用于当前运行级别,另一个用于下一个运行级别。当输入运行级别时,信号量将填充与必须在运行级别管理控制下的任务一样多的标记。每个等待处理给定运行级别的任务都试图从当前运行级别的信号量中获取其令牌。当任务完成其运行级别部分时,它会访问下一级信号量,此时该信号量将不可用。
在填充运行级别管理配置之前,您可以自己绘制一个
序列图
来检查在哪些点上,任务必须等待其他任何原因。通常对于每个任务,只有少数运行级别是相关的 - 每个运行级别,相关任务的集合也可能很小。因此,您可能想要添加一个小辅助函数,例如WaitForRunlevelNumber(N)
自动处理那些不相关的运行级别的循环。
如果需要显式同步的所有阶段都已完成,则必须完成运行级别管理。然后,所有任务都被释放到自由中。有时,如果低优先级任务已完成所有关键阶段,您希望提前释放它们。然后,维护的任务数量可能会从一个运行级别减少到下一个运行级别。