我从一位未知的前任那里接过了一个没有适当文件和评论的项目。 现在我试图分析他的代码,但很难跟进。
基本上, 32个频道与微控制器连接。他似乎想要做的是在从服务器发送这些信息后,在32个频道之间找到从频道。
致电nextslave()
for(scan = 0;(scan = nextslave(chan,scan))!= -1; scan ++)
nextslave()如下所示
/ ** * nextslave - 获取下一个从属通道的通道号 *与主人联系。如果没有更多的从属,则返回-1。 *频道和开始是从零开始的。 * /
short nextslave(short channel, short start)
{
short mask, major, minor;
unsigned char *p;
/* fix-up the slaveflag[] index values */
major = start / 8;
minor = start % 8;
/* init a pointer into the slaveflag[] array */
p = &(chparam[channel].slaveflag[major]);
/* now let us find the next slave channel (if any) */
for (; major < (NUMCHANS / 8) ; major++, p++)
{
minor &= 0x07;
for (mask = (0x01 << minor) ; minor < 8 ; mask <<= 1, minor++)
{
if (*p & mask)
{
/* found one so calculate channel# and return */
return ((major * 8) + minor);
}
}
}
/* if we reach here then there are no (more) slaves */
return (-1);
}
到目前为止我所分析的是:
我不清楚他对这个过程的意图。特别是,在第二个for循环中,如果if(*p&mask)
中没有匹配,则返回第一个for循环。但是,次要变量正在增加,而不会像0 那样清除。因此,一旦代码命中minor &= 0x07
,处理器将按照minor的最后一个值按位进行,尽管主要的var会不断增加。
例如,次要var的范围是0到7 并且没有匹配值,因此在第二个for循环中最终变为 7 。 退出循环并返回第一个循环并将主要变量增加1 。但次要变量仍为7 ,因此第二个循环将从mask =(0x01<<minor)
开始,次= 7 。
我觉得需要在退出第二个for循环时重置minor = 0,但我不知道他的目标是什么。他刚刚写下了“主/从技术”。
我的问题是:
如果您有任何想法,请回答任何有助于我理解其代码的内容。
谢谢, 金