首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个寄存器上的位声明

两个寄存器上的位声明
EN

Stack Overflow用户
提问于 2015-04-30 17:14:38
回答 2查看 47关注 0票数 1

我为一个dspic30f4011做了一个比特声明

我声明了一个部分

代码语言:javascript
复制
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,14是CxTXxEID位0-13吗?最后两个用于CxTXxEID第14位和第15位?

如果是的话,我把它做对了

如果我在代码中写

代码语言:javascript
复制
C1TX0SRC = 0x0001;

我可以在注册表中看到下面的内容吗?

代码语言:javascript
复制
C1TX0SID = 0b0000000000000000
C1TX0EID = 0b0100000000000000
EN

回答 2

Stack Overflow用户

发布于 2015-04-30 17:43:07

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

CxTXxSID位0和1是

的前两位吗?

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

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

没人知道。位顺序、字节顺序、字节顺序、位/字节填充...每件事都可能是一个问题,而标准中没有规定任何东西。

我能在寄存器中得到下面的内容吗?

没人知道。您必须查看编译器文档。在实践中,你可以得到任何二进制的结果。可移植的、安全的解决方案是根本不使用位字段。

票数 1
EN

Stack Overflow用户

发布于 2015-04-30 17:23:32

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

代码语言:javascript
复制
    #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编辑:现在我对sfr属性有了一些了解。因为你没有说明你做了什么,所以我假设你没有改变你的链接器文件,是吗?要将结构放在特殊函数寄存器的顶部,必须更改在Microchip\xc16\vx.xx\support\dsPIC30F中找到的链接器脚本(*.gld文件)。以下是标准p30F4011.gld链接器脚本的一小段摘录:

代码语言:javascript
复制
 C1TX2SID     = 0x340;
_C1TX2SID     = 0x340;
_C1TX2SIDbits = 0x340;
 C1TX2EID     = 0x342;
_C1TX2EID     = 0x342;
_C1TX2EIDbits = 0x342;

向它们添加您自己的声明,修改您的makefile以包含修改后的链接器脚本,这样就可以了(但我自己还没有尝试过)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29963679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档