Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 软实时Linux调度_C_Linux_Embedded_Real Time_Rtos - Fatal编程技术网

C 软实时Linux调度

C 软实时Linux调度,c,linux,embedded,real-time,rtos,C,Linux,Embedded,Real Time,Rtos,我有一个软实时要求的项目。我有两个进程(我编写的程序)来进行数据采集。在任何一种情况下,我都需要不断地读入数据并对其进行处理 第一个程序是线程化的,第二个程序使用了一个应该线程化的库,但我不知道引擎盖下到底发生了什么。每个程序都由用户执行(默认情况下),我看到每个程序的优先级为20,值为0。每个程序使用大约30%的CPU 目前,这两个进程都必须与一些后台进程竞争,我想让我的两个程序尽可能在CPU上发挥最大的作用。我的主要问题是,我有一个与我交谈的设备,它有一个64字节的硬件缓冲区,如果我没有及时

我有一个软实时要求的项目。我有两个进程(我编写的程序)来进行数据采集。在任何一种情况下,我都需要不断地读入数据并对其进行处理

第一个程序是线程化的,第二个程序使用了一个应该线程化的库,但我不知道引擎盖下到底发生了什么。每个程序都由用户执行(默认情况下),我看到每个程序的优先级为20,值为0。每个程序使用大约30%的CPU

目前,这两个进程都必须与一些后台进程竞争,我想让我的两个程序尽可能在CPU上发挥最大的作用。我的主要问题是,我有一个与我交谈的设备,它有一个64字节的硬件缓冲区,如果我没有及时从中读取,我会得到一个溢出。我注意到这种情况每2-3小时运行一次

根据我的研究()似乎有三种方法可以左右优先级:

  • 将nice值设置为一个较低的数字,从而为每个进程赋予更高的优先级。我可以使用nice命令在不修改代码(或使用系统调用)的情况下执行此操作

  • 将sched_setscheduler()用于特定调度策略的整个进程

  • 使用pthread_setschedparam()单独设置每个pthread

  • 我遇到了以下障碍:

  • 假设我使用选项3,如何防止低优先级线程被饿死?是否还有一种方法可以确保共享锁导致低优先级线程升级为高优先级线程?假设我有一个实时线程SCHED_RR,它与默认的SCHED_OTHER线程共享一个锁。当SCHED_OTHER线程获得锁时,我希望它执行@higher priority以释放锁。我如何确保这一点

  • 如果一个SCHED_RR线程创建了另一个线程,那么新线程是自动SCHED_RR的,还是我需要指定它?如果我有一个设置为SCHED_RR的进程,那么它的所有线程都会自动遵循这个策略吗?如果一个SCHED_RR进程生成了一个子进程,那么它是否也会自动生成SCHED_RR呢

  • 考虑到代码只占用了60%的CPU,这有什么关系吗?或者CPU与后台进程共享时是否仍然存在我应该关注的问题,并可能导致缓冲区溢出

  • 很抱歉这个冗长的问题,但我觉得它需要一些背景信息。提前感谢您的帮助。

    (1)

    (2) 新创建的线程继承其创建线程的计划和优先级,除非在调用
    pthread\u create
    时它的线程属性(例如/)被指示执行其他操作


    (3) 因为你现在不知道是什么原因导致了它,所以公平地说,任何人都很难保证。

    64字节的硬件缓冲区应该不重要,因为驱动程序应该有更多的缓冲区空间。如何与驱动程序通信?芯片本身是一个i2c到uart的桥接器,只能保存64字节的uart数据。目前,我正在通过打开/dev/i2c文件不断轮询芯片。据我所知,目前还没有更好的驱动程序可用,我正处于时间紧迫的情况下,没有时间把更好的东西放在一起。最高优先级的阻塞读取不够快?对于99%的情况来说是这样,但我每两个小时就有一个FIFO溢出。实际上,我已经将我的程序的nice级别提高到-20,我还没有看到任何问题,但是可能需要更多的测试。我知道我正在做的I/O工作相当于用止痛药治疗脑瘤,但看起来它成功了。