在我的嵌入式设备中,我使用我们使用的协议吸收了奇怪的行为,有时使用 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);
}
Linux实时不是仿真,有系统调用影响调度。见
man sched(7)
。从您的问题中不清楚您要做什么以及您的确切问题是什么。的值sched_priority
仅与其他线程的优先级相关。例如,如果只有一个线程的优先级 > 0,那么优先级是 1 还是 40 都没有关系;较高的值不会给线程带来额外的“提升”。您必须确定线程所需的相对优先级并相应地为其分配优先级值。请注意,没有与
SCHED_FIFO
线程相关的时间片。线程会一直运行,SCHED_FIFO
直到发生以下情况之一:线程因为等待 I/O 而被阻塞,更高优先级的线程已准备好运行,或者线程自愿让出处理器。如果您有多个具有相同优先级的线程,则必须考虑到这一点,否则一个线程可能会占用其他线程的 CPU。在多处理器机器上,多个线程当然可以在各自的 CPU 上同时运行。