在8位机中,对于部分乘除法是转换成移位操作来进行的,这样速度会快点。但对于32位的数据来说,移位操作依然比较慢。不过对于有MDU的STC8H和STC32系列芯片就不同了。可以使用MDU来计算移位或是使用乘除法替代移位操作,速度非常快啊,谁用谁知道。
使用STC32F12K54芯片测试,频率使用24Mhz。
使用移位操作计算CRC32操作,2K数据大概160ms。
- uint32_t crc32b(unsigned char code * addr, uint16_t l)
- {
- uint16_t i, j;
- uint32_t crc, msb;
- uint32_t message;
- crc = 0xFFFFFFFF;
- for(i = 0; i < l; i++)
- {
- // xor next byte to upper bits of crc
- message = addr[i];
- crc ^= ((message)<<24);
- for (j = 0; j < 8; j++)
- { // Do eight times.
- msb = crc>>31;
- crc <<= 1;
- crc ^= (0 - msb) & 0x04C11DB7;
- }
- }
- return crc;
- }
复制代码
使用STC32_MDU32_LARGE_V1.1库后,
- uint32_t crc32b(unsigned char code * addr, uint16_t l)
- {
- uint16_t i, j;
- uint32_t crc, msb;
- uint32_t message;
- crc = 0xFFFFFFFF;
- for(i = 0; i < l; i++)
- {
- // xor next byte to upper bits of crc
- message = addr[i];
- crc ^= (message * 0x01000000);
- for (j = 0; j < 8; j++)
- { // Do eight times.
- msb = (crc / 0x80000000);
- crc = crc * 2;
- crc ^= (0 - msb) & 0x04C11DB7;
- }
- }
- return crc;
- }
复制代码
同样的操作只要40ms,只有之前的1/4啊。另外不适用MDU,依然使用乘除法的话则需要288ms。
所以对于32位的移位操作,在使用MDU的情况下,改成乘除法也是不错的选择。 |