面试题答案
一键面试#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;
}
解释:
typedef volatile uint32_t reg_type;
:定义了一个32位无符号整数类型reg_type
,并且使用volatile
关键字确保编译器不会对该变量进行优化,每次访问都是直接从内存读取或写入。#define REG_ADDR ((reg_type *)0x12345678)
:将地址0x12345678
强制转换为reg_type
类型的指针。read_register
函数:简单地返回寄存器的值。write_register
函数:将给定的值写入寄存器。main
函数:演示了如何调用读写函数,并打印读取的值。在实际应用中,main
函数的代码结构可能需要根据具体情况调整。
这种方法已经考虑了内存对齐,因为uint32_t
通常是4字节对齐的,并且硬件寄存器地址0x12345678
也是4字节对齐的(32位地址的最低两位为0)。指针类型转换在#define REG_ADDR
中完成,将0x12345678
转换为reg_type
类型的指针。