设备使用全志 T3,搭载 SylixOS SMP。在使用过程中存在中断响应不及时问题。具体表现为周期 833us 的外部中断偶发性出现周期超过 900us,即中断响应不及时。
中断响应不及时可能存在如下原因:
1)中断碰撞,在触发核上存在其他中断正在执行,且占用时长较长;
2)关中断时间过长,在内核调度过程中存在大量关中断自旋锁操作,如果多个锁碰撞就可能导致关中断时间过长;
下面将针对如上原因罗列常用解决方案:
1)提高中断优先级,开启中断抢占;
2)中断绑核,且独占一个核资源;
3)设置中断绑定核为强亲和性,且不绑定任何线程到此核,这样可以保证此核不会参与调度(正确的现象是此核上的 IPI 中断计数不再增加)。可使用如下程序设置强亲和性:
/*
* 设置 CPU 强亲和性
*/
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
if (API_CpuGetSchedAffinity(sizeof(LW_CLASS_CPUSET), &cpuset)) {
printf("CPU strongly affinity schedule get fail: %s.\n",
lib_strerror(errno));
return (PX_ERROR);
}
if (!CPU_ISSET(3, &cpuset)) {
CPU_SET(3, &cpuset);
if (API_CpuSetSchedAffinity(sizeof(LW_CLASS_CPUSET), &cpuset)) {
printf("CPU strongly affinity schedule set fail: %s.\n",
lib_strerror(errno));
return (PX_ERROR);
}
}
如上操作可以保证核上仅处理一个中断,不存在其他中断(包括 IPI)和任务的干扰,这样可以绝对确保此中断的实时性。