我为一个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,14是CxTXxEID位0-13吗?最后两个用于CxTXxEID第14位和第15位?
如果是的话,我把它做对了
如果我在代码中写
C1TX0SRC = 0x0001;我可以在注册表中看到下面的内容吗?
C1TX0SID = 0b0000000000000000
C1TX0EID = 0b0100000000000000发布于 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位?
没人知道。位顺序、字节顺序、字节顺序、位/字节填充...每件事都可能是一个问题,而标准中没有规定任何东西。
我能在寄存器中得到下面的内容吗?
没人知道。您必须查看编译器文档。在实践中,你可以得到任何二进制的结果。可移植的、安全的解决方案是根本不使用位字段。
发布于 2015-04-30 17:23:32
位顺序应该是正确的。但是你为什么不自己测试一下呢?几天前我做了这样的事情:
#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链接器脚本的一小段摘录:
C1TX2SID = 0x340;
_C1TX2SID = 0x340;
_C1TX2SIDbits = 0x340;
C1TX2EID = 0x342;
_C1TX2EID = 0x342;
_C1TX2EIDbits = 0x342;向它们添加您自己的声明,修改您的makefile以包含修改后的链接器脚本,这样就可以了(但我自己还没有尝试过)。
https://stackoverflow.com/questions/29963679
复制相似问题