Можно выбрать способ, с помощью которого генератор кода определяет типы данных в создаваемом коде. В диалоговом окне «Параметры конфигурации» выберите «Создание кода» > «Стиль кода». В раскрывающемся списке Режимы литья (Casting modes) три параметра управляют тем, как генератор кода создает типы данных.
Nominal дает команду генератору кода сформировать код, который имеет минимальный тип данных. Если нет специальных требований к информации о типе данных, выберите Nominal.
Standards Compliant предписывает генератору кода приводить типы данных в соответствие со стандартами MISRA ® при создании кода. Кастинг типа данных MISRA устраняет распространенные нарушения стандарта MISRA, включая арифметику адреса и назначение. Это позволяет сократить 10,1, 10,2, 10,3 и 10,4 нарушения .
Для получения дополнительной информации см. Руководство MISRA C.
Explicit предписывает генератору кода явно приводить значения типов данных при создании кода. Можно увидеть, как хранится значение, указывающее, какой объем памяти используется кодом для переменной. Тип данных сообщает о возможной точности вычислений с использованием переменной.
Открыть пример модели rtwdemo_rtwecintro.

При выборе Nominal в режиме литья генератор кода не создает слепки типа данных для переменных в сгенерированном коде.
На панели «Создание кода» > «Стиль кода» в раскрывающемся списке «Режимы литья» выберите Nominal.
На панели Создание кода > Отчет выберите Создать отчет о создании кода.
На панели Создание кода (Code Generation) выберите Только генерировать код (Generate code only).
Нажмите кнопку «Применить».
В окне модели нажмите клавиши 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 слепки данных для переменных в сгенерированном коде.
На панели «Стиль кода» в раскрывающемся списке «Режимы литья» выберите Standards Compliant.
На панели Создание кода нажмите кнопку Применить.
В окне модели нажмите клавиши 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 в режиме литья генератор кода создает явные слепки типа данных для переменных в сгенерированном коде.
На панели «Стиль кода» в раскрывающемся списке «Режимы литья» выберите Explicit.
На панели Создание кода нажмите кнопку Применить.
В окне модели нажмите клавиши 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' */
}