Передача параметров между обработчиками прерываний на Cortex-M3

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

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

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

У меня просто есть буфер и размер, который нужно передать ему.

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

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

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

Спасибо,


person Captain NedD    schedule 02.05.2010    source источник


Ответы (1)


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

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

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

person simon    schedule 02.05.2010