-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.
Стандартная программа, которую вы задаете для опции, отключает вытеснение всеми:
Нециклические задачи.
Смотрите Tasks (-entry-points).
Циклические задачи.
Смотрите Cyclic tasks (-cyclic-tasks).
Прерывания.
Смотрите Interrupts (-interrupts).
Другими словами, анализ полагает, что орган по операциям между стандартной программой отключения и стандартной программой включения является атомарным и не прерываемым вообще.
Защита через отключение прерываний концептуально отличается от защиты через критические разделы.
В модели многозадачности 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 - источники |
Пример (Сервер Bug Finder):
сервер средства поиска ошибки полипробела - источники |
-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)