MST

星途 面试题库

面试题:C语言中对硬件寄存器进行简单读写操作

假设某硬件寄存器的地址为0x12345678,使用C语言代码实现对该寄存器的读操作和写操作,将读取的值存储在一个变量中,并将一个给定的值写入该寄存器,需要考虑内存对齐和指针类型转换等问题。
36.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdint.h>

// 假设硬件寄存器为32位
typedef volatile uint32_t reg_type;

// 硬件寄存器地址
#define REG_ADDR ((reg_type *)0x12345678)

// 读操作
uint32_t read_register() {
    return *REG_ADDR;
}

// 写操作
void write_register(uint32_t value) {
    *REG_ADDR = value;
}

int main() {
    uint32_t read_value;
    uint32_t write_value = 0xABCD1234;

    // 写操作
    write_register(write_value);

    // 读操作
    read_value = read_register();
    printf("Read value: 0x%08X\n", read_value);

    return 0;
}

解释:

  1. typedef volatile uint32_t reg_type;:定义了一个32位无符号整数类型reg_type,并且使用volatile关键字确保编译器不会对该变量进行优化,每次访问都是直接从内存读取或写入。
  2. #define REG_ADDR ((reg_type *)0x12345678):将地址0x12345678强制转换为reg_type类型的指针。
  3. read_register函数:简单地返回寄存器的值。
  4. write_register函数:将给定的值写入寄存器。
  5. main函数:演示了如何调用读写函数,并打印读取的值。在实际应用中,main函数的代码结构可能需要根据具体情况调整。

这种方法已经考虑了内存对齐,因为uint32_t通常是4字节对齐的,并且硬件寄存器地址0x12345678也是4字节对齐的(32位地址的最低两位为0)。指针类型转换在#define REG_ADDR中完成,将0x12345678转换为reg_type类型的指针。