Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
04/28/08 21:59
Modified:
  04/28/08 22:58

Read: times


 
Msg Score: +1
 +1 Informative
#154128 - Followup on slave enumeration algorithm
For what it's worth, I had a bit of spare time today and wrote a simulation of the slave searching algorithm that we were discussing a few days ago here. From the brief testing that I did, it appears that the algorithm works as expected. Maybe this program could serve as a starting point for somebody who wants to implement it for real.

-- Russ
/* ////////////////////////////////////////////////////////////////////////////
                                    enum.c
///////////////////////////////////////////////////////////////////////////////
DESCRIPTION:    Simulation of Erik Malund's slave enumeration scheme as
                described here:

                    http://www.8052.com/forumchat/read.phtml?id=153935

                You'll want to read that description and the thread it's in to
                fully understand this program.

REVISIONS:      28 Apr 08 - RAC - Genesis
//////////////////////////////////////////////////////////////////////////// */

#include <stdio.h>

/* ////////////////////////////////////////////////////////////////////////////
                               Names for Numbers
//////////////////////////////////////////////////////////////////////////// */

#define ADDRESS_WIDTH   5                       // Must be 32 or less

/* ////////////////////////////////////////////////////////////////////////////
                          Local Function Prototypes
//////////////////////////////////////////////////////////////////////////// */

void DoNode  (int, int);
void SetBit  (unsigned *, int);
void ClearBit(unsigned *, int);
int  CheckBit(unsigned, int);
void Dump(unsigned);
int CheckSlaves(void);

/* ////////////////////////////////////////////////////////////////////////////
                               Module Variables
//////////////////////////////////////////////////////////////////////////// */

unsigned testAddress;
unsigned mask;

unsigned slaveAddresses[] = { 0x00000000,       // Addresses of slaves present
                              0x10000000,
                              0x20000000,
                              0xD0000000,
                              0xE0000000,
                              0xF0000000
                              };

#define NUM_SLAVES (sizeof(slaveAddresses) / sizeof(unsigned))

/* ////////////////////////////////////////////////////////////////////////////
                                    main()
///////////////////////////////////////////////////////////////////////////////
DESCRIPTION:    This function drives the simulation.

REVISIONS:      28 Apr 08 - RAC - Genesis
//////////////////////////////////////////////////////////////////////////// */

void main() {
    DoNode(0, 0);
    DoNode(0, 1);
    }

/* ////////////////////////////////////////////////////////////////////////////
                                   DoNode()
///////////////////////////////////////////////////////////////////////////////
DESCRIPTION:    This function recursively processes the nodes in the tree of
                slave addresses.

REVISIONS:      28 Apr 08 - RAC - Genesis
//////////////////////////////////////////////////////////////////////////// */

void DoNode(int level, int bit) {

    int matches;

    bit ? SetBit  (&testAddress, level) :       // Cook up a new test address
          ClearBit(&testAddress, level);        //  bit
    SetBit(&mask, level);                       // Cook up a new mask bit
    matches = CheckSlaves();                    // Get count of matching slaves
    printf("Address: "); Dump(testAddress);     // Dump info for inspection to
    printf("  Mask: ");  Dump(mask);            //  see how the algorithm works
    printf("  Matches: %d\n", matches);    
    if ((level < ADDRESS_WIDTH - 1) &&          // If not at bottom of tree,
        (matches > 1)) {                        //  and still need to search
        DoNode(level + 1, 0);                   //  further, descend one level
        DoNode(level + 1, 1);                   //  and keep searching
        }
    ClearBit(&mask,        level);              // Restore to previous level
    ClearBit(&testAddress, level);
    }                                           // End DoNode()

/* ////////////////////////////////////////////////////////////////////////////
                                   SetBit()
                                  ClearBit()
                                  CheckBit()
///////////////////////////////////////////////////////////////////////////////
DESCRIPTION:    Bit manipulators.

REVISIONS:      28 Apr 08 - RAC - Genesis
//////////////////////////////////////////////////////////////////////////// */

void SetBit(unsigned *bits, int position) {
    *bits |= (0x80000000U >> position);
    }

void ClearBit(unsigned *bits, int position) {
    *bits &= ~(0x80000000U >> position);
    }

int CheckBit(unsigned bits, int position) {
    return (bits & (0x80000000U >> position)) ? 1 : 0;
    }

/* ////////////////////////////////////////////////////////////////////////////
                                    Dump()
///////////////////////////////////////////////////////////////////////////////
DESCRIPTION:    Dumps a bit string

REVISIONS:      28 Apr 08 - RAC - Genesis
//////////////////////////////////////////////////////////////////////////// */

void Dump(unsigned bits) {

    int i;

    for (i=0; i<ADDRESS_WIDTH; i++) {
        printf(CheckBit(bits, i) ? "1" : "0");
        }
    }                                           // End Dump()

/* ////////////////////////////////////////////////////////////////////////////
                                 CheckSlaves()
///////////////////////////////////////////////////////////////////////////////
DESCRIPTION:    This function checks the current testAddress and mask against
                a hard-coded list of slave addresses.  It returns the number of
                matches.

REVISIONS:      28 Apr 08 - RAC - Genesis
//////////////////////////////////////////////////////////////////////////// */

int CheckSlaves() {

    int count;                                  // Count matches here
    int j;                                      // A generic integer

    count = 0;                                  // No matches yet
    for (j=0; j<NUM_SLAVES; j++) {              // For each slave present

        if ((testAddress & mask) ==
            (slaveAddresses[j] & mask)) {       // This slave matches
            count++;                            // Count it
            printf("Match with slave address "  // Dump its address so we can
                "%08X\n", slaveAddresses[j]);   //  see how the algorithm works
            }                                   // End 'this slave matches'
        }
    return count;                               // Count of matching slaves
    }                                           // End CheckSlaves()




List of 19 messages in thread
TopicAuthorDate
Followup on slave enumeration algorithm            01/01/70 00:00      
   algorithm            01/01/70 00:00      
      well, it's simple            01/01/70 00:00      
      Typo            01/01/70 00:00      
      a matter of time            01/01/70 00:00      
         Time            01/01/70 00:00      
            figure it out this way            01/01/70 00:00      
            Guessing the time            01/01/70 00:00      
   More on theory vs. practice            01/01/70 00:00      
      the practical reality ...            01/01/70 00:00      
         of course ....            01/01/70 00:00      
            Well done..starting for third countries            01/01/70 00:00      
            But still            01/01/70 00:00      
               Starting for third countries            01/01/70 00:00      
                  Jecksons please read the previous thread            01/01/70 00:00      
                     Third countries            01/01/70 00:00      
                        I am feeling Dizzy            01/01/70 00:00      
                  and what does that tell us            01/01/70 00:00      
                     Keeping this thread alive            01/01/70 00:00      

Back to Subject List