从结构读/写位

时间:2016-12-20 19:31:10

标签: c struct read-write

如果我们将结构定义为

,则在C中

struct PortBreg { 
unsigned int B0 :1; 
unsigned int B1 :1; 
unsigned int B2 :1; 
unsigned int B3 :1; 
unsigned int B4 :1; 
unsigned int B5 :1; 
unsigned int B6 :1; 
unsigned int B7 :1; 
};

#define Breg (*(volatile struct PortBreg *)(0x38)), 

如果我想从端口B位B3读取值并将值写入端口B位B2,我可以这样做吗

int i=Breg.B3;      //to read
Breg.B2=i;          //to write ?

2 个答案:

答案 0 :(得分:1)

这可能取决于端口是否可读写,但对于普通变量,此代码有效:将B3复制到B2。请与您的类型保持一致,int i不是unsigned int i。另请注意,我按照通常的顺序打印每个成员,但实际端口读取的结构定义可能需要反转,因此B7是第一个。

#include <stdio.h>

struct PortBreg { 
    unsigned int B0 :1; 
    unsigned int B1 :1; 
    unsigned int B2 :1; 
    unsigned int B3 :1; 
    unsigned int B4 :1; 
    unsigned int B5 :1; 
    unsigned int B6 :1; 
    unsigned int B7 :1; 
};

void show(struct PortBreg Qreg)
// bit order MSB -> LSB
{
    printf("%u%u%u%u%u%u%u%u\n", 
       Qreg.B7, Qreg.B6, Qreg.B5, Qreg.B4, Qreg.B3, Qreg.B2, Qreg.B1, Qreg.B0);
}

int main(void)
{
    struct PortBreg Breg = {0, 0, 0, 1,};
    unsigned i;
    show(Breg);
    i = Breg.B3;
    Breg.B2 = i;
    show(Breg);
    return 0;
}

节目输出:

00001000
00001100

答案 1 :(得分:0)

并非总是如此。如果端口是存储器映射的,那么从C读取和写入正确位的简单操作可能足以触发导线上的信号。但你可能不得不做其他事情。通常你必须禁用中断。读取通常也会清除端口,通常你需要测试一下是否有数据,然后读取并清除。

所以你需要看看硬件文档。从根本上说,端口是通过写入位来控制的,就好像它们是普通的存储器一样。