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,也就是时钟中断没有被处理,不断发起中断。
本文深入探讨ARMv8架构下系统定时器的工作原理,包括其时钟源、PE上的timer配置,以及通过寄存器读取和控制的方式。重点讲解了virtual timer的使用,涉及控制寄存器、倒计时寄存器和比较寄存器的操作,以及如何正确处理timer中断,避免IRQstorm现象。
916

被折叠的 条评论
为什么被折叠?



