Disabling all interrupts (-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 - источники file_name - "стандартная программа отключает прерывания" atomic_section_begins "стандартная программа, включают прерывания" atomic_section_ends
Пример (Сервер Bug Finder): сервер средства поиска ошибки полипробела - источники file_name - "стандартная программа отключает прерывания" atomic_section_begins "стандартная программа, включают прерывания" atomic_section_ends
Введенный в R2017a