Передача параметров между обработчиками прерываний на Cortex-M3 - PullRequest
2 голосов
/ 02 мая 2010

Я создаю легкое ядро ​​для Cortex-M3.

Из прерывания с высоким приоритетом я хотел бы вызвать некоторый код для запуска в прерывании с более низким приоритетом и передать некоторые параметры.

Я не хочу использовать очередь для отправки работы на прерывание с более низким приоритетом.

У меня просто есть буфер и размер для передачи на него.

В руководстве по программированию говорится, что обработчик прерываний SVC является синхронным, что, вероятно, означает, что если вы вызываете его из прерывания, которое имеет более низкий приоритет, чем обработчик SVC, он вызывается немедленно (в результате этого вы можете передавать параметры в это как если бы это был вызов функции (немного похоже на вызовы BIOS в MS-DOS)).

Я бы хотел сделать это по-другому: передать параметры от высокоприоритетного прерывания к низкоприоритетному (сейчас я делаю это, оставляя параметры в фиксированном месте в памяти).

Какой лучший способ сделать это (если это вообще возможно)?

Спасибо

1 Ответ

1 голос
/ 02 мая 2010

Я не знаком с архитектурой Cortex-M3, но я уверен, что вам нужно предоставить механизм блокировки для разделяемой памяти.

Прерывание с более высоким приоритетом может прервать обработку с более низким приоритетом в любое время (кроме случаев, когда вы специально синхронизируете это с оборудованием и гарантируете, что этого не произойдет, но, вероятно, это не так)

Механизм блокировки может быть таким же простым, как однобитовый флаг, в критической секции (отключение прерываний для чтения-изменения-записи для флага), чтобы гарантировать атомарный обмен на флаге блокировки (т. Е. Нижний приоритет if процесс / прерывание обращается к / обновляет флаг блокировки, прерывание с более высоким приоритетом действительно входит и изменяет его.) Затем флаг является механизмом синхронизации для чтения и записи в пространство общей памяти, позволяя обоим процессам блокировать друг друга, пока он обращается к общему ресурсу, не отключая прерывания на длительное время (я думаю, если доступ к общей памяти достаточно быстрый, вы можете просто отключить прерывания, когда вы обращаетесь к общей памяти)

...