【笔记】关于寄存器的一些理解

1. 寄存器

做嵌入式Linux 方向,跟寄存器打交道也有一段时间了,感觉寄存器就是一个比较特殊的东西。

首先这是书本上说的:

寄存器(register)是CPU(中央处理器)的组成部分,是一种直接整合到cpu中的有限的高速访问速度的存储器,
它是有一些与非门组合组成的,分为通用寄存器和特殊寄存器。cpu访问寄存器的速度是最快的。
寄存器是一种容量有限的存储器,并且非常小。
因此只把一些计算机的指令等一些计算机频繁用到的数据存储在其中,来提高计算机的运行速度。
  1. 寄存器一般在 CPU 中,做嵌入式的时候,有时候直接在内核代码中可以读写寄存器的值。而这个读写也没有想象的复杂,只需要调用一个函数(不同的芯片配套的内核,操作函数的形式和名字略微不一样),参考芯片给出的文档(文档中有不同的寄存器对应的绝对地址),比如有一款 arm9 的芯片使用ioremap(addr, vlaue)addr 就是对应在文档中的地址,value就是自己修改的值。一般是有范围限制的,这个在芯片对应的文档都有说明。
  2. 嵌入式中的寄存器的作用:一般在文档中都有说明。我在工作中遇到几个寄存器,专门用来统计发送报文的个数、接收报文的个数。根据文档,可以读寄存器获取这些计数,也可以写寄存器比如初始化设为0
  3. 在 2 中寄存器是如何统计的?这个是由硬件进行操作的。硬件在检测到有报文进来,统计接收报文寄存器计数 +1 ,同样,硬件在检测到有报文发出,统计发送报文寄存器计数+1。但是这些也是可以在内核函数的发包出口或者收包入口做到;最简单的就是 LED驱动,通过修改特定的寄存器,就能控制LED的高低电平使其亮还是暗。为什么要使用寄存器呢?我个人认为的原因:
    1. 不需要 CPU 参与,或者CPU参与得极少,提高速度,而且本身CPU访问寄存器就十分地快;
    2. 在内核里做,保存计数需要使用全局变量,不同的模块需要的时候调用这个计数麻烦,方便编码。

所以,在一些芯片的手册中,都可以看到很多寄存器的地址和对应的值(多的有几百上千个,在文档中排列着……),不同的值有不同的功能。

2. 一些心得:

  1. 寄存器的值:是作为一款芯片,对外保留的接口。通过修改寄存器的值,来使硬件某些功能生效/不生效。就如同一些.so的库,对外留有接口,接口都写在对应的头文件中。
  2. Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器。这个真的在写几个寄存器之后就知道了。
  3. 在嵌入式地芯片中,会看到很频繁调用的硬件的功能,就很有可能**使用寄存器操作,这样比在内存中用一个内存变量,判断它的值来的快。**

你可能感兴趣的:(笔记,嵌入式硬件,缓存,c语言)