c语言的几个问题
1)为什么这里typedef union有4个 struct? 是不是针对不同情况?如果我使用第一个struct,还能不能用其他的?
2)如果我对某一位赋值,我可以使用, 比如PMCONbits.CS2P=1;(因为定义了unsigned CS2P:1;)
但是有些位没有定义,比如unsigned:1;是不是说明该位不能被赋值?如果能,怎么赋值?
3) 能不能用PMCON对整个寄存器赋值,比如PMCON=0xFFFFFF00
4) PMCONCLR是不是所有为置0, PMCONSET所有为置1?
#define PMCON PMCON
extern volatile unsigned int PMCON __attribute__((section("sfrs")));
typedef union {
struct {
unsigned RDSP:1;
unsigned WRSP:1;
unsigned :1;
unsigned CS1P:1;
unsigned CS2P:1;
unsigned ALP:1;
unsigned CSF:2;
unsigned PTRDEN:1;
unsigned PTWREN:1;
unsigned PMPTTL:1;
unsigned ADRMUX:2;
unsigned SIDL:1;
unsigned :1;
unsigned ON:1;
unsigned :1;
unsigned DUALBUF:1;
unsigned :5;
unsigned RDSTART:1;
};
struct {
unsigned :6;
unsigned CSF0:1;
unsigned CSF1:1;
unsigned :3;
unsigned ADRMUX0:1;
unsigned ADRMUX1:1;
};
struct {
unsigned :13;
unsigned PSIDL:1;
unsigned :1;
unsigned PMPEN:1;
};
struct {
unsigned w:32;
};
} __PMCONbits_t;
extern volatile __PMCONbits_t PMCONbits __asm__ ("PMCON") __attribute__((section("sfrs")));
extern volatile unsigned int PMCONCLR __attribute__((section("sfrs")));
extern volatile unsigned int PMCONSET __attribute__((section("sfrs")));
extern volatile unsigned int PMCONINV __attribute__((section("sfrs")));
先搞清楚什么是结构体,什么是联合体把
谢谢! 是因为时间的关系,又急需处理,才这样的,如果您明白的话还请能告知一下。
初学者 跟着一起学习下
联合体共用内存
首先第四个结构体决定了该共用体占32个位;然后第一个结构体确认该32的名称如图:有一部分是不能访问的,然后4个结构体的位是有一定的对应关系。这东西我也是现学的 但是理解应该没错。希望能帮到你。
你去csdn论坛搜索“C语言结构体中冒号的用法--C 位域”这个。我没权限发表URL链接
关于图的一个解释:24位与32位的对应关系与系统数据的大小端模式有关所以图不一定准确。
共同体内的变量共享内存空间,比如定义一个共同体如下:
union{
int x;
struct{
char unit1;
char unit2;
char unit3;
char unit4;
}alpha;
}FourUnit;
假设是在32位的系统中,x占用的是4个字节,而在struct中的char单元,每个占用1个字节的内存空间,他们是相互共享空间的;假设 FourUnit=10; 则内存里的数值为(内存的存储有大小端存储之分,此处以下图看到的存储方式来分析,在使用共同体的时候需要十分注意,尤其是在代码移植的时候,所以在可移植的代码中,最好不要使用共同体):
___________________________________
type | 字节1 | 字节2 | 字节3 | 字节4 |
——————————————————————
int | 00 | 00 | 00 | 10 |
__________________________________
struct | 00 | 00 | 00 | 10 |
__________________________________
由此可以看出,当FourUnit=10的时候,x=10;alpha.Unit1=10;alpha.Unit2=00;alpha.Unit3=00;alpha.Unit4=00;
如同一人得道,鸡犬升天一样,只要共同体的值发生改变,则内部相关的变量值将随之也发生改变。
同样,如同一颗老鼠屎坏了一锅粥一样,只要共同体中的某个变量的值发生了改变,则该共同体的值也随之发生改变。
这种联动的关系,就是共同内存空间导致的。
那么在单片机中,共同体担当的作用就是:
1.如果他们之间的配置是互斥的话,可以使用共同体;例如如果寄存器A和B是共用同一个物理存储空间的话,他们之间的关系可以用共同体来表达,寄存器A掌管着功能C,寄存器B掌管着功能D,由于资源有限,功能C和功能D不能够同时开启,则在配置寄存器A或者B的时候,可以相应的关掉寄存器B或A的功能。
2.比较常见的一种是,如MSP单片机中,可以利用共同体来对一个寄存器中的位进行单独的操作。也可以对多位进行一次性操作等。简言之就是将datasheet中的功能配置的位集中在一起,方便配置。你问题中提到的就是这一种用法
1) 四个结构体实际是定义了四种访问方式,编程时有时需要同时修改很多个bit,有时只需要修改一个bit, 这时就可以根据需求使用其中的某一个结构。这四个结构可以随时换着用。
2) 可以赋值,可以用其它使用了这个bit的结构体赋值,或者整体赋值;PMCONbits.s1.CS2P=1或PMCONbits.s4|=0x20;
3) 可以整体赋值,如PMCONbits.s4=0xFFFFFF00;
写法都有问题,应该改成如下形式:
#define PMCON PMCON
extern volatile unsigned int PMCON __attribute__((section("sfrs")));
typedef union {
struct {
unsigned RDSP:1;
unsigned WRSP:1;
unsigned :1;
unsigned CS1P:1;
unsigned CS2P:1;
unsigned ALP:1;
unsigned CSF:2;
unsigned PTRDEN:1;
unsigned PTWREN:1;
unsigned PMPTTL:1;
unsigned ADRMUX:2;
unsigned SIDL:1;
unsigned :1;
unsigned ON:1;
unsigned :1;
unsigned DUALBUF:1;
unsigned :5;
unsigned RDSTART:1;
} s1;
struct {
unsigned :6;
unsigned CSF0:1;
unsigned CSF1:1;
unsigned :3;
unsigned ADRMUX0:1;
unsigned ADRMUX1:1;
} s2;
struct {
unsigned :13;
unsigned PSIDL:1;
unsigned :1;
unsigned PMPEN:1;
} s3;
uint32_t s4;
} __PMCONbits_t;
extern volatile __PMCONbits_t PMCONbits __asm__ ("PMCON") __attribute__((section("sfrs")));
extern volatile unsigned int PMCONCLR __attribute__((section("sfrs")));
extern volatile unsigned int PMCONSET __attribute__((section("sfrs")));
extern volatile unsigned int PMCONINV __attribute__((section("sfrs")));