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

Можно выбрать, как генератор кода задает броски типа данных в сгенерированном коде. В диалоговом окне 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 бросая режим, генератор кода не создает броски типа данных для переменных в сгенерированном коде.

  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' */
}

Похожие темы