-routine-disable-interrupts
-routine-enable-interrupts)Задайте стандартные программы, которые отключают и повторяют прерывания.
Эта опция влияет только на анализ Bug Finder.
Эта опция недоступна для кода, сгенерированного из MATLAB® код или Simulink® модели.
Задайте стандартную программу, которая отключает все прерывания, и стандартную программу, которое снова включает все прерывания.
Пользовательский интерфейс (только для настольных продуктов): В строении проекта опция доступна на узле Multitasking. Смотрите Зависимости для других опций, которые вы также должны включить.
Командная строка и файл опций: Используйте опцию -routine-disable-interrupts и -routine-enable-interrupts. См. «Информация о командной строке».
Анализ использует информацию для поиска дефектов гонки данных. Например, в следующем коде функция disable_all_interrupts отключает все прерывания до тех пор, пока функция не enable_all_interrupts вызывается. Даже если task, isr1 и isr2 выполняются одновременно, операции x=0 или x=1 невозможно прервать операцию x++. Дефекты гонки данных отсутствуют.
int x;
void isr1() {
x = 0;
}
void isr2() {
x = 1;
}
void task() {
disable_all_interrupts();
x++;
enable_all_interrupts();
}По умолчанию нет
В Disabling routine введите стандартную программу, которая отключает все прерывания.
В Enabling routine введите стандартную программу, которая снова включает все прерывания.
Введите имена функции или выберите из списка.
Щелкните
, чтобы добавить поле и ввести имя функции.
Щелкните
, чтобы отобразить функции в коде. Выберите функции из списка.
Чтобы включить эту опцию в пользовательском интерфейсе продуктов для настольных ПК, сначала выберите опцию Configure multitasking manually.
Заданная для опции стандартная программа отключает вытеснение всеми:
Нециклические задачи.
Циклические задачи.
Прерывания.
Другими словами, анализ считает, что тело операций между стандартной программой отключения и стандартной программой включения является атомарным и не прерывается вообще.
Защита посредством отключения прерываний концептуально отличается от защиты через критические разделы.
В Polyspace® многозадачная модель, для защиты двух разделов кода друг от друга через критические разделы, необходимо встраивать их в один и тот же критический раздел. Другими словами, вы должны поместить два раздела между вызовами одной и той же функции блокировки и разблокировки.
Например, предположим, что вы используете критические сечения следующим образом:
void isr1() {
begin_critical_section();
x = 0;
end_critical_section();
}
void isr2() {
x = 1;
}
void task() {
begin_critical_section();
x++;
end_critical_section();
}x++ защищен от операции x=0 в isr1, но не от операции x=1 в isr2. Если функция begin_critical_section отключил все прерывания, вызывая их перед x++ было бы достаточно, чтобы защитить его.Как правило, вы используете одну пару стандартных программ в коде, чтобы отключить и повторить прерывания, но у вас может быть много пар функций блокировки и разблокировки, которые реализуют критические разделы.
Стандартные программы, которые отключают и включают прерывания, должны быть функциями. Например, если вы задаете функциональный макрос:
#define disable_interrupt() interrupt_flag=0
disable_interrupt() как обычная процедура отключения прерывания.Параметр: -routine-disable-interrupts | -routine-enable-interrupts |
| По умолчанию нет |
Значение: function_name |
Пример (Bug Finder):
Polyspace Bug Finder -sources file_name |
Пример (Bug Finder Server):
polyspace-bug-finder-server -sources file_name |
-non-preemptable-tasks | -preemptable-interrupts | Critical section details (-critical-section-begin -critical-section-end) | Cyclic tasks (-cyclic-tasks) | Interrupts (-interrupts) | Tasks (-entry-points) | Temporally exclusive tasks (-temporal-exclusions-file)