0

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

  1. 程序中有两个 ISR:ISR_TimerISR_Buffer。ISR_Timer 每 5 分钟执行一次。每次应填充外部设备缓冲区时(一秒钟内多次),都会执行 ISR_Buffer。外部设备缓冲区很小。
  2. ISR_Buffer从外部 SRAM 获取数据以填充缓冲区。SRAM中有两个大缓冲区。第一个当前使用,第二个用于重新计算。然后它们被交换。
  3. ISR_Timer设置标志,指​​示main()重新计算外部 SRAM 中的第二个缓冲区。之后 ISR_Buffer 使用该缓冲区。第一个用于下一次重新计算。重新计算大约需要 1 分钟。

问题是 main() 和 ISR_Buffer 都访问外部 SRAM,并且这些访问不是原子的。main() 函数在缓冲区重新计算期间将数据写入 SRAM。ISR_Buffers 读取数据以填充小型设备缓冲区。如何解决这个问题?

IDE:IAR。芯片:AT91SAM7。

4

1 回答 1

1

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

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

于 2011-12-21T15:50:28.580 回答