exponenta event banner

Выполнение анализа Polyspace для пользовательского кода в блоках вызывающих абонентов C и диаграммах статусов

Можно проверить ошибки и ошибки времени выполнения в пользовательском коде C/C + +, используемом в модели Simulink ®. Анализ Polyspace ® проверяет функции, вызываемые из блоков Caller и диаграмм Stateflow ® с входными данными модели.

Предпосылки

Перед запуском Polyspace из Simulink необходимо связать установки Polyspace и MATLAB ®. См. раздел Интеграция полиспейса с MATLAB и Simulink.

Чтобы открыть модели, используемые в этом примере, найдите этот пример в браузере справки MATLAB и нажмите кнопки Открыть модель (Open Model).

Функция C/C + +, вызываемая один раз в модели

В этом примере используется функция, вызываемая в модели только один раз из блока C Caller (Simulink). Анализ проверяет функцию с помощью входов в блок C Caller.

Открыть модель для выполнения анализа по пользовательскому коду

Открытие модели mSlccBusDemo для анализа пользовательского кода с помощью Polyspace. Модель содержит блок вызывающего абонента C, вызывающий функцию counterbusFcn определено в файле hCounterBus.c (объявлено в файле hCounterBus.h). Модель использует переменные, сохраненные в файле MAT dLctData.mat, которая загружается в модель с помощью обратного вызова.

Выполнить анализ

Настройте параметры анализа и запустите Polyspace.

  1. На вкладке «Приложения» выберите «Проверка кода полиспейса», чтобы открыть вкладку «Полиспейс».

  2. Укажите тип анализа:

    • Выберите продукт для запуска, средство поиска ошибок или средство проверки кода.

    • Укажите, что анализ должен выполняться по пользовательскому коду в модели, а не по сгенерированному коду.

      В поле Analyze Code from отображается имя модели. Под полем вместо «Код, созданный в качестве модели верхнего уровня» выберите «Пользовательский код, используемый в модели».

  3. Выберите Выполнить анализ (Run Analysis).

    Следите за ходом анализа в окне команд MATLAB. После анализа на вкладке Полиспейс (Polyspace) выберите Результаты анализа (Analysis Results). Результаты открываются в интерфейсе пользователя Polyspace.

Этот же анализ можно выполнить из MATLAB следующим образом. Сценарий содержит команды для загрузки модели и .mat файл, содержащий переменные, используемые в модели.

openExample('polyspace_code_prover/OpenModelForRunningAnalysisOnCustomCodeExample');
load_system('mSlccBusDemo');
load('dLctData.mat');

mlopts = pslinkoptions('mSlccBusDemo'); 
mlopts.VerificationMode = 'CodeProver'; 
pslinkrun('-slcc','mSlccBusDemo',mlopts);

Устранение проблем

Результаты анализа отображаются на панели Список результатов (Results List) в интерфейсе пользователя Polyspace. Выберите каждый результат и просмотрите дополнительные сведения на панели Сведения о результате (Result Details) и соответствующий исходный код на панели Источник (Source).

В остальном этом учебном пособии показано, как исследовать и устранять проблемы, обнаруженные в анализе программы проверки кода. Аналогичные шаги можно выполнить для проблем, обнаруженных в Bug Finder.

При выполнении анализа проверки кода результаты содержат оранжевую проверку переполнения.

Проверка выделяет операцию добавления в counterbusFcn функция, которая может переполнить:

limit = u1->inputsignal.input + u2;
Операнды поступают из входных данных в counterbusFcn, которые, в свою очередь, поступают с этих входов в блок C Caller:

  • Сигнал шины COUNTERBUS, который объединяет сигналы input, upper_saturation_limit и lower_saturation_limit. Сигнал input является неограниченным.

  • Обратная связь от самого блока вызывающего абонента C через блок задержки.

Можно ограничить сигнал input несколькими способами. Например, можно ограничить переменную сигнала шины SIGNALBUS который происходит от input:

  1. В редакторе Simulink откройте Обозреватель моделей (Model Explorer) на вкладке Моделирование (Modeling).

  2. Базовые переменные рабочей области содержат переменную SIGNALBUS. Выберите эту переменную и откройте редактор шины для редактирования этой переменной. Укажите минимальное и максимальное значения переменной.

    Сохраните объект шины в MAT-файле. Файл можно перезаписать dLctData.mat или создайте файл.

Можно также ограничить обратную связь от блока C Caller несколькими способами. Например, можно насытить сигнал обратной связи:

  1. Добавьте блок насыщения непосредственно перед вводом сигнала обратной связи в блок вызывающего абонента C.

  2. На вкладке Атрибуты сигнала (Signal Attributes) укажите минимальное и максимальное значения для вывода блока насыщения.

    Обратите внимание, что указания нижнего и верхнего предела на вкладке «Главная» блока «Насыщение» недостаточно для ограничения сигнала для анализа в пространстве. В анализе используются диапазоны проектирования, указанные на вкладке Атрибуты сигнала (Signal Attributes).

Повторите анализ. Проверка переполнения в новом наборе результатов имеет зеленый цвет.

Функция C/C + +, вызываемая несколько раз в модели

В этом примере используется функция, вызываемая из нескольких блоков C Caller в модели. Функция просто возвращает произведение двух своих аргументов.

