我为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
答案 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以包含你修改过的链接器脚本,你应该好好去(但我自己没试过)。