Можно изменить стиль кода, выражения приведения типа и добавление отступа сгенерированного кода, чтобы соответствовать определенным стандартам кодирования. Измените параметры стиля путем установки параметров на Code Generation> панель Code Style.
Цель | Действие |
---|---|
Задайте стиль parenthesization для сгенерированного кода | Смотрите круглые скобки управления в сгенерированном коде. |
Задайте, сохранить ли порядок операндов в выражениях | Смотрите оптимизируют код путем переупорядочения заменимых операндов. |
Задайте, сохранить ли пустые первичные выражения условия в операторах if | Смотрите выражение условия Заповедника в операторе if. |
Задайте, сгенерировать ли код для логики решения if-elseif-else как операторы switch-case | Смотрите Преобразовывают if-elseif-else шаблоны в операторов case оператора switch. |
Задайте, включать ли ключевое слово extern в объявления функции в сгенерированном коде | Смотрите ключевое слово экстерна Заповедника в объявлениях функции. |
Задайте, включать ли ключевое слово static в объявления функции в сгенерированном коде | Смотрите Заповедник статическое ключевое слово в объявлениях функции. |
Задайте, сгенерировать ли случаи default для операторов switch-case в коде для графиков Stateflow® | Смотрите подавляют генерацию случаев по умолчанию для недостижимых операторов switch Stateflow. |
Задайте, заменить ли умножение степенями двойки с поразрядными сдвигами со знаком | Смотрите умножение замены степенями двойки с поразрядными сдвигами со знаком. |
Задайте, позволить ли право со знаком, поразрядно переключает сгенерированный код C/C++ на нижний регистр | Смотрите генерируют код со сдвигами вправо на целых числах со знаком. |
Задайте, как генератор кода бросает типы данных для переменных | Смотрите выражения приведения типа управления в сгенерированном коде. |
Задайте стиль отступа для сгенерированного кода | Смотрите стиль добавления отступа управления в сгенерированном коде. |
Задайте символ новой строки в сгенерированном коде | Смотрите стиль новой строки управления в сгенерированном коде. |
Задайте максимальную ширину линии для переноса сгенерированного кода. | Смотрите ширину линии максимума управления сгенерированного кода. |
Код С содержит некоторые синтаксически необходимые круглые скобки и может содержать дополнительные круглые скобки, которые изменяют семантику переопределяющим приоритетом оператора по умолчанию. Код С может также содержать дополнительные круглые скобки, которые не имеют никакого функционального значения, но только увеличивают удобочитаемость кода. Дополнительные круглые скобки C отличаются между двумя стилистическими экстремальными значениями:
Включайте минимальные круглые скобки, требуемые Синтаксисом C и переопределениями приоритета так, чтобы правила приоритета C задали всю семантику, если не заменено круглыми скобками.
Включайте максимальные круглые скобки, которые могут существовать без дублирования так, чтобы правила приоритета C стали не важными. Одни только круглые скобки полностью задают всю семантику.
Понимание кода с минимальными круглыми скобками может потребовать применения неочевидных правил приоритета. Максимальные круглые скобки могут препятствовать чтению кода путем избиения очевидных правил приоритета. Различные parenthesization стандарты существуют, которые задают один или другое экстремальное значение или задают промежуточный стиль, полезный для людей, которые считали код.
Для получения дополнительной информации об этом параметре смотрите уровень Круглых скобок.
Этот пример показывает, что Embedded Coder® обеспечивает три уровня управления для круглых скобок в сгенерированном коде.
model='rtwdemo_parentheses';
open_system(model)
rtwdemoclean; close_system(model,0)
Этот пример показывает, как переупорядочить заменимые операнды, чтобы сделать выражения леворекурсивными. Эта оптимизация повышает эффективность кода.
Чтобы переупорядочить заменимые операнды, создайте следующую модель и назовите ее operand_order
. В этой модели выходной сигнал является результатом умножения сигнала от блока Inport, In1
суммой сигналов от Inport блокирует In2
и In3
.
Откройте диалоговое окно Model Configuration Parameters. На вкладке Code Style выберите параметр Preserve operand order in expression.
Сгенерируйте код для модели.
В файле operand_order.c
функция operand_order_step
содержит следующий код:
operand_order_Y.Out1 = operand_order_U.In1 * (operand_order_U.In2 + operand_order_U.In3);
Генератор кода сохраняет заданный порядок выражения в модели. Сохранение заданного порядка выражения увеличивает удобочитаемость кода в целях трассируемости кода.
Откройте диалоговое окно Model Configuration Parameters. На вкладке Code Style очистите параметр Preserve operand order in expression.
Сгенерируйте код для модели.
В файле operand_order.c
функция operand_order_step
содержит следующий код:
operand_order_Y.Out1 = (operand_order_U.In2 + operand_order_U.In3) * operand_order_U.In1;
Генератор кода оптимизирует код путем переупорядочения заменимых операндов, чтобы сделать выражение леворекурсивным. Леворекурсивные выражения повышают эффективность кода.
Для получения дополнительной информации о параметре Preserve operand order in expression смотрите порядок операнда Заповедника в выражении.
Этот пример показывает, как задать, сгенерировать ли случаи по умолчанию для операторов case оператора switch в коде для диаграмм Stateflow. Сгенерированный код, который не содержит случаи по умолчанию, сохраняет потребление ROM и включает лучшее покрытие кода, потому что каждое ответвление в сгенерированном коде является фальсифицируемым.
Некоторые стандарты кодирования, такие как MISRA, требуют случая по умолчанию для операторов case оператора switch. Если вы хотите увеличить свои возможности создания MISRA C совместимый код, сгенерируйте случаи по умолчанию для недостижимых операторов switch Stateflow.
Рисунки 1, 2, и 3 показывают соответствующие фрагменты модели sldemo_fuelsys
, система с обратной связью, содержащая объект и контроллер. Логикой контроллера скорости Воздушного топлива является диаграмма Stateflow, которая задает различные режимы работы.
Рисунок 1: модель верхнего уровня объекта и контроллера
Рисунок 2: Топливная подсистема контроллера скорости
Рисунок 3: Топливная логика контроллера скорости
В Окне Команды MATLAB чтобы открыть sldemo_fuelsys
через rtwdemo_fuelsys
войдите:
rtwdemo_fuelsys
Откройте Образцовое диалоговое окно Параметров конфигурации. На вкладке Code Generation> Code Style очистите параметр Suppress generation of default cases for Stateflow statements if unreachable.
В Окне Команды MATLAB, чтобы создать модель, введите:
rtwbuild('sldemo_fuelsys/fuel_rate_control');
Для различных режимов работы файл fuel_rate_control.c
содержит случаи по умолчанию для недостижимых операторов switch. Например, для режима работы Завершения работы, сгенерированный код содержит этот оператор по умолчанию:
default: /* Unreachable state, for coverage only */ rtDWork.bitsForTID0.is_Fuel_Disabled = IN_NO_ACTIVE_CHILD; break;
Для режима работы Прогрева сгенерированный код содержит этот оператор по умолчанию:
default: /* Unreachable state, for coverage only */ rtDWork.bitsForTID0.is_Low_Emissions = IN_NO_ACTIVE_CHILD; break;
Откройте диалоговое окно Configuration Parameters. На вкладке Code Generation> Code Style выберите параметр Suppress generation of default cases for Stateflow statements if unreachable.
Создайте модель.
Прочитайте файл fuel_rate_control.c
. Случаи по умолчанию для недостижимых операторов switch не находятся в сгенерированном коде.
Для получения дополнительной информации о параметре Suppress generation of default cases for Stateflow statements if unreachable смотрите, Подавляют генерацию случаев по умолчанию для операторов switch Stateflow, если недостижимый.
Этот пример показывает, как сгенерировать код, который заменяет умножение степенями двойки с поразрядными сдвигами со знаком. Код, который содержит поразрядные сдвиги, более эффективен, чем код, который содержит умножение степенями двойки.
Некоторые стандарты кодирования, такие как MISRA, не позволяют битовые операции на целых числах со знаком. Если вы хотите увеличить свои возможности создания MISRA C совместимый код, не заменяйте умножение степенями двойки с поразрядными сдвигами.
Чтобы заменить умножение степенями двойки с поразрядными сдвигами, создайте следующую модель. В этой модели сигнале Data type int16
питается в блок Shift Arithmetic. В диалоговом окне Shift Arithmetic Block Parameters Bits to shift> параметр Direction устанавливается на Left
. Bits to shift> параметр Number установлен в 3
. Этот параметр соответствует значению 8, или возводящий в степень 2 из 3.
Откройте диалоговое окно Model Configuration Parameters и выберите вкладку Code Style. Параметр Replace multiplications by powers of two with signed bitwise shifts включен по умолчанию.
Сгенерируйте код для модели.
В файле bitwise_multiplication.c
ступенчатая функция bitwise_multiplication
содержит этот код:
bitwise_multiplication_Y.Out1 = (int16_T)(bitwise_multiplication_U.In1 << 3);
Целое число со знаком, bitwise_multiplication_U.In1
, переключено три бита налево.
Откройте диалоговое окно Model Configuration Parameters и выберите вкладку Code Style.
Очистите параметр Replace multiplications by powers of two with signed bitwise shifts.
Сгенерируйте код для модели.
В файле bitwise_multiplication.c
ступенчатая функция bitwise_multiplication
содержит этот код:
bitwise_multiplication_Y.Out1 = (int16_T)(bitwise_multiplication_U.In1 * 8);
Целое число со знаком bitwise_multiplication_U.In1
умножается на 8
.
Для получения дополнительной информации о параметре Replace multiplications by powers of two with signed bitwise shifts смотрите умножение Замены степенями двойки с поразрядными сдвигами со знаком.
Этот пример показывает, как управлять, содержит ли сгенерированный код сдвиги вправо на целых числах со знаком. Сгенерированный код, который не содержит сдвиги вправо на целых числах со знаком сначала, бросает целые числа со знаком к беззнаковому целому, и затем сдвиги вправо беззнаковое целое.
Некоторые стандарты кодирования, такие как MISRA, не позволяют сдвиги вправо на целых числах со знаком, потому что различное оборудование может сохранить отрицательные целые числа по-другому. Для отрицательных целых чисел можно получить различные ответы в зависимости от оборудования. Если вы хотите увеличить свои возможности создания MISRA C совместимый код, не позволяйте сдвиги вправо на целых числах со знаком.
Чтобы сгенерировать код со сдвигами вправо на целых числах со знаком, создайте следующую модель. В этой модели сигнале Data type int16
питается в блок Shift Arithmetic. В диалоговом окне Shift Arithmetic Block Parameters Bits to shift> параметр Direction устанавливается на Right
. Bits to shift> параметр Number установлен в 3
.
Откройте диалоговое окно Model Configuration Parameters и выберите вкладку Code Style. Параметр Allow right shifts on signed integers включен по умолчанию.
Сгенерируйте код для модели.
В файле rightshift.c
функция rightshift_step
содержит этот код:
rightshift_Y.Out1 = (int16_T)(rightshift_U.In1 >> 3);
Целое число со знаком rightshift_U.In1
переключено три бита направо.
Откройте диалоговое окно Model Configuration Parameters и выберите вкладку Code Style. Очистите параметр Allow right shifts on signed integers.
Сгенерируйте код для модели.
В файле rightshift.c
функция rightshift_step
содержит этот код:
rightshift_Y.Out1 = (int16_T)asr_s32(rightshift_U.In1, 3U);
Когда вы очищаете параметр Allow right shifts on signed integers, сгенерированный код содержит вызов функции вместо сдвига вправо на целом числе со знаком. Функциональный asr_s32
содержит этот код:
int32_T asr_s32(int32_T u, uint32_T n) { int32_T y; if (u >= 0) { y = (int32_T)((uint32_T)u >> n); } else { y = -(int32_T)((uint32_T)-(u + 1) >> n) - 1; } return y; }
Функция asr_s32
бросает целое число со знаком к беззнаковому целому, и затем сдвиги вправо беззнаковое целое.
Для получения дополнительной информации о параметре Allow right shifts on signed integers смотрите, Позволяют сдвиги вправо на целых числах со знаком.
Для добавления отступа кода можно установить следующие параметры:
Indent style управляет размещением фигурных скобок в сгенерированном коде.
Indent size управляет количеством символов на уровень отступа в сгенерированном коде (2–8 символов).
Можно установить Indent style на стиль Allman
или K&R
.
K&R поддерживает Кернигана и Ричи. Каждая функция имеет открытие и закрывающую фигурную скобку на ее собственной строке на том же уровне добавления отступа как функциональный заголовок. Код в функции располагается с отступом согласно Indent size.
Для блоков в функции вводные фигурные скобки находятся на той же строке как оператор управления. Закрывающие фигурные скобки находятся на новой строке на том же уровне добавления отступа как оператор управления. Код в блоке располагается с отступом согласно Indent size.
Например, вот сгенерированный код с набором Indent style к K&R
с Indent size 2
:
void rt_OneStep(void) { static boolean_T OverrunFlag = 0; if (OverrunFlag) { rtmSetErrorStatus(rtwdemo_counter_M, "Overrun"); return; } OverrunFlag = TRUE; rtwdemo_counter_step(); OverrunFlag = FALSE; }
Каждая функция имеет открытие и закрывающую фигурную скобку на ее собственной строке на том же уровне добавления отступа как функциональный заголовок. Код в функции располагается с отступом согласно Indent size.
Для блоков в функции открытие и закрывающие фигурные скобки для проверяют утверждения, находятся на новой строке на том же уровне добавления отступа как оператор управления. Это - основное отличие между стилями Allman
и K&R
. Код в блоке располагается с отступом согласно Indent size.
Например, вот сгенерированный код с набором Indent style к Allman
с Indent size 4
:
void rt_OneStep(void) { static boolean_T OverrunFlag = 0; if (OverrunFlag) { rtmSetErrorStatus(rtwdemo_counter_M, "Overrun"); return; } OverrunFlag = TRUE; rtwdemo_counter_step(); OverrunFlag = FALSE; }
Можно выбрать, как генератор кода задает броски типа данных в сгенерированном коде. В диалоговом окне Configuration Parameters выберите Code Generation> Code Style. От Casting modes выпадающий список три опции параметра управляют, как генератор кода бросает типы данных.
Nominal
дает генератору кода команду генерировать код, который имеет минимальный кастинг типа данных. Когда вы не имеете требований информации о специальном типе данных, выбираете Nominal
.
Standards Compliant
дает генератору кода команду бросать типы данных, чтобы соответствовать стандартам MISRA®, когда это генерирует код. Кастинг типа данных MISRA устраняет общие стандартные нарушения MISRA, включая адресную арифметику и присвоение. Это уменьшает 10.1, 10.2, 10.3, и 10,4 нарушений.
Для получения дополнительной информации см. MISRA C Инструкции.
Explicit
дает генератору кода команду бросать значения типа данных явным образом, когда это генерирует код. Вы видите, как значение хранится, который говорит вам, сколько пространства памяти код использует для переменной. Тип данных сообщает вам, сколько точности возможно в вычислениях, включающих переменную.
Откройте модель rtwdemo_rtwecintro
в качестве примера.
Когда вы выбираете режим кастинга Nominal
, генератор кода не создает броски типа данных для переменных в сгенерированном коде.
На Code Generation> панель Code Style, от Casting modes выпадающий список, выбирают Nominal
.
На Code Generation> панель Report, выберите Create code generation report.
На панели Code Generation выберите Generate code only.
Нажмите Apply.
В окне модели нажмите Ctrl+B, чтобы сгенерировать код.
В Генерации кода сообщают о левой панели, нажимают rtwdemo_rtwecintro.c
, чтобы видеть код.
/* Model step function */ void rtwdemo_rtwecintro_step(void) { boolean_T rtb_equal_to_count; /* Sum: 'XRootX/Sum' incorporates: * Constant: 'XRootX/INC' * UnitDelay: 'XRootX/X' */ rtDWork.X++; /* RelationalOperator: 'XRootX/RelOpt' incorporates: * Constant: 'XRootX/LIMIT' */ rtb_equal_to_count = (rtDWork.X != 16); /* Outputs for Triggered SubSystem: 'XRootX/Amplifier' incorporates: * TriggerPort: 'XS1X/Trigger' */ if (rtb_equal_to_count && (rtPrevZCSigState.Amplifier_Trig_ZCE != POS_ZCSIG)) { /* Outport: 'XRootX/Output' incorporates: * Gain: 'XS1X/Gain' * Inport: 'XRootX/Input' */ rtY.Output = rtU.Input << 1; } rtPrevZCSigState.Amplifier_Trig_ZCE = (uint8_T)(rtb_equal_to_count ? (int32_T) POS_ZCSIG : (int32_T)ZERO_ZCSIG); /* End of Outputs for SubSystem: 'XRootX/Amplifier' */ /* Switch: 'XRootX/Switch' */ if (!rtb_equal_to_count) { /* Update for UnitDelay: 'XRootX/X' incorporates: * Constant: 'XRootX/RESET' */ rtDWork.X = 0U; } /* End of Switch: 'XRootX/Switch' */ }
Когда вы выбираете режим кастинга Standards Compliant
, генератор кода создает стандарты MISRA совместимые броски типа данных для переменных в сгенерированном коде.
На панели Code Style, от Casting modes выпадающий список, выбирают Standards Compliant
.
На панели Code Generation нажмите Apply.
В окне модели нажмите Ctrl+B, чтобы сгенерировать код.
В Генерации кода сообщают о левой панели, нажимают rtwdemo_rtwecintro.c
, чтобы видеть код.
void rtwdemo_rtwecintro_step(void) { boolean_T rtb_equal_to_count; /* Sum: '<Root>/Sum' incorporates: * Constant: '<Root>/INC' * UnitDelay: '<Root>/X' */ rtDWork.X++; /* RelationalOperator: '<Root>/RelOpt' incorporates: * Constant: '<Root>/LIMIT' */ rtb_equal_to_count = (boolean_T)(int32_T)((int32_T)rtDWork.X != (int32_T)16); /* Outputs for Triggered SubSystem: '<Root>/Amplifier' incorporates: * TriggerPort: '<S1>/Trigger' */ if (((int32_T)rtb_equal_to_count) && (rtPrevZCSigState.Amplifier_Trig_ZCE != POS_ZCSIG)) { /* Outport: '<Root>/Output' incorporates: * Gain: '<S1>/Gain' * Inport: '<Root>/Input' */ rtY.Output = (int32_T)(uint32_T)((uint32_T)rtU.Input << (uint32_T)(int8_T)1); } rtPrevZCSigState.Amplifier_Trig_ZCE = (uint8_T)(int32_T)(rtb_equal_to_count ? (int32_T)(uint8_T)POS_ZCSIG : (int32_T)(uint8_T)ZERO_ZCSIG); /* End of Outputs for SubSystem: '<Root>/Amplifier' */ /* Switch: '<Root>/Switch' */ if (!rtb_equal_to_count) { /* Update for UnitDelay: '<Root>/X' incorporates: * Constant: '<Root>/RESET' */ rtDWork.X = 0U; } /* End of Switch: '<Root>/Switch' */ }
Когда вы выбираете режим кастинга Explicit
, генератор кода создает явные броски типа данных для переменных в сгенерированном коде.
На панели Code Style, от Casting modes выпадающий список, выбирают Explicit
.
На панели Code Generation нажмите Apply.
В окне модели нажмите Ctrl+B, чтобы сгенерировать код.
В Генерации кода сообщают о левой панели, нажимают rtwdemo_rtwecintro.c
, чтобы видеть код.
/* Model step function */ void rtwdemo_rtwecintro_step(void) { boolean_T rtb_equal_to_count; /* Sum: '<Root>/Sum' incorporates: * Constant: '<Root>/INC' * UnitDelay: '<Root>/X' */ rtDWork.X = (uint8_T)(1U + (uint32_T)(int32_T)rtDWork.X); /* RelationalOperator: '<Root>/RelOpt' incorporates: * Constant: '<Root>/LIMIT' */ rtb_equal_to_count = (boolean_T)((int32_T)rtDWork.X != 16); /* Outputs for Triggered SubSystem: '<Root>/Amplifier' incorporates: * TriggerPort: '<S1>/Trigger' */ if (((int32_T)rtb_equal_to_count) && ((int32_T)((int32_T) rtPrevZCSigState.Amplifier_Trig_ZCE != (int32_T)POS_ZCSIG))) { /* Outport: '<Root>/Output' incorporates: * Gain: '<S1>/Gain' * Inport: '<Root>/Input' */ rtY.Output = rtU.Input << 1; } rtPrevZCSigState.Amplifier_Trig_ZCE = (uint8_T)(rtb_equal_to_count ? (int32_T) POS_ZCSIG : (int32_T)ZERO_ZCSIG); /* End of Outputs for SubSystem: '<Root>/Amplifier' */ /* Switch: '<Root>/Switch' */ if (!(int32_T)rtb_equal_to_count) { /* Update for UnitDelay: '<Root>/X' incorporates: * Constant: '<Root>/RESET' */ rtDWork.X = 0U; } /* End of Switch: '<Root>/Switch' */ }
В сгенерированном коде символ новой строки отличается согласно операционной системе, на которой сгенерирован код. Можно настроить символ новой строки независимо от операционной системы. Установите стиль символа новой строки при помощи параметра Newline style.
Можно установить Newline style на любую из этих опций:
Эта опция выбрана по умолчанию. Это генерирует символ новой строки на основе операционной системы, на которой сгенерирован код. Например, если код сгенерирован на машине Windows®, символом новой строки, вставленным по умолчанию, является "\r\n"
. Если код сгенерирован на машине UNIX®, символом новой строки, вставленным по умолчанию, является "\n"
.
Эта опция позволяет вам добавить символ Перевода строки (LF). "\n"
вставляется как символ новой строки.
Эта опция позволяет вам добавить символ Возврата каретки + перевода строки (CR+LF). "\r\n"
вставляется как символ новой строки.
Можно настроить максимальную ширину линии для переноса сгенерированного кода. Чтобы задать любое целое число в области значений 50-1000
, используйте параметр Maximum line width. Значением по умолчанию является 80
.
Если комментарии превышают максимальную заданную ширину линии, комментарии хвоста сгенерированы на новой строке с выравниванием по правому краю. Другие типы комментариев не перенесены:
Комментарии хвоста #define
Комментарии блока Simulink
Комментарии объекта Stateflow
Комментарии баннера
Например, вот сгенерированный код, который перенесен с помощью значения Maximum line width по умолчанию 80
:
/* Definition for custom storage class: Default */ real_T const_val[4] = { 1.0, 2.0, 3.0, 4.0 } ; /* This parameter defines the vector of output index values */
Вот тот же код, перенесенный с набором Maximum line width к 120
:
/* Definition for custom storage class: Default */ real_T const_val[4] = { 1.0, 2.0, 3.0, 4.0 } ;/* This parameter defines the vector of output index values */