AR# 47545

Zynq-7000 SoC、定时器 — 全局定时器可针对相同事件发送两个中断信息

描述

单发模式下的全局定时器可生成两个计数末中断请求,而不是一个。这可通过使用自动增量模式避免。 软件可在比较器寄存器值增量后,通过清空全局定时器标记来解决这个问题。

解决方案

影响:很小。该问题会在系统中创建假中断请求。
解决方法::在中断服务例程中使用自动增量,不要使用单发模式或执行特殊序列。更多详情,敬请参见以下应急措施细节。
受影响的配置:在单发模式中使用 PS 全局定时器 (GT) 的系统
受影响的器件修订版本:参考 (Xilinx Answer 47916) - Zynq-7000 SoC 芯片版本差异。


全局定时器 (GT) 可通过编程,在其达到给定编程值时对处理器生成中断请求。由于这个问题,全局定时器通过编程不使用自动增量特性时,它可能会生成两个中断请求,而不是一个。

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

Bit 3 =1b0可在单发模式下对 GT 进行编程
Bit 2 =1b1GT IRQ 生成启用
Bit 1 =1b1GT 值与比较器寄存器的比较启用
Bit 0 =1b1GT 计数启用


在上述设置情况下,针对处理器的 IRQ 在全局定时器值达到比较器寄存器编程值时生成。中断处理程序,随后执行以下序列:

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

在这些情况下,全局定时器会在中断处理程序序列结束时针对处理器生成第二个(假)中断请求。

解决方法详情

由于该问题只有当全局定时器在单发模式下编程时(也就是不使用自动增量特性)才出现,因此第一个合理应急措施就是通过编程全局定时器来使用自动增量特性。

如果该解决方案不可行,第二种应急措施是修改中断处理程序,避免故障序列。在比较器寄存器值增量后,清空全局定时器标记可实现这一目的。中断处理程序的正确代码序列应类似于以下序列:

  • 读取 ICCIAR(中断确认)寄存器
  • 修改比较器值,将其设为更高值
  • 清空全局定时器标志
  • 清空中断控制器分配器中的中断 27(全局定时器中断)待定状态信息
  • 写入 ICCEOIR(中断结束)寄存器

链接问答记录

主要问答记录

Answer Number 问答标题 问题版本 已解决问题的版本
47916 Zynq-7000 SoC 器件:芯片修订差异 N/A N/A
AR# 47545
日期 06/13/2018
状态 Active
Type 设计咨询
器件