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 Function, смотрите, Настраивают Интерфейсы Функции Точки входа для Simulink Функциональные и Функциональные Блоки Вызывающей стороны.
Сгенерированный код может задать и вызвать функции кроме функций точки входа модели. Например, можно сконфигурировать атомарную подсистему, чтобы появиться в коде как отдельная функция. Кроме того, блоки интерполяционной таблицы, такие как n-D Lookup Table, обычно дают к отдельным служебным функциям.
Когда сгенерированный код задает функцию, которая имеет аргумент (формальный параметр), функциональное определение не применяет volatile
к аргументу. Поэтому, когда другой сгенерированный код или ваш внешний код вызывают функцию и передают энергозависимую переменную как значение аргумента, вызванная функция неявно выбрасывает энергозависимость.
Если ваше приложение выполняет вызванную функцию, в то время как значение энергозависимых изменений данных, функция может привести к неправильным результатам или неопределенному поведению. В частности, для данных об интерполяционной таблице, которые вы готовите к калибровке путем применения const
и volatile
, убедитесь, что вы не калибруете данные, в то время как ваше приложение выполняет утилиты поиска.