Bootstrap

C语言中利用结构体进行寄存器访问


前言

在运用C语言进行裸机测试时,如果用base_addr加offset_addr进行访问,当需要配置的寄存器很多时,我们很难记住地址地址所表示的意思,这个时候,我们可以利用结构体对寄存器进行封装,然后绑定基地址,这样我们就可以通过结构体的方式,对寄存器进行读写访问,使得代码具备更好的可读性和可维护性。


一、结构体封装

如下代码所示,先根据模块所对应的寄存器map表,利用结构体封装对应的寄存器。

global_def.h

typedef unsigned int		uint32_t;
#define _RO              const volatile
#define _WO              volatile
#define _RW              volatile

#define  REG_BASE_ADDR 	0x100000L  //L 表示无符号长整型

typedef struct 
{
	_RW uint32_t reg0;
	_RO uint32_t reg1;
	_WO uint32_t reg2;
} group_reg_t;

typedef struct 
{
    _RW uint32_t reg0;
    group_reg_t  group_reg;
    _RO uint32_t reg1;
} demo_reg_t;

driver.h

#include "global_def.h"

extern demo_reg_t *demo_reg;  //extern 出来,其他人只要inlcude这个h文件即可用

二、基地址绑定

如下代码所示,将封装寄存器的结构体的首地址,绑定到寄存器的基地址,这样就可以利用结构体去访问
去访问寄存器。
driver.c

#include "driver.h"
demo_reg_t *demo_reg = (demo_reg_t *)REG_BASE_ADDR;  //将地址强制转换成结构体的指针,赋给结构体的首地址,这样通过结构体的首地址,就可以去访问寄存器。

三、使用

如下代码所示,可以直接通过结构体的方式去访问寄存器。

#include "global_def.h"
#include "driver.h"

void main(){
	unsigned int data;
	demo_reg->reg0 = 0xa0;  // write reg0
	data = demo_reg->reg0;  // read reg0
	demo_reg->group_reg.reg0 = 0x50;  // write group_reg.reg0
	data = demo_reg->group_reg.reg0;  // read group_reg.reg0
}

总结

本文主要记录一种C语言通过结构体的方式访问寄存器的方法。

;