Является ли прерывание сигналом, согласно C spe c? - PullRequest
3 голосов
/ 26 марта 2020

C11 5.1.2.3/5:

Когда обработка абстрактной машины прерывается при получении сигнала, значения объектов, которые не являются ни атомарными объектами без блокировки, ни типом volatile sig_atomic_t не определены, как и состояние среды с плавающей запятой. Значение любого объекта, измененного обработчиком, который не является ни объектом atomi c без блокировки, ни типом volatile sig_atomic_t, становится неопределенным при выходе из обработчика, как и состояние среды с плавающей запятой, если оно изменяется обработчиком и не восстановлен в исходное состояние.

Этот вопрос конкретно касается встроенных систем, в ситуации, когда нет установки, подобной операционной системе.

В классах встроенных систем c сигналов (стиль POSIX) не существует. Скажем, у нас есть прерывание, которое вызывает несколько функций, все из которых работают с одной ((полу) глобальной) переменной, но эта переменная не используется из контекста вне прерывания. Что-то вроде

static enum State state;

static void setStateTo1(void)
{
    state = stateOne;
}

static void setStateTo2(void)
{
    state = stateTwo;
}

void ISR(void)
{
    if (state == stateOne)
        setStateTo2();
    else
        setStateTo1();
}

Два вопроса:

  1. Является ли прерывание сигналом?
  2. Является ли приведенный выше код примером неопределенного поведения, поскольку state не volatile?

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Термин «сигнал» относится к конкретной c вещи, поведение которой определяется стандартом (C11 7.14 «Обработка сигнала»); это определение включает в себя то, что сигнал имеет номер, и может прервать выполнение, перейдя к обработчику, установленному функцией signal и т. д.

Стандарт не распространяется на любой другой вид асинхронного выполнения кода, кроме сигналы и темы.

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

Чтобы быть четко определенными, обработчики не должны делать ничего, кроме записи переменных volatile atomi c.

Итак, ваш второй вопрос выходит за рамки Стандарта. В стандарте C оптимизатор может удалить все эти функции как неиспользуемые, если они никогда не вызываются программой.

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

0 голосов
/ 01 апреля 2020

Авторы Стандарта расценили многие вещи как вне их юрисдикции . Если бы реализация использовала стек таким образом, который мог бы непредсказуемо работать со сбоями, если какое-либо прерывание происходило во время выполнения программы, и, следовательно, требовало, чтобы генерируемый им код выполнялся только в ситуациях, когда прерывания не могли произойти, такое ограничение не сделало бы несоответствующая реализация, хотя это сделало бы ее непригодной для многих целей.

Качественная реализация, предназначенная для низкоуровневого программирования на конкретной платформе, должна либо расширять данную модель скелетной абстракции в стандарте C, чтобы включить любые части модели абстракции платформы, которые были бы полезны для этой цели, или документировать разумную причину для других действий, но вопросы качества реализации находятся за пределами юрисдикции стандарта. Вопрос о том, следует ли ожидать, что конкретная реализация будет работать с пользой в случаях, выходящих за рамки предусмотренных стандартом, зависит от того, заинтересованы ли ее разработчики в том, чтобы сделать ее пригодной для широкого круга задач программирования низкого уровня, или заинтересованы только в пригодности для целей, предусмотренных стандартом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...