В этом примере выполняется анализ проверки кода и показано, как определить контекст вызова функции, начиная с результатов проверки кода. Как правило, в анализе Bug Finder нет необходимости различать различные контексты вызовов.

Открыть модель для анализа всего пользовательского кода

Открытие модели multiCCallerBlocks для выполнения анализа Polyspace.

openExample('polyspace_bf/OpenModelForAnalyzingAllCustomCodeExample');
open_system('multiCCallerBlocks');

Проверка модели

Модель содержит два блока вызывающего абонента C, вызывающих одну и ту же функцию times_n. Входы в один блок вызывающего абонента C поступают от двух блоков Inport, которые имеют неограниченный вход. Входы в другой блок C Caller поступают из блока Constant и блока Inport, вход которого ограничен блоком Saturation.

Для просмотра диапазонов проектирования для блока C Caller с ограниченными входами:

  • Дважды щелкните блок «Константа» или блок «Насыщенность».

  • На вкладке Атрибуты сигнала (Signal Attributes) обратите внимание на диапазон проектирования.

    Например, хотя блок константы имеет постоянное значение, установленное равным 3, расчетный диапазон для проверки составляет от 2,5 до 3,5.

    Расчетный диапазон для блока насыщения составляет [-1,1].

Выполнить анализ и анализ результатов

Выполните анализ, как в предыдущем примере, и откройте результаты.

На панели «Список результатов» отображается оранжевая проверка переполнения. Продукт в times_n переполнение функции.

#include "file.h"

double times_n(double x, double n) {
  return x * n;
}
Потому что times_n функция вызывается из двух контекстов, оранжевый цвет объединяет оба контекста и может указывать на две возможные ситуации:

  • Переполнение происходит в обоих контекстах вызова.

  • Доказано, что переполнение не происходит в одном контексте (зеленая проверка) и может произойти в другом контексте (оранжевая проверка).

Чтобы определить, какой контекст вызова приводит к переполнению:

  1. Просмотр всех вызывающих абонентов times_n.

    Установите оранжевую проверку переполнения. На панели Сведения о результатах (Result Details) щелкните значок. На панели «Иерархия вызовов» отображаются вызывающие абоненты times_n.

  2. На панели «Иерархия вызовов» в качестве вызывающих абонентов отображаются две функции-оболочки. Каждая функция оболочки представляет блок вызывающего абонента C в модели.

    Выберите одну из функций оболочки, чтобы открыть исходный код для customcode_wrappers.c.

  3. На панели «Источник» проверьте код функций оболочки. Чтобы определить, какие входные данные приводят к переполнению, используйте подсказки на подчеркнутых входных данных.

    Например, функция обертки для блока C Caller, который имеет ограниченные входы, выглядит аналогично этому коду:

    /* Go to model '<Root>/C Caller1' */
    /* Variables corresponding to inputs for block C Caller1 */
     real64_T _pslink_C_Caller1_In1;
     real64_T _pslink_C_Caller1_In2;
    /* Variables corresponding to outputs for block C Caller1 */
     real64_T _pslink_C_Caller1_Out1;
    /* Wrapper functions for code in block C Caller1 */
    void _pslink_step_C_Caller1(void) {
        /* See tooltips on function inputs for input ranges */
        _pslink_C_Caller1_Out1 = times_n(_pslink_C_Caller1_In1, _pslink_C_Caller1_In2);
    }
    Используйте подсказки для переменных, чтобы определить их диапазоны. Например, всплывающая подсказка для переменной _pslink_C_Caller1_In1 показывает, что он находится в диапазоне [2.5, 3.5] и подсказка на _pslink_C_Caller1_In2 показывает, что он находится в диапазоне [-1,1]. Поэтому произведение двух входов не может переполняться. Переполнение должно происходить из другого контекста вызова. Можно просмотреть подсказки на входах для другого вызова и подтвердить, что переменные являются неограниченными.

    Чтобы найти блок вызывающего абонента C, соответствующий функции оболочки, на панели «Источник» щелкните ссылку имени синего блока над функцией оболочки (в строке, начинающейся с Go to model). Блок C Caller подсвечивается в модели.

Включить контекстную чувствительность и повторный анализ

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

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

В этом примере, чтобы включить чувствительность к контексту для times_n функция:

  1. В модели на вкладке «Полиспейс» выберите «Параметры» > «Параметры проекта».

    Либо в интерфейсе пользователя «Полиспейс» выберите «Диспетчер проектов». Откройте конфигурацию проекта, созданного для анализа.

  2. В узле Верификация проверочного кода > Точность выберите custom для параметра Контекст чувствительности. В поле Процедура щелкнитеplus button и введите times_n.

    См. также Sensitivity context (-context-sensitivity).

Повторно запустите анализ из модели и снова откройте результаты. Установите оранжевую проверку переполнения.

На панели Сведения о результате (Result Details) контексты вызовов отображаются отдельно. Можно видеть, что переполнение происходит только для вызова с неограниченными входами (строка с оранжевым текстом) и не происходит для другого вызова (строка с зеленым текстом).

Щелкните строку с оранжевым текстом, чтобы непосредственно перейти к функции обертки, ведущей к проверке оранжевого цвета. Из функции обертки можно перейти к блоку C Caller с неограниченными входами.

См. также

|

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