exponenta event banner

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 -sources file_name Стандартная программа прерывания с отключением atomic_section_begins стандартной программы прерывания с разрешением atomic_section_ends
Пример (Bug Finder Server): polyspace-bug-finder-server -sources file_name Стандартная программа прерывания с отключением atomic_section_begins стандартной программы прерывания с разрешением atomic_section_ends
Введенный в R2017a