Zynq-7000 SoC,定时器 - 全局定时器可以为同一事件发送两个中断

描述

单次模式下的全局定时器可以生成两个计数结束中断请求而不是一个。使用自动增量模式可以避免这种情况。软件可以通过在增加比较器寄存器值后清除全局定时器标志来解决此问题。

影响: 次要。该问题会在系统中产生虚假中断请求。
解决方法: 使用自动递增而不是单次触发模式或在中断服务程序中执行特殊序列。有关详细信息,请参阅下面的解决方法详细信
受影响的配置 在单次模式下使用PS全局定时器(GT)的系统。
受影响的器件版本: 请参阅(Xilinx答复47916) - Zynq-7000 SoC芯片版本差异。


可以对全局定时器(GT)进行编程,以便在处理器达到给定的编程值时向处理器生成中断请求。由于此问题,当全局定时器被编程为不使用自动递增功能时,它可能会生成两个中断请求而不是一个中断请求。

全局定时器控制寄存器使用以下设置进行编程:

第3位= 1B0 GT以单次拍摄模式编程
第2位= 1B1 GT IRQ生成已启用
位1 = 1B1 启用与比较器寄存器的GT值比较
位0 = 1B1 GT计数已启用


通过这些设置,当全局定时器值达到比较器寄存器中编程的值时,会向处理器生成IRQ。然后,中断处理程序执行以下序列:

  • 读ICCIAR(中断确认)寄存器
  • 清除全局计时器标志
  • 修改比较器值,将其设置为更高的值
  • 写ICCEOIR(中断结束)寄存器

在这些条件下,全局定时器可能会在此中断处理程序序列结束时向处理器生成第二个(杂散)中断请求。

解决方法细节

因为问题只发生在全局定时器以单次模式编程时(即,当它不使用自动增量功能时),第一种可能的解决方法是将全局定时器编程为使用自动增量功能。

如果无法使用此解决方案,则第二种解决方法是修改中断处理程序以避免违规序列。这是通过在增加比较器寄存器值后清除全局定时器标志来实现的。中断处理程序的正确代码序列应如下所示:

  • 读ICCIAR(中断确认)寄存器
  • 修改比较器值,将其设置为更高的值
  • 清除全局计时器标志
  • 清除中断控制器分配器中的中断27(全局定时器中断)的待定状态信息
  • 写ICCEOIR(中断结束)寄存器
编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除

提问于 2018-07-31 14:49:48 +0800

这个帖子被标记为一个社区wiki

这个帖子是一个wiki(维基). 任何一个积分 >500的人都可以完善它