exponenta event banner

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

Можно выбрать способ, с помощью которого генератор кода определяет типы данных в создаваемом коде. В диалоговом окне «Параметры конфигурации» выберите «Создание кода» > «Стиль кода». В раскрывающемся списке Режимы литья (Casting modes) три параметра управляют тем, как генератор кода создает типы данных.

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

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

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

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

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

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

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

  1. На панели «Создание кода» > «Стиль кода» в раскрывающемся списке «Режимы литья» выберите Nominal.

  2. На панели Создание кода > Отчет выберите Создать отчет о создании кода.

  3. На панели Создание кода (Code Generation) выберите Только генерировать код (Generate code only).

  4. Нажмите кнопку «Применить».

  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. На панели «Стиль кода» в раскрывающемся списке «Режимы литья» выберите Standards Compliant.

  2. На панели Создание кода нажмите кнопку Применить.

  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. На панели «Стиль кода» в раскрывающемся списке «Режимы литья» выберите Explicit.

  2. На панели Создание кода нажмите кнопку Применить.

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

Связанные темы