Цитата(Сергей Борщ @ Sep 28 2018, 16:05)

CAN_RX_Master() покажите. Предполагаю, что оптимизатор видит ее тело, находит в нем только один возможный результат и выкидывает все условие.
CODE
uint32_t CAN_RX_Master(void){
uint32_t mot_num;
uint32_t opcode;
uint32_t pos;
uint32_t ack = 0;
if (can_params.message_received)
{
can_params.message_received = 0;
mot_num = (RxMessage.ExtId & 0xFF) - BASE_MOTOR_ID;
if (mot_num > MAX_MOTORS)
return 0;
opcode = (RxMessage.ExtId >> 8) & 0xFF;
switch (opcode)
{
case CAN_COM_GET_ALL :
motor_rt_params[mot_num].current = ((RxMessage.Data[1]<<8) | RxMessage.Data[0]);
motor_rt_params[mot_num].speed = ((RxMessage.Data[3]<<8) | RxMessage.Data[2]);
motor_rt_params[mot_num].position = ((RxMessage.Data[5]<<8) | RxMessage.Data[4]);
ack = 1;
break;
case CAN_COM_I_AM :
motor_rt_params[mot_num].ena = 1;
motor_rt_params[mot_num].mot_id = BASE_MOTOR_ID + mot_num;
ack = 1;
break;
case CAN_COM_IGET :
motor_rt_params[mot_num].current = ( RxMessage.Data[1]<<8) | RxMessage.Data[0]);
pos = CAN_IGET_POS;
ack = 1;
break;
case CAN_COM_PGET :
motor_rt_params[mot_num].position = (( RxMessage.Data[1]<<8) | RxMessage.Data[0]);
pos = CAN_PGET_POS;
ack = 1;
break;
case CAN_COM_VGET :
motor_rt_params[mot_num].speed = (( RxMessage.Data[1]<<8) | RxMessage.Data[0]);
pos = CAN_VGET_POS;
ack = 1;
break;
}
if (ack)
motor_rt_params[mot_num].rx_flags |= (1<<pos);
return ack;
}