两个寄存器上的位声明

时间:2015-04-30 09:14:38

标签: c

我为dspic30f4011

做了一个声明

我宣布了一个部分

typedef struct tagCxTXxSIDBITS_tagCxTXxEIDBITS {
    unsigned        : 2;
    unsigned SRC7_2 : 6;
    unsigned        : 8;
    unsigned        : 14;
    unsigned SRC1_0 : 2;
} CxTXxSRCBITS;

extern volatile unsigned int C1TX0SRC __attribute__((__sfr__));
extern volatile CxTXxSRCBITS C1TX0SRCbits __attribute__((__sfr__));
extern volatile unsigned int C1TX1SRC __attribute__((__sfr__));
extern volatile CxTXxSRCBITS C1TX1SRCbits __attribute__((__sfr__));
extern volatile unsigned int C1TX2SRC __attribute__((__sfr__));
extern volatile CxTXxSRCBITS C1TX2SRCbits __attribute__((__sfr__)); 

这是对的吗?前两个是CxTXxSID位0和1吗?然后CxTXxSID位2-7的8是CxTXxSID位8-15是CxTXxEID位0-13的14?最后两个用于CxTXxEID位14和15?

如果是,我做对了

如果我写下我的代码

C1TX0SRC = 0x0001;

我会在寄存器中得到关注吗?

C1TX0SID = 0b0000000000000000
C1TX0EID = 0b0100000000000000

2 个答案:

答案 0 :(得分:1)

比特顺序不是由标准指定的,也不是字节顺序,也不是关于位字段的任何其他内容,see this

  

前两个CxTXxSID位是0还是1?

没人知道,因为标准没有保证。您必须检查此特定系统的编译器文档。

  

那么CxTXxSID位2-7的8是CxTXxSID位8-15是CxTXxEID位0-13的14?最后两个用于CxTXxEID位14和15?

没人知道。位顺序,字节顺序,字节顺序,位/字节填充...一切都可能是一个问题,标准没有指定任何内容。

  

我会在寄存器中得到关注吗?

没人知道。您必须检查编译器文档。在实践中,您可以获得任何二进制粘性作为结果。便携,安全的解决方案是根本不使用位字段。

答案 1 :(得分:0)

位顺序应该是正确的。但是你为什么不亲自测试呢?我几天前做过这样的事情:

    #include <stdint.h>
    typedef union {
    uint8_t byte;
    struct {
        unsigned bit0:1;
        unsigned bit1:1;
        unsigned bit2:1;
        unsigned bit3:1;
        unsigned bit4:1;
        unsigned bit5:1;
        unsigned bit6:1;
        unsigned bit7:1;
    };
    } byte_t;


/*
                         Main application
 */
void main(void)
{
    byte_t testbyte;
    testbyte.byte = 0b01100011;
    while (1)
    {
        uint8_t bit0 = testbyte.bit0;
        uint8_t bit1 = testbyte.bit1;
        uint8_t bit2 = testbyte.bit2;
        uint8_t bit3 = testbyte.bit3;
        uint8_t bit4 = testbyte.bit4;
        uint8_t bit5 = testbyte.bit5;
        uint8_t bit6 = testbyte.bit6;
        uint8_t bit7 = testbyte.bit7;

        uint8_t temp  = 0;
    }
}

你可以在mplabx模拟器中测试这个,甚至不需要硬件。只需在最后设置一个调试断点。

编辑:我的回答可能有点太快了。在重新阅读您的问题之后,我理解您的主要关注点不是位顺序,而是您的结构是否与寄存器对齐的问题。我不明白 sfr 属性的工作原理。在xc8中有“@”运算符,它可以为特定的内存区域分配一些值。但是您可以使用调试器来获取您将值写入的实际地址。

编辑的编辑:现在我对sfr属性有了一些了解。因为你没有说明你做了什么我假设你没有改变你的链接器文件,是吗?要将结构置于特殊功能寄存器之上,必须更改在中找到的链接描述文件(* .gld文件)      Microchip的\ xc16 \ VX.XX \ SUPPORT \ dsPIC30F系列。 以下是标准p30F4011.gld链接描述文件的一些摘录:

 C1TX2SID     = 0x340;
_C1TX2SID     = 0x340;
_C1TX2SIDbits = 0x340;
 C1TX2EID     = 0x342;
_C1TX2EID     = 0x342;
_C1TX2EIDbits = 0x342;

向他们添加你自己的声明,修改你的makefile以包含你修改过的链接器脚本,你应该好好去(但我自己没试过)。