OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4406|回复: 2

Linux workqueue 如何保证快速执行

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-11-17
在线时间
10 小时
发表于 2021-9-9 14:48:50 | 显示全部楼层 |阅读模式
1金钱
使用了WK2204 SPI转UART芯片;
对应的驱动中在收数据时通过中断通知有数据到达,中断中启用workqueue去读取SPI数据;

现在的问题是,当接收大量数据时,出现中断响应后,workqueue的worker函数体执行因系统调度问题不会立即执行,导致WK2204中数据未及时读取出来导致溢出,出现丢数据,概率3%;

线想提升workqueue的优先级,我尝试将读取worker挂到system_highpri_wq上,问题有一定改善,但还是会0.1%概率出现溢出导致的丢数据;

各位大神,还有其他方式可以提高中断下半部响应时间的方法吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-11-17
在线时间
10 小时
 楼主| 发表于 2021-9-9 14:57:25 | 显示全部楼层
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,这个时候就会出现溢出;
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-9-11 23:59:19 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 15:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表