ZBLOG

驱动代码 void kalRxTaskletSchedule(struct GLUE_INFO *pr) { static unsigned int num = 0; tasklet_hi_schedule(&pr->rRxTask[(num++)%NR_CPUS]); // tasklet_hi_schedule(&pr->rRxTask); DBGLOG(HAL, ERROR, "lucky:%s:%d--(num++)%%NR_CPUS:%d\n",__func__,__LI...

从代码和打印结果来看,问题出现在自增运算符的副作用执行顺序上。

问题分析

static unsigned int num = 0;
tasklet_hi_schedule(&pr->rRxTask[(num++)%NR_CPUS]);
DBGLOG(HAL, ERROR, "lucky:%s:%d--(num++)%%NR_CPUS:%d\n",__func__,__LINE__,(num++)%NR_CPUS);

这里的关键问题是:

  1. 第一行使用了 num++
  2. 第二行又使用了 num++

执行过程分析

假设 NR_CPUS = 4,执行流程如下:

第一次调用:
- tasklet_hi_schedule: (0)%4 = 0,然后num变为1
- DBGLOG: (1)%4 = 1,然后num变为2

第二次调用:
- tasklet_hi_schedule: (2)%4 = 2,然后num变为3  
- DBGLOG: (3)%4 = 3,然后num变为0(如果unsigned int溢出)

第三次调用:
- tasklet_hi_schedule: (0)%4 = 0,然后num变为1
- DBGLOG: (1)%4 = 1,然后num变为2

第四次调用:
- tasklet_hi_schedule: (2)%4 = 2,然后num变为3
- DBGLOG: (3)%4 = 3,然后num变为0

这样就形成了你看到的 1,3,1,3… 的模式。

解决方案

修改代码为:

void kalRxTaskletSchedule(struct GLUE_INFO *pr)
{
    static unsigned int num = 0;
    unsigned int index = num % NR_CPUS;
    num++;
    
    tasklet_hi_schedule(&pr->rRxTask[index]);
    DBGLOG(HAL, ERROR, "lucky:%s:%d--index:%d\n", __func__, __LINE__, index);
}

这样就能保证每次只自增一次,并且tasklet调度和日志打印使用相同的索引值。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24431

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?