使用主/从迭代理解逻辑

时间:2013-11-20 22:19:25

标签: c

我从一位未知的前任那里接过了一个没有适当文件和评论的项目。 现在我试图分析他的代码,但很难跟进。

基本上, 32个频道与微控制器连接。他似乎想要做的是在从服务器发送这些信息后,在32个频道之间找到从频道

  1. 致电nextslave()

    for(scan = 0;(scan = nextslave(chan,scan))!= -1; scan ++)

  2. nextslave()如下所示

  3. / **  * 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);
    }
    

    到目前为止我所分析的是:

    1. start变量在nextslave()中一直迭代到32。
    2. 当start var为0~7时,major var为0,minor var从0变为7,还有掩码var变化1,2,4,8,16 ...
    3. 当start var为8~15时,major var为1,minor var仍然从0变为7
    4. 继续迭代,直到大变量变为4.(我不知道他的代码中主要var的含义)
    5. 在第二个for循环中,返回一些if * p(指向服务器值的指针)&amp;面具是真的
    6. 我不清楚他对这个过程的意图。特别是,在第二个for循环中,如果if(*p&mask)中没有匹配,则返回第一个for循环。但是,次要变量正在增加,而不会像0 那样清除。因此,一旦代码命中minor &= 0x07,处理器将按照minor的最后一个值按位进行,尽管主要的var会不断增加。

      例如,次要var的范围是0到7 并且没有匹配值,因此在第二个for循环中最终变为 7 退出循环并返回第一个循环并将主要变量增加1 。但次要变量仍为7 ,因此第二个循环将从mask =(0x01<<minor)开始,次= 7

      我觉得需要在退出第二个for循环时重置minor = 0,但我不知道他的目标是什么。他刚刚写下了“主/从技术”

      我的问题是:

      1. 我的分析是否正确?
      2. 主/从技术如何用于32个通道获得ADC?
      3. 是否需要重置代码的重置代码?每当出第二个for循环时。
      4. 如果您有任何想法,请回答任何有助于我理解其代码的内容。

        谢谢, 金

0 个答案:

没有答案