Семафор и взаимоисключающая замена функции

Можно составить заменяющую таблицу кода для пользовательской цели, которая поддерживает параллельное выполнение. Создайте записи таблицы, которые задают пользовательские реализации взаимоисключающие операции или семафора. Таблица должна иметь четыре семафорных записи, четыре взаимоисключающих записи или обоих, и включать таблицу в заменяющую библиотеку пользовательского кода. (Семафор или взаимоисключающие записи взаимно зависят. Обеспечьте их в полных наборах четыре.)

Примечание

Пользовательская цель, которая поддерживает параллельную многозадачность, должна установить целевой параметр конфигурации ConcurrentExecutionCompliant. Для получения дополнительной информации смотрите Параллельное выполнение Поддержки Нескольких Задач (Simulink Coder).

Если процесс сборки генерирует семафор или взаимоисключающие вызовы функции для передачи данных между задачами во время генерации кода для многожильного целевого окружения, пользуйтесь пользовательской библиотекой. Библиотека может задать замены кода для пользовательского семафора или взаимоисключающих реализаций, которые оптимальны для вашего целевого окружения. Используя Заменяющий Инструмент Кода (crtool) или эквивалентные заменяющие функции кода, вы можете:

  • Сконфигурируйте заменяющие записи таблицы кода для пользовательского семафора или взаимоисключающих функций. Во время системного запуска, подписания кода для передачи данных между задачами и завершения работы системы сгенерированный код вызывает эти функции.

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

Сгенерированное взаимное исключение и семафорный код обычно состоят из этих элементов:

КодСгенерированный код
Образцовая инициализацияВызов функции инициализации, который создает взаимное исключение или семафорную функцию, чтобы управлять записью в критический раздел кода.
Образцовый шаг
  • Прежде чем код для передачи данных между задачами вводит критический раздел, взаимоисключающая блокировка или семафорные вызовы функции ожидания резервируют критический раздел кода.

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

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

