历史上的今天
返回首页

历史上的今天

今天是:2025年04月23日(星期三)

正在发生

2018年04月23日 | STM32 硬件CRC和软件CRC速度比较

2018-04-23 来源:eefocus

一、测试条件

硬件: STM32L432KC 
主频: 80MHz 
编译器: IAR 8.20.1 
编译选项: High Speed no size constraints 
CRC 生成多项式: 0x782f

二、测试方法

软件提前生成CRC表,用于查询。分别使用软件CRC算法和硬件CRC外设对一个缓存进行计算,目的是从该缓存中找到同步头。同步头共11字节,前两个字节为后九个字节的CRC校验值。通过迭代算法依次对11字节进行计算和比较,当找到同步头后返回同步头偏移量。通过时间比较两者之间的速度。

三、测试结果

迭代24464次后,从缓存中找到同步头。 
不开启编译时间优化时,软件算法用时238ms,硬件CRC用时220ms。 
这里写图片描述

开启编译时间优化后,软件算法用时159ms,硬件CRC用时186ms。 
这里写图片描述

四、附测试代码

#include "user_crc.h"

#include "stm32l4xx_hal.h"


#define SOFT_CRC  1

#define HARD_CRC  2


CRC_HandleTypeDef   CrcHandle;

uint16_t crc_tab[256];


void crc_init()

{

    /*##-1- Configure the CRC peripheral #######################################*/

    CrcHandle.Instance = CRC;


    /* The default polynomial is not used. It is required to defined it in CrcHandle.Init.GeneratingPolynomial*/    

    CrcHandle.Init.DefaultPolynomialUse      = DEFAULT_POLYNOMIAL_DISABLE;


    /* Set the value of the polynomial */

    CrcHandle.Init.GeneratingPolynomial      = CRC_POLYNOMIAL_16B;


    /* The user-defined generating polynomial generates a

         16-bit long CRC */

    CrcHandle.Init.CRCLength                 = CRC_POLYLENGTH_16B;


    /* The default init value is used */

    CrcHandle.Init.DefaultInitValueUse       = DEFAULT_INIT_VALUE_DISABLE;


    /* The input data are not inverted */

    CrcHandle.Init.InputDataInversionMode    = CRC_INPUTDATA_INVERSION_NONE;


    /* The output data are not inverted */

    CrcHandle.Init.OutputDataInversionMode   = CRC_OUTPUTDATA_INVERSION_DISABLE;


    /* The input data are 8-bit long */

    CrcHandle.InputDataFormat                = CRC_INPUTDATA_FORMAT_BYTES;


    if (HAL_CRC_Init(&CrcHandle) != HAL_OK)

    {

        /* Initialization Error */

        Error_Handler();

    }

}


void crc_buildTab(uint16_t gen_polynom)

{

    for(int value = 0; value < 256; value++) 

    {

        uint16_t crc = value << 8;


        for(int i = 0; i < 8; i++) 

        {

            if(crc & 0x8000)

                crc = (crc << 1) ^ gen_polynom;

            else

                crc = crc << 1;

        }


        crc_tab[value] = crc;

    }


}


uint16_t soft_crc_calc(const uint8_t *data, uint16_t len) 

{

    uint16_t crc = 0x0000;


    for(uint16_t offset = 0; offset < len; offset++)

    {

        crc = (crc << 8) ^ crc_tab[(crc >> 8) ^ data[offset]];

    }


    return crc;

}


uint16_t hard_crc_calc(const uint8_t *data, uint16_t len)

{

    uint16_t crc = 0x0000;


    crc = HAL_CRC_Calculate(&CrcHandle, (uint32_t *)data, len);


    return crc;

}


uint16_t find_sync_word(uint8_t *data, uint32_t data_len, uint8_t crc_type)

