[应用相关] C语言操作寄存器

[复制链接]
1414|7
 楼主| skyred 发表于 2021-10-15 14:33 | 显示全部楼层 |阅读模式
在嵌入式开发中,常常要操作寄存器,对寄存器进行写入,读出等等操作。每个寄存器都有自己固有的地址,通过C语言访问这些地址就变得尤为重要。


  1. #define GSTATUS1        (*(volatile unsigned int *)0x560000B0)


在这里,我们举一个例子。这是一个状态寄存器的宏定义。首先,通过unsigned int我们能够知道,该寄存器是32位的。因为要避免程序执行过程中直接从cache中读取数据,所以用volatile进行修饰。每次都要重新读取该地址上的值。首先(volatile unsigned int*)是一个指针,我们就假设它为p吧。它存储的地址就是后面的0x560000B0,然后取这个地址的值,也就是*p,所以源代码变成了(*(volatile unsigned int *)0x560000B0),接下来我们就能直接赋值给GSTATUS1来改变地址0x560000B0上存储的值了。


  1. /* NAND FLASH (see S3C2410 manual chapter 6) */
  2. typedef struct {
  3.     S3C24X0_REG32   NFCONF;
  4.     S3C24X0_REG32   NFCMD;
  5.     S3C24X0_REG32   NFADDR;
  6.     S3C24X0_REG32   NFDATA;
  7.     S3C24X0_REG32   NFSTAT;
  8.     S3C24X0_REG32   NFECC;
  9. } S3C2410_NAND;

  10. static S3C2410_NAND * s3c2410nand = (S3C2410_NAND *)0x4e000000;

  11. volatile unsigned char *p = (volatile unsigned char *)&s3c2410nand->NFSTAT;
有时候,你会看到这样一种情况的赋值。其实这和我们刚刚讲过的差不多。只不过这里是在定义了指针的同时对指针进行赋值。这里首先定义了结构体S3C2410_NAND,里面全部是32位的变量。又定义了这种结构体类型的指针,且指向0x4e000000这个地址,也就是此刻s3c2410nand指向了一个实际存在的物理地址。s3c2410nand指针访问了NFSTAT变量,但我们要的是它的地址,而不是它地址上的值。所以用&取NFSTAT地址,这样再强制转换为unsigned char型的指针,赋给p,就可以直接通过p来给NFSTAT赋值了。


huquanz711 发表于 2021-10-15 18:27 来自手机 | 显示全部楼层
感谢楼主分享
kiwis66 发表于 2021-10-16 10:55 | 显示全部楼层
哦~~一直看这么定义,没仔细研究过~~
tfqi 发表于 2021-11-5 09:49 | 显示全部楼层
现在基本都是这样操作的吧
qcliu 发表于 2021-11-5 09:51 | 显示全部楼层
现在极少看见汇编了
nawu 发表于 2021-11-5 09:52 | 显示全部楼层
呵呵  我偷懒 用cube生成
kxsi 发表于 2021-11-5 09:53 | 显示全部楼层
宏定义是不是一直占用资源啊
gwsan 发表于 2021-11-5 09:56 | 显示全部楼层
NFSTAT变量是一种什么变量啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

740

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部