OpenEdv-开源电子网
标题:
Linux workqueue 如何保证快速执行
[打印本页]
作者:
iToday
时间:
2021-9-9 14:48
标题:
Linux workqueue 如何保证快速执行
使用了WK2204 SPI转UART芯片;
对应的驱动中在收数据时通过中断通知有数据到达,中断中启用workqueue去读取SPI数据;
现在的问题是,当接收大量数据时,出现中断响应后,workqueue的worker函数体执行因系统调度问题不会立即执行,导致WK2204中数据未及时读取出来导致溢出,出现丢数据,概率3%;
线想提升workqueue的优先级,我尝试将读取worker挂到system_highpri_wq上,问题有一定改善,但还是会0.1%概率出现溢出导致的丢数据;
各位大神,还有其他方式可以提高中断下半部响应时间的方法吗?
作者:
iToday
时间:
2021-9-9 14:57
static irqreturn_t wk2xxx_irq(int irq, void *dev_id)//
{
struct wk2xxx_port *s = dev_id;
disable_irq_nosync(s->port.irq);
s->irq_flag = 1;
if(wk2xxx_dowork(s))
{
;
}
else
{
s->irq_flag = 0;
s->irq_fail = 1;
}
return IRQ_HANDLED;
}
/////////////////////////////////////////////////////////
static int wk2xxx_dowork(struct wk2xxx_port *s)
{
if (!s->force_end_work && !work_pending(&s->work) && !freezing(current) && !s->suspending)
{
queue_work(s->workqueue, &s->work);//
return 1;
}
else
{
return 0;
}
}
//////////////////////////////////////////////////////////////////////////
static void wk2xxx_work(struct work_struct *w)
{
struct wk2xxx_port *s = container_of(w, struct wk2xxx_port, work);
uint8_t rx;
int work_start_tx_flag;
int work_stop_rx_flag;
int work_irq_flag;
int work_conf_flag;
......
}
上面是中断函数及worker函数,我在加日志统计了中断函数到worker函数执行的时间间隔发现,大部分在1ms内,偶尔会到10ms,这个时候就会出现溢出;
作者:
正点原子
时间:
2021-9-11 23:59
帮顶
欢迎光临 OpenEdv-开源电子网 (http://www.openedv.com/)
Powered by Discuz! X3.4