ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
22 июля
1067240 Топик полностью
VladislavS. (06.01.2021 10:27, просмотров: 352) ответил evgeniy1294 на 1. Есть такое, да. На cortex-m0 можно словить HardFault, так как он не умеет невыровненный доступ. На этот случай, а также для быстрой обработки небольших пакетов, написана отдельная функция:
Словить hardfault по невыровненному доступу можно даже на Cortex-M4. Так что, лучше в принципе не делать таких опасных вещей. 

Если калькулятор CRC работает со словами, то и кормите его словами. Просто "хвост" надо отдельно обработать.


Вот так голову

uint8_t *pu8 = data;
for (uint32_t words2write = size/4; words2write--; pu8 += 4)
  CRC_DATA = *pu8 + (*(pu8+1)<<8) + (*(pu8+2)<<16) + (*(pu8+3)<<24);

Последовательность байт согласно индейцам расставить. Компилятор такой доступ оптимизирует до одного безопасного 32-битного чтения, если ядро поддерживает невыровненный доступ.


Вот так хвост

switch (size%4)
{
  case 1:
      CRC_DATA = *pu8;
    break;
  case 2:
      CRC_DATA = *pu8 + (*(pu8+1)<<8);
    break;
  case 3:
      CRC_DATA = *pu8 + (*(pu8+1)<<8) + (*(pu8+2)<<16);
    break;
  default:
    break;
}

Опять таки, если size будет реально константым, то компилятор сам без if constexpr всё лишнее почикает. Зато будет работать и с неконстантным размером данных.