-routine-disable-interrupts
-routine-enable-interrupts
)Задайте стандартные программы, которые отключают и повторно включают прерывания.
Эта опция влияет на анализ Средства поиска Ошибки только.
Задайте стандартную программу, которая отключает все прерывания и стандартную программу, которая повторно включает все прерывания.
Пользовательский интерфейс (только десктопные решения): В вашей настройке проекта опция доступна на узле 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 |
Пример (Средство поиска Ошибки):
Polyspace 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)