通过 prio-preempt 在 Linux RT LTS4.4 上测试优先级抢占
Testing priority preemption on Linux RT LTS4.4 by prio-preempt
我的系统使用带有实时补丁集的 Arm cortexa7@1GHz Linux 来自 CIP 社区的 4.4.138-rt19:v4.4.138-cip25-rt19
我有 运行 个
prio-preempt.c
验证我的系统上的优先权抢占。但是我运行宁一个问题:
系统可能只有 运行 个少于 27 个已创建线程的线程数。
关于理论方面,ltp 应用程序 prio-preempt 创建了 27 个 worker_threads 具有不同的优先级,N busy_threads(N:取决于 CPU(s) 的数量,在我的case N = 2) 具有高优先级,并且 master_thread(最高优先级)。
部署应用到开发板时,threads_running总是低于27,而create_fifo_thread(worker_thread ,i,...) 成功创建了 27 worker_thread(s)。
我在 cortexa15@1.5GHz 上 运行 上面的相同程序,问题没有发生。
为了进一步观察,我认为问题可能来自 Linux RT 调度程序无法在 bmutex 之后唤醒 睡眠线程 锁定已释放。
有人遇到和我一样的问题吗?请分享你的想法。
基本上,在Linux FULL Preemptive RT 系统中,高优先级线程总是抢占低优先级线程来控制CPU(s)。就我而言,问题实际上发生在速度更高的处理器上,我在双 cortexa15@1.5 GHz 或四核 cortexa15@1.4GHz 上进行了测试。不过,失败率要低很多。
因为这个问题是随机发生的,在失败的情况下,所有 CPU(s) 同时执行优先级较高的线程而忽略优先级较低的线程。
所以,我分配了某个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(s) 来做其他工作(低优先级)。
我的系统不再挂断并且可能运行所有 27 worker_thread(低优先级线程)
我的系统使用带有实时补丁集的 Arm cortexa7@1GHz Linux 来自 CIP 社区的 4.4.138-rt19:v4.4.138-cip25-rt19
我有 运行 个 prio-preempt.c 验证我的系统上的优先权抢占。但是我运行宁一个问题: 系统可能只有 运行 个少于 27 个已创建线程的线程数。
关于理论方面,ltp 应用程序 prio-preempt 创建了 27 个 worker_threads 具有不同的优先级,N busy_threads(N:取决于 CPU(s) 的数量,在我的case N = 2) 具有高优先级,并且 master_thread(最高优先级)。
部署应用到开发板时,threads_running总是低于27,而create_fifo_thread(worker_thread ,i,...) 成功创建了 27 worker_thread(s)。 我在 cortexa15@1.5GHz 上 运行 上面的相同程序,问题没有发生。
为了进一步观察,我认为问题可能来自 Linux RT 调度程序无法在 bmutex 之后唤醒 睡眠线程 锁定已释放。
有人遇到和我一样的问题吗?请分享你的想法。
基本上,在Linux FULL Preemptive RT 系统中,高优先级线程总是抢占低优先级线程来控制CPU(s)。就我而言,问题实际上发生在速度更高的处理器上,我在双 cortexa15@1.5 GHz 或四核 cortexa15@1.4GHz 上进行了测试。不过,失败率要低很多。
因为这个问题是随机发生的,在失败的情况下,所有 CPU(s) 同时执行优先级较高的线程而忽略优先级较低的线程。
所以,我分配了某个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(s) 来做其他工作(低优先级)。 我的系统不再挂断并且可能运行所有 27 worker_thread(低优先级线程)