在我的嵌入式设备中,我吸收了我们使用的协议的奇怪行为,有时需要一段时间才能使用 FIFO 通过串行设备发送数据。
我怀疑Linux不是实时操作系统,为什么它们有这样的实时模拟功能,例如pthread_setschedparam?并且在队列中具有这样的优先级导致另一个进程因检测从属设备而挨饿。
我只是想知道是否建议使用 param.sched_priority = 40;在 Linux 中?我尝试调整此参数,但问题很难在现场重现这种情况。
这是代码
if (1)
{
int policy;
int r;
struct sched_param param;
policy = SCHED_FIFO;
param.sched_priority = 40;
r = pthread_setschedparam(cc_state->ser_thread, policy, ¶m);
printf("%s: pthread_setschedparam %d", __func__, r);
}
答案1
Linux实时不是仿真,有影响调度的系统调用。看man sched(7)
。从你的问题中不清楚你想做什么以及你的确切问题是什么。的值sched_priority
仅与其他线程的优先级相关。例如,如果只有一个优先级 > 0 的线程,那么优先级是 1 还是 40 都没有关系;较高的值不会给线程带来额外的“提升”。您必须确定线程所需的相对优先级,并相应地为它们分配优先级值。
请注意,没有与SCHED_FIFO
线程关联的时间量。线程SCHED_FIFO
将一直运行,直到发生以下情况之一:线程因等待 I/O 而被阻塞、更高优先级的线程已准备好运行,或者线程自愿让出处理器。如果您有多个具有相同优先级的线程,则必须考虑这一点,否则一个线程可能会占用其他线程的 CPU。在多处理器计算机上,多个线程当然可以在各自的 CPU 上同时运行。