const
и спецификаторами типа volatile
В C вы используете спецификатор типа const
, чтобы предотвратить код в приложении от присвоения нового значения к переменной. В приложении, где внешний агент (например, аппаратное устройство) может управлять значением переменной, вы используете ключевое слово volatile
, чтобы препятствовать тому, чтобы компилятор оптимизировал ассемблерный код способом, который ставит под угрозу целостность значения переменных. Можно также использовать volatile
, чтобы препятствовать тому, чтобы компилятор устранил устройство хранения данных для данных const
, такой в качестве параметра, который имеет значение, которое вы хотите настроить во время выполнения.
Чтобы применить спецификаторы к отдельному элементу данных в модели, включая пользовательскую структуру, которую вы создаете при помощи невиртуальной шины или структуры параметра, применяют соответствующий встроенный пользовательский класс памяти непосредственно к элементу данных. Пользовательский класс памяти предотвращает оптимизацию, такую как Default parameter behavior от устранения устройства хранения данных для элемента данных. Для примера смотрите Спецификаторы Типа. Для получения информации об оптимизации, которую предотвращает непосредственно прикладной класс памяти, смотрите Как Хранилища Сгенерированного кода Внутренний Сигнал, состояние и Данные о Параметре.
Если встроенные пользовательские классы памяти не удовлетворяют ваши требования, можно создать собственный класс памяти. Чтобы заставить ваш пользовательский класс памяти применить спецификаторы, в Custom Storage Class Designer, устанавливают Memory section на соответствующий встроенный раздел memory или на раздел memory, который вы создаете. Для получения дополнительной информации смотрите, Создают Пользовательские Классы памяти при помощи Custom Storage Class Designer.
Можно применить спецификаторы к категории данных модели по умолчанию, такие как параметры или состояния. Когда вы добавляете блоки в модель, новые элементы данных в этих категориях несут спецификаторы, которые вы задаете. Для получения дополнительной информации смотрите, Конфигурируют Генерацию кода По умолчанию для Данных.
Если встроенные классы памяти не удовлетворяют ваши требования, можно создать собственное при помощи Словаря Embedded Coder. В Словаре, для вашего нового класса памяти, устанавливают соответствующие флажки под Qualifiers. Для получения дополнительной информации смотрите, Создают Определения Кода для Использования в качестве Настроек генерации кода По умолчанию.
const
для аргументов функций точки входаКогда ваш внешний код вызывает сгенерированную функцию точки входа и передает данные const
через аргумент (формальный параметр) функции, чтобы привести соответствующий аргумент в функциональном определении const
, настроить выполнение (шаг) интерфейс функции точки входа.
Чтобы сконфигурировать интерфейс функции точки входа шага для модели, смотрите Значение по умолчанию Переопределения C Интерфейс Ступенчатой функции.
Чтобы сконфигурировать интерфейс функции точки входа шага для Функционального блока Simulink, смотрите, Настраивают Интерфейсы Функции Точки входа для Simulink Функциональные и Функциональные Блоки Вызывающей стороны.
Сгенерированный код может задать и вызвать функции кроме образцовых функций точки входа. Например, можно сконфигурировать атомарную подсистему, чтобы появиться в коде как отдельная функция. Кроме того, блоки интерполяционной таблицы, такие как Интерполяционная таблица n-D, обычно приводят к отдельным служебным функциям.
Когда сгенерированный код задает функцию, которая имеет аргумент (формальный параметр), функциональное определение не применяет volatile
к аргументу. Поэтому, когда другой сгенерированный код или ваш внешний код вызывают функцию и передают энергозависимую переменную как значение аргумента, вызванная функция неявно выбрасывает энергозависимость.
Если ваше приложение выполняет вызванную функцию, в то время как значение энергозависимых изменений данных, функция может привести к неправильным результатам или неопределенному поведению. В частности, для данных об интерполяционной таблице, которые вы готовите к калибровке путем применения const
и volatile
, убеждаются, что вы не калибруете данные, в то время как ваше приложение выполняет утилиты поиска.