-routine-disable-interrupts -routine-enable-interrupts)Укажите процедуры отключения и повторного включения прерываний.
Этот параметр влияет только на анализ Bug Finder.
Эта опция недоступна для кода, сгенерированного в моделях MATLAB ® или Simulink ®.
Укажите подпрограмму, которая отключает все прерывания, и подпрограмму, которая повторно активизирует все прерывания.
Пользовательский интерфейс (только для настольных ПК): в конфигурации проекта эта опция доступна на узле многозадачности. Другие параметры, которые также необходимо включить, см. в разделе Зависимости.
файл командной строки и параметров: Использовать параметр -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 |
Пример (поиск ошибок):
polyspace-bug-finder -sources |
Пример (сервер поиска ошибок):
polyspace-bug-finder-server -sources |
-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)