前言
在运用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语言通过结构体的方式访问寄存器的方法。