exponenta event banner

Защита глобальных данных с помощью const и volatile Квалификаторы типов

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

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

    Если предопределенные классы хранения не соответствуют вашим требованиям, можно создать собственный пользовательский класс хранения. Чтобы пользовательский класс хранения применил квалификаторы, в конструкторе пользовательских классов хранения установите раздел «Память» в соответствующий раздел встроенной памяти или в созданный раздел памяти. Дополнительные сведения см. в разделе Создание классов хранения с помощью пользовательского конструктора классов хранения.

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

    Если предопределенные классы хранения не соответствуют вашим требованиям, вы можете создать свой собственный, используя Embedded Coder Dictionary. В словаре для нового класса хранения установите соответствующие флажки в разделе Квалификаторы. Дополнительные сведения см. в разделе Создание определений кодов для использования в редакторе сопоставлений кодов.

Поддержать const Корректность аргументов функций точек входа

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

Неправильные результаты или неопределенное поведение при передаче изменчивых данных сгенерированной функции

Сгенерированный код может определять и вызывать функции, отличные от функций точки входа модели. Например, можно настроить атомарную подсистему так, чтобы она отображалась в коде как отдельная функция. Кроме того, блоки таблиц подстановки, такие как n-D Lookup Table, обычно дают отдельные служебные функции.

Если созданный код определяет функцию, имеющую аргумент (формальный параметр), определение функции не применяется volatile к аргументу. Поэтому, когда другой сгенерированный код или внешний код вызывает функцию и передает переменную-переменную в качестве значения аргумента, вызываемая функция неявно отбрасывает волатильность.

Если приложение выполняет вызываемую функцию при изменении значения изменяемых данных, функция может привести к неправильным результатам или неопределенному поведению. В частности, для данных таблицы поиска, которые вы подготавливаете для калибровки, применяя const и volatileубедитесь, что данные не откалиброваны, пока приложение выполняет утилиты поиска.

Связанные темы