Генерация кода для рекурсивных функций

Чтобы сгенерировать код для рекурсивного MATLAB® functions, генератор кода использует рекурсию во время компиляции или рекурсию во время выполнения. Можно повлиять, использует ли генератор кода рекурсию во время компиляции или во время выполнения, изменив код MATLAB. Смотрите Force Code Generator, чтобы использовать рекурсию во время выполнения.

Можно запретить рекурсию или отключить рекурсию во время выполнения, изменив параметры конфигурации.

Когда вы используете рекурсивные функции в коде MATLAB, который предназначен для генерации кода, вы должны придерживаться определенных ограничений. Смотрите Ограничения рекурсивных функций для Генерации кода.

Рекурсия во время компиляции

С рекурсией во время компиляции генератор кода создает несколько версий рекурсивной функции в сгенерированном коде. Входы каждой версии имеют значения или размеры, настроенные для этой версии. Эти версии известны как function specializations. Можно сказать, что генератор кода использовал рекурсию во время компиляции, просматривая отчет генерации кода или сгенерированный код C. Вот пример рекурсии во время компиляции в отчете.

Иногда специализации функции не появляются в коде C/C + + из-за оптимизации. Для примера рассмотрим эту функцию:

function y = foo()
%#codegen
    x = 10;
    y = sub(x);
end

function y = sub(x)
coder.inline('never');
if x > 1
    y = x + sub(x-1);
else
    y = x;
end
end

В отчете о генерации кода на вкладке Function List показаны специализации функции MATLAB sub.

Однако код С не содержит специализаций. Она содержит одну функцию, которая возвращает значение 55.

Рекурсия во время выполнения

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

Запретить рекурсию

  • В объекте строения генерации кода установите CompileTimeRecursionLimit параметр конфигурации 0.

  • В приложении MATLAB Coder™ установите значение параметра Compile-time recursion limit равным 0.

Отключите рекурсию во время выполнения

Некоторые стандарты кодирования, такие как MISRA®, не допускать рекурсию. Чтобы увеличить вероятность генерации кода, который соответствует MISRA C®, отключить рекурсию во время выполнения.

  • В объекте строения генерации кода задайте EnableRuntimeRecursion на false.

  • В приложении MATLAB Coder установите Enable run-time recursion равным No.

Если ваш код требует рекурсии во время выполнения и рекурсия во время выполнения отключена, необходимо переписать код так, чтобы он использовал рекурсию во время компиляции или не использовал рекурсию.

Рекурсивные ограничения функции для генерации кода

Когда вы используете рекурсию в коде MATLAB, который предназначен для генерации кода, следуйте этим ограничениям:

  • Присвойте все выходы рекурсивной функции во время выполнения перед первым рекурсивным вызовом в функции.

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

  • Входы и выходы рекурсивных функций во время выполнения не могут быть классами.

  • Настройка максимального использования стека игнорируется для рекурсии во время выполнения.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте