MST

星途 面试题库

面试题:C语言联合体在简单内存映射场景中的应用

假设有一个硬件设备,其寄存器组可以通过内存映射访问。该寄存器组有两种访问方式,一种是按单个字节访问,另一种是按16位整数访问。请使用C语言联合体设计一个数据结构来映射这个寄存器组,并编写代码示例,展示如何通过这个联合体分别以字节和16位整数的方式读写寄存器的值。
34.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 定义联合体来映射寄存器组
union RegisterGroup {
    struct {
        unsigned char byte0;
        unsigned char byte1;
    } bytes;
    unsigned short int word;
};

int main() {
    union RegisterGroup reg;

    // 以16位整数方式写入值
    reg.word = 0x1234;

    // 以字节方式读取值
    printf("以字节方式读取: byte0 = 0x%02hhx, byte1 = 0x%02hhx\n", reg.bytes.byte0, reg.bytes.byte1);

    // 以字节方式写入值
    reg.bytes.byte0 = 0x56;
    reg.bytes.byte1 = 0x78;

    // 以16位整数方式读取值
    printf("以16位整数方式读取: word = 0x%04hx\n", reg.word);

    return 0;
}

上述代码中:

  1. 定义了一个联合体 RegisterGroup,它包含两个成员:一个结构体 bytes 用于按字节访问,其中 byte0byte1 分别表示两个字节;另一个成员 word 用于按16位整数访问。
  2. main 函数中,首先以16位整数方式写入一个值 0x1234,然后以字节方式读取并打印这两个字节的值。
  3. 接着以字节方式分别写入 0x560x78,最后以16位整数方式读取并打印这个16位的值。这样就展示了通过联合体分别以字节和16位整数的方式读写寄存器的值。