【Allwinner ClassA20类库分析】8.GP类的使用

提到RTC,就不能不说备份寄存器的作用。一般情况下,在设置了RTC的时间后,都会在备份寄存器中做一个标志,表明当前时间已经被设置过,不需要重新设置;当没有检测到这个标志,则证明RTC曾经断过电,时间是不正确的。今天就来说已说备份寄存器类的用法。在使用之前,请先在https://github.com/tjCFeng/ClassA20下载ClassA20类库。

备份寄存器,在Allwinner中叫做General Purpose。它具有和RTC一样的特性,就是断电后寄存器中的内容不消失,可以依靠RTC电池来维持,只不过它没有自动累加的功能。


备份寄存器恐怕是所有功能中最最简单的一个了,简单到只有赋值、读取,没有其他的功能了,不过它可以当作一个全局变量,一个可以跨进程、断电不消失的全局变量。

同以前一样,还是先来看看对它的封装


Allwinner A20共有16个备份寄存器,每个可以记录32位的整型值。为了使用起来简单方便,它被封装成了单例,直接指定索引号即可写入和读取。

程序的编写方法这次改变一下,不再使用窗体,直接编译一个不带有任何交互界面的程序来测试它。创建方法首先在菜单中选择工程,然后点击创建,在选择“程序”。当然也可以选择“控制台程序”,差不多的


创建成功后自动生成一个最简单的程序框架,begin和end间就是入口,相当于c的main函数


  还是在工程中添加ClassA20文件夹的路径,然后在uses中引用GP单元,开始编写代码。

因为寄存器在程序中只是一个指针,调试过程中并不能直接显示它的值,所以定义了一个长整型的变量,方便调试时的查看


程序写好后设置断点并运行。断点可以在程序运行到该行代码时停下来,进行一些调试操作。当运行到给这个变量赋值备份寄存器值的代码后,将鼠标放在变量上就能显示当前的值了。第一次运行,备份寄存器的值默认是0,给备份寄存器写入一个0xFF后再读出,这个变量就是255


这个时候,可以关机断电,任意时候开机再来读取这个寄存器,它的值还是255,除非中途RTC电池被断掉。

TGP.Instance.GetGP和SetGP是封装后的方法,参数直接指定备份寄存器的索引号就可以了。除此之外,还可以直接对寄存器指针进行操作,也很简单


寄存器的指针是一个数组,给定下标来操作,和普通的变量没什么区别


注意,由于香蕉派的电源管理部分可能有一些小问题,造成断电后备份电池掉电很快,所以我目前并没有在香蕉派上断电后成功读取出备份寄存器的值,不过可以在其他板子上尝试此程序。


请在[https://github.com/tjCFeng/ClassA20](https://github.com/tjCFeng/ClassA20)下载ClassA20类库。