从代码和打印结果来看,问题出现在自增运算符的副作用和执行顺序上。
问题分析
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);
这里的关键问题是:
- 第一行使用了
num++ - 第二行又使用了
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助手提供,问题来源于学员提问




