This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Defining bit field structure to use sfr P1

Hi,
I want to create a bit field structure for a group of bits associated with 'sfr P1'

/* Bit definitions within sfr P1 */
#define NRAMEN (1 << 5)
#define A20 (1 << 4)
#define A19 (1 << 3)
#define A18 (1 << 2)
#define A17 (1 << 1)
#define A16 (1 << 0)

#define NCSDUART NRAMEN+A18

struct myp1 {
unsigned char bankSelect :6; /* select banked device */
unsigned char wdog :1;
};

struct myp1 data port1 _at_ 0x90; /* problem line doesnt work */


My problem is the last line, how do i get my struct to use P1 so I can do the following ?
port1.bankSelect = NCSDUART; /* set/res the appropriate bits on port1 */

Or will i have to start doing something like the following (which i was trying to avoid)?
P1 = (P1 & 0xC0) + NCSDUART; /* mask off unwanted bits then select appropriate banked device */


Thanks Mark.

Parents
  • The ability to describe a port and other addresses as bit-fields would be a very nice feature indeed. In principle, a compiler should be able to do this and generate different object code for accessing bit-addressable and non-bit-addressable locations in an efficient way.

    Of course, compilers can vary in their placing of bit fields within words (that is a weakness of C). However, the advantage is that a statement such as:

    select.bank = 3;
    
    is so much clearer than a load of masking operations.

    More significantly, bit twiddling is what the 8051 is good at and using bit-field structures is a natural way to expess these sorts of operation in source code. However, the way that C51 works seems to neglect this area of operation.

    Of course, C51 does allow bit-field stuctures to be defined and it does allow bit variables to be defined, but the two do not mix well.

    You might expect that a structure containing 1-bit fields would be accessed efficiently by Keil C51 - given that the 8051 has instructions for doing exactly that. However, the compiler often turns out to do it no better than using masks and sometimes rather worse. There is no good reason for this other than a weakness of the compiler. Also, you might expect that bit variables and 1-bit bit fields should be handled in much the same way, but in fact to the compiler they are quite different. See:

    http://www.keil.com/forum/docs/thread1291.asp

Reply
  • The ability to describe a port and other addresses as bit-fields would be a very nice feature indeed. In principle, a compiler should be able to do this and generate different object code for accessing bit-addressable and non-bit-addressable locations in an efficient way.

    Of course, compilers can vary in their placing of bit fields within words (that is a weakness of C). However, the advantage is that a statement such as:

    select.bank = 3;
    
    is so much clearer than a load of masking operations.

    More significantly, bit twiddling is what the 8051 is good at and using bit-field structures is a natural way to expess these sorts of operation in source code. However, the way that C51 works seems to neglect this area of operation.

    Of course, C51 does allow bit-field stuctures to be defined and it does allow bit variables to be defined, but the two do not mix well.

    You might expect that a structure containing 1-bit fields would be accessed efficiently by Keil C51 - given that the 8051 has instructions for doing exactly that. However, the compiler often turns out to do it no better than using masks and sometimes rather worse. There is no good reason for this other than a weakness of the compiler. Also, you might expect that bit variables and 1-bit bit fields should be handled in much the same way, but in fact to the compiler they are quite different. See:

    http://www.keil.com/forum/docs/thread1291.asp

Children
No data