Этот пример показывает, как создать заменяющие записи таблицы кода для взаимоисключающего заменяющего сценария. Вы конфигурируете многожильную целевую модель для параллельного выполнения и для передачи данных между задачами отличающихся уровней, какой Переход Уровня блокирует указатель. В сгенерированном коде для модели каждый блок Rate Transition имеет отдельное, уникальное взаимное исключение. Взаимоисключающая блокировка и разблокировала операции в Rate Transition, блокируют доступ к доле сгенерированного кода к тем же глобальным данным. Они достигают этого при помощи уникального взаимного исключения, созданного для того блока Rate Transition.

  1. Откройте Code Replacement Tool.

  2. Создайте и откройте новую таблицу.

  3. Назовите таблицу crl_table_rt_mutex.

  4. Создайте запись для взаимоисключающей замены функции инициализации.

    1. Выберите File > New entry> Semaphore entry, чтобы открыть новую запись таблицы для конфигурирования взаимоисключающая замена или семафор.

    2. Во вкладке Mapping Information используйте параметр Function, чтобы выбрать Mutex Init. Появляются начальные значения по умолчанию для записи таблицы. В разделе Conceptual function обычно можно оставить настройки аргумента в их значениях по умолчанию.

    3. В разделе DWork attributes выбрана опция Allocate DWork. Диалоговое окно обеспечивает уникальный тег записи для аргумента DWork d1.

      На панели DWork attributes сконфигурируйте аргумент DWork к заменяющей функции. Аргумент DWork поддерживает совместное использование семафора или взаимного исключения между:

      • Код, который создает семафор или взаимное исключение

      • Код, который запрашивает и оставляет доступ

      • Код, который удаляет семафор или взаимное исключение

      В этом примере аргумент DWork для функции Mutex Init задает уникальный тег записи, entry_25576. Эта функция также задает аргументы DWork для Mutex Lock, Mutex Unlock и Mutex Destroy, которые ссылаются на тег записи, чтобы совместно использовать данные DWork.

      Единственным типом данных, поддержанным для параметра Data type DWork, является void*.

    4. В разделе Replacement function введите имя функции в поле Name. Этот пример использует myMutexCreate. В списке Function arguments оставьте аргумент DWork типом данных d1 как void**.

      Предварительный просмотр подписи функции C:

      void myMutexCreate (void** d1);
    5. В разделе Replacement function выберите Function modifies internal or global state. Эта опция дает генератору кода команду не оптимизировать далеко функцию реализации, описанную этой записью, потому что это получает доступ к значениям глобальной памяти. Нажмите Apply. Опционально, можно нажать Validate entry, чтобы подтвердить информацию, вводимую во вкладку Mapping Information.

      Чтобы создать демонстрационную запись таблицы, сконфигурируйте заменяющую подпись функции без заменяющей функции и ее информации о сборке. Если заголовок и исходные файлы для этих функций доступны, выберите таблицу Build Information, чтобы задать их.

    6. Запись таблицы Mutex Init завершена. Опционально, можно сохранить таблицу к файлу и осмотреть код MATLAB®, созданный для табличного определения до сих пор.

  5. Повторите следующую последовательность, чтобы создать записи таблицы для взаимоисключающей блокировки, разблокировать и уничтожить функциональные замены. Каждая запись таблицы ссылается на уникальную запись тега DWork, entry_25576, заданный в записи таблицы Mutex Init.

    1. Выберите File > New entry> Semaphore entry.

    2. Во вкладке Mapping Information используйте параметр Function, чтобы выбрать Mutex Lock, Mutex Unlock или Mutex Destroy. Появляются начальные значения по умолчанию для записи таблицы. В разделе Conceptual function обычно можно оставить настройки аргумента в их значениях по умолчанию.

    3. Для взаимного исключения блока Rate Transition, ожидания, сообщения, и уничтожают функции, работают с DWork, выделенным при системном запуске взаимоисключающей функцией инициализации. В разделе DWork attributes проверьте, что опция Allocate DWork очищена. От DWork Allocator entry выпадающий список выберите тег записи, совпадающий со значением в записи таблицы Mutex Init. В этом примере тегом записи является entry_25576.

    4. В разделе Replacement function, поле Name, вводят имя функции. Этот пример использует myMutexLock, myMutexUnlock и myMutexDelete. В списке Function arguments оставьте аргумент DWork типом данных d1 как void*.

    5. В разделе Implementation attributes выберите опцию Function modifies internal or global state. Эта опция дает генератору кода команду не оптимизировать далеко функцию реализации, описанную этой записью, потому что это получает доступ к значениям глобальной памяти.

    6. Опционально, предоставьте информацию сборки для заменяющей функции на вкладке Build Information.

    7. Нажмите Apply. В средней панели щелкните правой кнопкой по записи таблицы и выберите Validate entry(s).

  6. Когда вы добавили записи таблицы для Mutex Lock, Mutex Unlock и Mutex Destroy к записи для Mutex Init, взаимоисключающая заменяющая таблица перехода уровня завершена. В крайней левой панели щелкните правой кнопкой по имени таблицы и выберите Validate table. Ошибки адресации и повторение табличная валидация.

  7. Сохраните таблицу к файлу MATLAB в вашей рабочей папке, например, с помощью File> Save table. Имя сохраненного файла является именем таблицы, crl_table_rt_mutex, с расширением .m. Опционально, можно открыть сохраненный файл и исследовать код MATLAB на заменяющее табличное определение кода.

Протестировать этот пример:

  1. Укажите заменяющее отображение кода.

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

  3. Сконфигурируйте модель для многожильного целевого окружения и следующих настроек:

    • На панели Solver выберите решатель фиксированного шага.

    • На панели Code Generation выберите ERT-based system target file.

    • На Code Generation> панель Interface, выберите заменяющую библиотеку кода, которая содержит вашу взаимоисключающую запись.

Похожие темы