Как реализовать ISR и синхронизацию main ()? - PullRequest
0 голосов
/ 21 декабря 2011

Я новичок в программировании микроконтроллеров 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 минуты.

Проблема в том, что main () и ISR_Buffer обращаются к внешней SRAM, и эти обращения не являются атомарными .Функция main () записывает данные в SRAM во время пересчета буфера.ISR_Buffers считывает данные для заполнения небольшого буфера устройства.Как решить эту проблему?

IDE : IAR. Чип : AT91SAM7.

1 Ответ

1 голос
/ 21 декабря 2011

Если я правильно понял, вы можете использовать циклический буфер . Будучи реализованным правильно, он гарантирует атомарную запись и чтение.

Или вы можете маскировать прерывания в main() во время манипулирования буфером, чтобы гарантировать, что ISR не имеет доступа к данным. Но эти манипуляции должны быть быстрыми, иначе ваше внешнее устройство будет переполнено буфером.

...