如何实现ISR和main()同步?

时间:2011-12-21 15:20:05

标签: arm microcontroller interrupt iar

我是ARM微控制器编程的初学者,有以下问题需要解决。

  1. 该计划中有两个ISR: ISR_Timer ISR_Buffer 。 ISR_Timer每5分钟执行一次。每次填充外部设备缓冲区(多次在一秒内)时,都会执行ISR_Buffer。外部设备缓冲区很小。
  2. ISR_Buffer 从外部SRAM获取数据以填充缓冲区。 SRAM中有两个大缓冲区。首先使用,第二个用于重新计算。然后交换它们。
  3. ISR_Timer 设置指示 main()的标志,以重新计算外部SRAM中的第二个缓冲区。之后,ISR_Buffer使用该缓冲区。第一个用于下一次重新计算。重新计算大约需要1分钟。
  4. 问题是main()和ISR_Buffer都访问外部SRAM,那些访问不是原子。 main()函数在缓冲区重新计算期间将数据写入SRAM。 ISR_Buffers读取数据以填充小型设备缓冲区。如何解决这个问题?

    IDE :IAR。 芯片:AT91SAM7。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用cyclic buffer。正确实施,它将保证原子写入和读取。

或者,您可以在缓冲区操作期间屏蔽main()中的中断,以确保ISR无法访问数据。但这些操作必须很快,否则外部设备将获得缓冲区下溢。