-critical-section-begin -critical-section-end)Укажите функции, начинающие и завершающие критические сечения
Эта опция недоступна для кода, сгенерированного в моделях MATLAB ® или Simulink ®.
При проверке многозадачного кода Polyspace ® считает, что критический раздел лежит между вызовами функции блокировки и функции разблокировки .
lock(); /* Critical section code */ unlock();
lock() и unlock() в приведенном выше примере).Пользовательский интерфейс (только для настольных ПК): в конфигурации проекта эта опция доступна на узле многозадачности. Другие параметры, которые также необходимо включить, см. в разделе Зависимости.
файл командной строки и параметров: Использовать параметр -critical-section-begin и -critical-section-end. См. раздел Сведения о командной строке.
Когда задача my_task вызывает функцию блокировки my_lock, другие задачи, вызывающие my_lock должен подождать до my_task вызывает соответствующую функцию разблокировки. Поэтому операции с критическими секциями в других задачах не могут прерывать операции с критическими секциями в my_task.
Например, операция var++ в my_task1 и my_task2 не может прерывать друг друга.
int var;
void my_task1() {
my_lock();
var++;
my_unlock();
}
void my_task2() {
my_lock();
var++;
my_unlock();
}С помощью спецификаций программа проверки кода проверяет, защищает ли размещение функций блокировки и разблокировки все общие переменные от параллельного доступа. При определении значений этих переменных проверка учитывает тот факт, что критические разделы в различных задачах не прерывают друг друга.
Анализ Bug Finder использует информацию критического раздела для поиска дефектов параллелизма, таких как расхождение данных и взаимоблокировка.
По умолчанию нет
Щелкните
, чтобы добавить поле.
В программе запуска введите имя функции блокировки.
В поле «Завершение подпрограммы» введите имя функции разблокировки.
Введите имена функций или выберите их из списка.
Щелкните
для добавления поля и введите имя функции.
Щелкните
, чтобы перечислить функции в коде. Выберите функции из списка.
Чтобы включить этот параметр в интерфейсе пользователя настольных продуктов, сначала выберите этот параметр. Configure multitasking manually.
Можно также использовать примитивы, такие как функции POSIX ®pthread_mutex_lock и pthread_mutex_unlock для начала и завершения критических разделов. Список примитивов, которые Polyspace может обнаруживать автоматически, см. в разделе Автоматическое обнаружение создания потоков и критического сечения в Polyspace.
Для вызовов функций, начинающихся и завершающих критические разделы, Polyspace игнорирует аргументы функции.
Например, Polyspace рассматривает два приведенных ниже раздела кода как один и тот же критический раздел.
Запуск подпрограммы: my_lock | |
Завершение процедуры: my_unlock | |
void my_task1() {
my_lock(1);
/* Critical section code */
my_unlock(1);
} |
void my_task2() {
my_lock(2);
/* Critical section code */
my_unlock(2);
} |
Чтобы обойти ограничение, см. раздел Определение критических разделов с функциями, принимающими аргументы.
Функции, которые начинаются и заканчиваются критическими разделами, должны быть функциями. Например, если определить функциональный макрос:
#define init() num_locks++
init() для начала или завершения критического сечения.При использовании нескольких критических разделов можно столкнуться с такими проблемами, как:
Взаимоблокировка: последовательность вызовов функций блокировки заставляет две задачи блокировать друг друга.
Двойная блокировка: функция блокировки вызывается дважды в задаче без промежуточного вызова функции разблокировки.
Для обнаружения таких проблем используйте Finder™ Polyspace Bug. См. раздел Дефекты параллелизма.
Затем используйте Prover™ Polyspace Code, чтобы определить, действительно ли размещение функций блокировки и разблокировки защищает все общие переменные от параллельного доступа. См. раздел Глобальные переменные (средство проверки кода Polyspace).
При рассмотрении возможных значений общих переменных при проверке средства проверки кода учитываются ваши спецификации для критических разделов.
Однако если общая переменная является указателем или массивом, программное обеспечение использует спецификации только для определения того, является ли переменная общей защищенной глобальной переменной. При проверке ошибок во время выполнения программное обеспечение не учитывает ваши спецификации и считает, что к переменной можно обращаться одновременно.
Параметр: -critical-section-begin | -critical-section-end |
| По умолчанию нет |
Значение: |
Пример (поиск ошибок):
polyspace-bug_finder -sources |
Пример (проверка кода): polyspace-code-prover -sources |
Пример (сервер поиска ошибок):
polyspace-bug_finder-server -sources |
Пример (сервер проверки кода):
polyspace-code-prover-server -sources |
-non-preemptable-tasks | -preemptable-interrupts | Cyclic tasks (-cyclic-tasks) | Interrupts (-interrupts) | Tasks (-entry-points) | Temporally exclusive tasks (-temporal-exclusions-file)