exponenta event banner

Отключение всех прерываний (-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.

Совет

  • Процедура, указанная для опции, отключает преимущественное отключение всеми:

    Другими словами, анализ считает, что совокупность операций между подпрограммой отключения и подпрограммой включения является атомной и вообще не прерывается.

  • Защита через блокирующие прерывания концептуально отличается от защиты через критические секции.

    В многозадачной модели 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 file_name -routine-disable-interrupts atomic_section_begins -routine-enable-interrupts atomic_section_ends
Пример (сервер поиска ошибок): polyspace-bug-finder-server -sources file_name -routine-disable-interrupts atomic_section_begins -routine-enable-interrupts atomic_section_ends
Представлен в R2017a