const
и volatile
Типы квалификаторовВ C используется квалификатор типа const
чтобы предотвратить присвоение переменной нового значения кодом в приложении. В приложении, где внешний актёр (для примера, аппаратное устройство) может манипулировать значением переменной, вы используете ключевое слово volatile
чтобы предотвратить оптимизацию кода сборки компилятором таким образом, чтобы это снижало целостность значения переменных. Можно также использовать volatile
чтобы предотвратить удаление компилятором хранилища для const
данные, такие как параметр, которое имеет значение, которое вы хотите настроить во время выполнения.
Чтобы применить квалификаторы к отдельному элементу данных в модели, включая пользовательскую структуру, которую вы создаете с помощью невиртуальной шины или структуры параметра, примените соответствующий предопределенный класс памяти непосредственно к элементу данных. Класс памяти препятствует тому, чтобы такие оптимизации, как Default parameter behavior, исключали хранилище для элемента данных. Для получения примера смотрите Type Qualifiers. Для получения информации об оптимизации, которую предотвращает непосредственно применяемый класс памяти, смотрите Как Сгенерированный код хранит внутренний сигнал, состояние и данные параметра.
Если предопределенные классы памяти не соответствуют вашим требованиям, можно создать свой собственный пользовательский класс памяти. Чтобы пользовательский класс памяти применил квалификаторы, в Custom Storage Class Designer установите Memory section в соответствующий встроенный раздел памяти или в созданный раздел памяти. Для получения дополнительной информации смотрите Создание классов памяти при помощи Custom Storage Class Designer.
Можно применить квалификаторы к категории данных моделей по умолчанию, таким как параметры или состояния. Когда вы добавляете блоки к модели, новые элементы данных в этих категориях несут определяемые вами квалификаторы. Дополнительные сведения см. в разделе Настройка генерации кода по умолчанию для данных.
Если предопределенные классы памяти не соответствуют вашим требованиям, можно создать собственные с помощью словаря Embedded Coder. В словаре для нового класса памяти установите соответствующие флажки под Qualifiers. Для получения дополнительной информации смотрите Создание определений кода для использования в редакторе отображений кода.
const
Правильность для аргументов функций точки входаКогда ваш внешний код вызывает сгенерированную функцию точки входа и передает const
данные через аргумент (формальный параметр) функции, чтобы сделать соответствующий аргумент в определении функции const
, настройте интерфейс функции точки входа выполнения (шаг).
Чтобы сконфигурировать интерфейс функции точки входа для модели, смотрите Сконфигурируйте имя и аргументы для отдельных функций шага.
Чтобы сконфигурировать интерфейс функции точки входа для блока Simulink Function, смотрите Configure Entry-Point Function Interfaces for Simulink Function и Function Caller Blocks.
Сгенерированный код может определять и вызывать функции, отличные от функций точки входа модели. Для примера можно сконфигурировать атомарную подсистему, которая появится в коде как отдельная функция. Кроме того, блоки интерполяционной таблицы, такие как n-D Lookup Table, обычно дают отдельные служебные функции.
Когда сгенерированный код задает функцию, которая имеет аргумент (формальный параметр), определение функции не применяется volatile
к аргументу. Поэтому, когда другой сгенерированный код или ваш внешний код вызывает функцию и передает изменчивую переменную в качестве значения аргумента, вызываемая функция неявно отбрасывает волатильность.
Если ваше приложение выполняет вызываемую функцию во время изменения значения летучих данных, функция может привести к неправильным результатам или неопределенному поведению. В частности, для данных интерполяционной таблицы, которые вы готовите к калибровке, путем применения const
и volatile
убедитесь, что вы не калибруете данные во время выполнения приложения утилит поиска.