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