Пример #1
0
float64
int32_to_float64 (int32 a)
{
  flag zSign;
  uint32 absA;
  int8 shiftCount;
  bits64 zSig;

  if (a == 0)
    return 0;
  zSign = (a < 0);
  absA = zSign ? -a : a;
  shiftCount = countLeadingZeros32 (absA) + 21;
  zSig = absA;
  return packFloat64 (zSign, 0x432 - shiftCount, zSig << shiftCount);

}
Пример #2
0
Файл: can.c Проект: stxent/halm
/*----------------------------------------------------------------------------*/
static void sendMessage(struct Can *interface,
    const struct CanMessage *message, uint32_t *status)
{
  assert(message->length <= 8);

  uint32_t command = interface->mode != MODE_LOOPBACK ? CMR_TR : CMR_SRR;
  uint32_t information = TFI_DLC(message->length);

  if (message->flags & CAN_EXT_ID)
  {
    assert(message->id < (1UL << 29));
    information |= TFI_FF;
  }
  else
  {
    assert(message->id < (1UL << 11));
  }

  LPC_CAN_Type * const reg = interface->base.reg;
  const unsigned int position = countLeadingZeros32(reverseBits32(*status));
  const unsigned int index = SR_TBS_VALUE_TO_CHANNEL(position);

  if (!(message->flags & CAN_RTR))
  {
    uint32_t data[2];
    memcpy(data, message->data, sizeof(data));

    reg->TX[index].TDA = data[0];
    reg->TX[index].TDB = data[1];
  }
  else
  {
    information |= TFI_RTR;
  }

  reg->TX[index].TFI = information | TFI_PRIO(interface->sequence);
  reg->TX[index].TID = message->id;

  reg->CMR = command | CMR_STB(index);

  *status &= ~BIT(position);
  ++interface->sequence;
}