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

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

Похожие темы