我的系统正在使用Arm cortexa7 @ 1GHz和来自CIP社区的实时补丁集Linux 4.4.138-rt19:v4.4.138-cip25-rt19
我已经运行了 prio-preempt.c 验证我系统上的优先级抢占。但是我遇到了一个问题: 该系统可能只运行少于创建的27个线程的多个线程。
关于理论方面,ltp应用程序prio-preempt创建了具有不同优先级的27个worker_threads,具有高优先级的N个busy_threads(N:取决于CPU的数量,在我的情况下为N = 2)和master_thread(最高优先级)。
将应用程序部署到开发板上时, threads_running 始终低于27,而 create_fifo_thread(worker_thread,i,...)成功创建了27个worker_thread。 我在cortexa15@1.5GHz上运行了相同的程序,但问题没有发生。
为了进一步了解,我认为问题可能出在 bmutex 锁定释放后,Linux RT调度程序无法唤醒睡眠线程。
有人对我有同样的问题吗?请分享您的想法。
答案 0 :(得分:0)
基本上,在Linux FULL Preemptive RT系统中,较高优先级的线程始终会抢占较低优先级的线程来控制CPU。就我而言,这个问题实际上发生在甚至更高速度的处理器上,我在双cortexa15@1.5 GHz或四核cortexa15@1.4GHz上进行了测试。但是,失败率要低得多。
由于问题是随机发生的,因此在发生故障的情况下,所有CPU都同时执行优先级较高的线程,而忘记了优先级较低的线程。
因此,我分配了一个特定的CPU来执行特定的线程(高优先级)。
#define CPU_0 0x01 /* Bind CPU 0 */
#define CPU_1 0x02 /* Bind CPU 1 */
#define CPU_2 0x04 /* Bind CPU 2 */
#define CPU_3 0x08 /* Bind CPU 3 */
...
{
unsigned long cpuset = CPU_0;
if (pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset) < 0) {
printf("failed to pthread_setaffinity_np\n");
}
}
并让其他CPU进行其他工作(低pri)。 我的系统不再挂断,可能运行了全部27个worker_thread(低优先级线程)