В этом примере показано, как управлять, содержит ли сгенерированный код сдвиги вправо на целых числах со знаком. Сгенерированный код, который не содержит сдвиги вправо на целых числах со знаком сначала, бросает целые числа со знаком к беззнаковому целому, и затем сдвиги вправо беззнаковое целое.
Некоторые стандарты кодирования, такие как MISRA, не позволяют сдвиги вправо на целых числах со знаком, потому что различное оборудование может сохранить отрицательные целые числа по-другому. Для отрицательных целых чисел можно получить различные ответы в зависимости от оборудования. Если вы хотите увеличить свои возможности создания MISRA C совместимый код, не позволяйте сдвиги вправо на целых числах со знаком.
Чтобы сгенерировать код со сдвигами вправо на целых числах со знаком, создайте эту модель. Сигнал Data type
int16
подача в блок Shift Arithmetic. В диалоговом окне Shift Arithmetic Block Parameters Bits to shift> параметр Direction устанавливается на Right
. Bits to shift> параметр Number установлен в 3
.
Откройте диалоговое окно Model Configuration Parameters и выберите вкладку Code Style. Параметр Allow right shifts on signed integers включен по умолчанию.
Сгенерируйте код для модели.
В rightshift.c
файл, rightshift_step
функция содержит этот код:
rightshift_Y.Out1 = (int16_T)(rightshift_U.In1 >> 3);
Целое число со знаком rightshift_U.In1
переключен три бита направо.
Откройте диалоговое окно Model Configuration Parameters и выберите вкладку Code Style. Очистите параметр Allow right shifts on signed integers.
Сгенерируйте код для модели.
В rightshift.c
файл, rightshift_step
функция содержит этот код:
rightshift_Y.Out1 = (int16_T)asr_s32(rightshift_U.In1, 3U);
Когда вы очищаете параметр Allow right shifts on signed integers, сгенерированный код содержит вызов функции вместо сдвига вправо на целом числе со знаком. Функциональный asr_s32
содержит этот код:
int32_T asr_s32(int32_T u, uint32_T n) { int32_T y; if (u >= 0) { y = (int32_T)((uint32_T)u >> n); } else { y = -(int32_T)((uint32_T)-(u + 1) >> n) - 1; } return y; }
asr_s32
функционируйте бросает целое число со знаком к беззнаковому целому, и затем сдвиги вправо беззнаковое целое.