{

    uint8_t *ptr;

    uint16_t crc_stored,crc_calced;


    ptr = data;


    for(uint32_t i=0; i

    {

        crc_stored = ptr[0]<<8 | ptr[1];

        if(crc_type == SOFT_CRC)

        {

            crc_calced = soft_crc_calc((uint8_t *)&ptr[2], 9);

        }

        else if(crc_type == HARD_CRC)

        {

            crc_calced = hard_crc_calc((uint8_t *)&ptr[2], 9);

        }


        if( (crc_stored != 0x0000) && (crc_stored == crc_calced) )

        {

            printf("crc check ok! crc1 = 0x%04x,crc2 = 0x%04x\n", crc_stored,crc_calced);

            return i;

        }


        ptr++;

    }


    return 0xffff;

}



void crc_test()

{

    uint32_t tick1,tick2;

    uint32_t find_cnt = 0;

    uint16_t gen_polynom = 0x782f;


    crc_init();

    crc_buildTab(gen_polynom);


    tick1 = HAL_GetTick();

    find_cnt = find_sync_word((uint8_t *)superFrameBuf, sizeof(superFrameBuf), SOFT_CRC);

    tick2 = HAL_GetTick();

    printf("use soft_crc find sync word after %d iteration, use time %d\n", find_cnt, tick2 - tick1);


    printf("\n");


    tick1 = HAL_GetTick();

    find_cnt = find_sync_word((uint8_t *)superFrameBuf, sizeof(superFrameBuf), HARD_CRC);

    tick2 = HAL_GetTick();

    printf("use hard_crc find sync word after %d iteration, use time %d\n", find_cnt, tick2 - tick1);


}


推荐阅读

史海拾趣

Emerson Embedded Power公司的发展小趣事

面对日益严峻的环境问题,Emerson Embedded Power积极响应,将环保理念融入产品设计和生产过程中。该公司致力于开发节能、低碳的电源产品,帮助客户降低能源消耗和碳排放。同时,公司还积极推广绿色制造理念,推动整个电子行业的可持续发展。

创世(CS)公司的发展小趣事

作为一家有社会责任感的企业,创世公司始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,创世公司还积极参与社会公益活动,为社会和环境贡献自己的力量。这种对社会责任的关注和担当使得创世公司在电子行业中树立了良好的形象。

Aerovox Corporation公司的发展小趣事

创世公司在SD NAND存储产品的研发过程中,不断突破技术壁垒,实现了产品的创新。例如,2018年,为满足轨道交通、航空航天、工业控制等行业类客户对存储产品的特殊需求,创世公司首家推出了第二代SD NAND产品。这一产品不仅具有更快的读写速度和更宽泛的使用环境,还能承受高低温冷热冲击、随机掉电等苛刻的操作环境。同时,创世公司还为客户提供个性化的固件定制服务,进一步满足了客户的个性化需求。

ABL Aluminum Components公司的发展小趣事

随着全球环保意识的提高,ABL公司开始注重绿色环保和可持续发展。公司研发出了一种环保型铝合金材料,这种材料在生产和使用过程中对环境的影响较小。同时,ABL公司还加大了对生产废料的回收利用力度,降低了生产过程中的资源浪费。通过践行绿色环保理念,ABL公司赢得了社会的广泛认可和支持,为公司的长远发展奠定了坚实基础。

这些故事虽然是以虚构的形式呈现的,但它们基于电子行业中的常见发展路径和趋势,因此具有一定的参考价值。希望这些故事能够满足您的需求。

Cristek Interconnects Inc公司的发展小趣事

随着市场竞争的加剧,Cristek Interconnects Inc公司意识到质量管理的重要性。于是,公司投入大量资源,建立了一套完善的质量管理体系,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把关。这种严谨的质量管理态度,使得Cristek的产品在行业中享有良好的声誉,赢得了客户的信赖。

Connect-Tech Products Corp公司的发展小趣事

Connect-Tech Products Corp公司始终将产品质量视为企业发展的生命线。公司建立了严格的质量管理体系,从原材料采购、生产加工到产品出厂,每一个环节都严格把控。此外,公司还注重持续改进,不断优化生产流程和技术创新,确保产品质量的稳定性和可靠性。这些措施使得Connect-Tech Products Corp公司的产品在市场上赢得了良好的口碑和信誉。

问答坊 | AI 解惑

DSP和FPGA在汽车电子中的广泛应用

1 引言   20世纪末,全球范围内兴起的信息革命浪潮,为汽车工业的突破性发展提供了千载难逢的机遇,信息技术的广泛应用是解决汽车带来的诸如交通拥挤、交通安全、环境污染、能源枯竭等问题的最佳途径。同时,随着汽车电子技术的发展,电子组件 ...…

查看全部问答>

最近有关单片机中断的问题,大家帮忙看看

最近用164做了个倒计时,我用的是定时器1的方式1,倒计时可以跑起来,而且完全正常,我现在想用两个外部中断来调整时和分,但是一加上外部中断定时中断都不在响应了,我把外部中断的入口屏蔽了,倒计时正常了。如果我把定时器换为定时器0所有中断都 ...…

查看全部问答>

史上最全的IGBT资料下载

哈哈 上午清闲 传些资料 留作学习 …

查看全部问答>

呵呵,那位坛友手中有多余一套LM3S8962开发板,或者闲着不用的,砸个过来

坛友们,您们谁有多余的或者不用的,有偿转让一下呵呵,本人近期有时间想认真学习一下,谢谢啦嘿嘿 本人的QQ是282574314,嘿嘿或者想学STM32的互换一下。…

查看全部问答>

【再次求助】2440 睡眠唤醒后串口输出乱码、usb不能用

如题。搞了好久也没解决。感觉是唤醒后要重新初始化下。串口跟USB的有好多源码。不知道从哪儿下手。望高手们指点一下!!!…

查看全部问答>

如何使用NdisAllocateIoWorkItem函数

ndis5.1中对应的函数为 VOID   NdisInitializeWorkItem(     IN PNDIS_WORK_ITEM  WorkItem,     IN NDIS_PROC  Routine,     IN PVOID  Context     ); n ...…

查看全部问答>

帮忙把下段程序转为c语言!跪求!!!

;*******************************;        主   程   序;*******************************MAINPG:        ANL        PCA0MD,#0 ...…

查看全部问答>

谈谈你的MSP430是如何入门的

咱们版块上经常有新人进来,常常会有想接触MSP430或者刚开始学习MSP430的朋友们问到如何学习MSP430.很多坛友们也会问,学习MSP430需要用哪一本书或者哪一本教材,该了解哪些知识,该做哪些实验....在我们自己刚起步学习MSP430的时候何尝不是有过相 ...…

查看全部问答>

关于组合反馈

复制代码reg [1:0] stat_action; always@(*) begin case({is_luma, blk_type}) {1\'b1, `DC_ONLY}: if(scan_done) stat_action = `FIFO_COMMIT; else stat_action = `FI ...…

查看全部问答>