armv8 system timer的控制

armv8的系统定时器时钟源是在SOC上,且每个pe上有一个timer。pe可以通过访问寄存器的方式来读和控制timer。

timer有关的寄存器主要有三类:控制寄存器,倒计时寄存器和比较寄存器。

我们只关心virtual timer。最下面的是控制寄存器,中间是倒计时寄存器,最上面是比较寄存器。使用timer时先设置倒计时寄存器或比较寄存器,然后将控制寄存器bit0置1.这样等到条件满足,时钟中断就来了(前提是中断控制器已经ok)。

问题是如何处理timer中断。时钟发起中断的条件是控制寄存器的bit1为0,bit2为1,其中bit0为掩码位,bit1为状态位,中断处理程序一定要将状态位恢复才行,但是这一位是只读的,写0是不行的。

通常的做法是先将mask位置1,再更改倒计时寄存器或比较寄存器,且比较寄存器必须比当前的counter值大,最后unmask。这样就可以完成时钟中断的响应了,当然实际操作可以根据具体的需求分开操作。如果不按上述操作就会产生IRQ storm,也就是时钟中断没有被处理,不断发起中断。

猜你喜欢

转载自blog.csdn.net/wujianyongw4/article/details/84638116
今日推荐