Управляйте выражениями приведения в сгенерированном коде

Можно выбрать, как генератор кода задает типы данных в сгенерированном коде. В диалоговом окне Параметров конфигурации выберите Code Generation > Code Style. Из выпадающего списка Casting modes три опции параметра управляют тем, как генератор кода выводит типы данных.

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

  • Standards Compliant инструктирует генератор кода привести типы данных в соответствие с MISRA® стандартов, когда он генерирует код. Приведение типа данных MISRA устраняет общие стандартные нарушения MISRA, включая арифметику адреса и назначение. Он уменьшает 10,1, 10,2, 10,3 и 10,4 нарушения.

    Для получения дополнительной информации смотрите MISRA C Guidelines.

  • Explicit инструктирует генератор кода приводить значения типов данных явным образом, когда он генерирует код. Вы можете увидеть, как значение хранится, что говорит вам, сколько пространства памяти код использует для переменной. Тип данных информирует вас о том, какая точность возможна при вычислениях с участием переменной.

Откройте пример модели rtwdemo_rtwecintro.

Включите номинальный режим литья и сгенерируйте код

Когда вы выбираете Nominal режим приведения, генератор кода не создает приведения типа данных для переменных в сгенерированном коде.

  1. На панели Code Generation > Code Style в раскрывающемся списке Casting modes выберите Nominal.

  2. На панели Code Generation > Report выберите Create code generation report.

  3. На панели Code Generation выберите Generate code only.

  4. Нажмите Apply.

  5. В окне модели нажмите Ctrl+B, чтобы сгенерировать код.

  6. На левой панели отчета Генерация кода нажмите 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 типы данных для переменных в сгенерированном коде.

  1. На панели Code Style в раскрывающемся списке Casting modes выберите Standards Compliant.

  2. На панели Code Generation нажмите Apply.

  3. В окне модели нажмите Ctrl+B, чтобы сгенерировать код.

  4. На левой панели отчета Генерация кода нажмите 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 режим литья, генератор кода создает явные типы данных для переменных в сгенерированном коде.

  1. На панели Code Style в раскрывающемся списке Casting modes выберите Explicit.

  2. На панели Code Generation нажмите Apply.

  3. В окне модели нажмите Ctrl+B, чтобы сгенерировать код.

  4. На левой панели отчета Генерация кода нажмите 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' */
}

Похожие темы