dql2016 发表于 2024-10-10 21:28

【STM32H7S78-DK】测评+DSP计算速度评估

本帖最后由 dql2016 于 2024-10-10 22:33 编辑

<p>在前面的帖子中,顺利的添加了DSP库进行数学计算,本帖添加傻孩子大佬的开源性能评估库<strong>perf_counter(<a href="https://github.com/GorgonMeducer/perf_counter" target="_blank">https://github.com/GorgonMeducer/perf_counter</a>)进行计算性能的测试,通过计算耗时来衡量DSP性能。</strong></p>

<p>&nbsp;</p>

<p><strong>perf_counter是</strong>一个基于C语言的模块,提供以下功能:</p>

<ul>
        <li>
        <p>精确测量系统性能</p>
        </li>
        <li>
        <p>精确测量函数执行时间</p>
        </li>
        <li>
        <p>精确测量中断响应延迟</p>
        </li>
        <li>
        <p>提供精确到us级的阻塞或非阻塞的延时服务</p>
        </li>
        <li>
        <p>改善伪随机数的随机数特性</p>
        </li>
        <li>
        <p>提供系统时间戳</p>
        </li>
        <li>
        <p>&hellip;&hellip;</p>
        </li>
</ul>

<p><strong>它使用了SysTick却不会占用SysTick,支持所有Cortex-M处理器裸机环境和RTOS环境、KEIL、IAR、GCC等编译器平台都支持。下载源码包后得到下面文件:</strong></p>

<div style="text-align: center;"></div>

<p>对于裸机,只需将图中的4个文件加入到工程中即可:</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>首先在mian.c加入对头文件的引用:</p>

<pre data-index="0" name="code">
<code class="language-cpp">#include "perf_counter.h"</code></pre>

<p>然后对&nbsp;<em><strong>perf_counter</strong></em>&nbsp;库进行初始化:</p>

<pre>
<code class="language-cpp"> init_cycle_counter(false);</code></pre>

<p>或者</p>

<pre>
<code class="language-cpp">init_cycle_counter(true);</code></pre>

<p>如果用户并没有自己初始化&nbsp;<em>SysTick</em>,传递&nbsp;<em>false</em>&nbsp;给函数&nbsp;<em>init_cycle_counter()</em>&nbsp;。</p>

<p>如果用户自己初始化了&nbsp;<em>SysTick</em>,传递<em>true</em>&nbsp;给函数&nbsp;<em>init_cycle_counter()</em>&nbsp;。</p>

<p>本项目生产的工程是初始化了<em>SysTick,所以入口参数是true</em>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>在systick中断中调用perfc_port_insert_to_system_timer_insert_ovf_handler():</p>

<div style="text-align: center;"></div>

<p>将前面帖子中计算RMS的打印屏蔽掉</p>

<pre>
<code class="language-cpp">//DSP库求均方根测试
static void DSP_RMS(void)
{
    float32_t pSrc = {0.7060f, 0.0318f, 0.2769f, 0.0462f, 0.0971f, 0.8235f, 0.6948f, 0.3171f,0.9502f, 0.0344f};
    float32_t pResult;
    uint32_t pIndex;

    q31_t pSrc1;
    q31_t pResult1;

    q15_t pSrc2;
    q15_t pResult2;

    //printf("******** stm32h7s78-dk eeworld dsp test ***********\r\n");

    arm_rms_f32(pSrc, 10, &amp;pResult);
    //printf("arm_rms_f32 : pResult = %f\r\n", pResult);

    /*****************************************************************/
    for(pIndex = 0; pIndex &lt; 10; pIndex++)
    {
         pSrc1 = rand();
    }
    arm_rms_q31(pSrc1, 10, &amp;pResult1);
    //printf("arm_rms_q31 : pResult = %d\r\n", pResult1);

    /*****************************************************************/
    for(pIndex = 0; pIndex &lt; 10; pIndex++)
    {
         pSrc2 = rand()%32768;
    }
    arm_rms_q15(pSrc2, 10, &amp;pResult2);
    //printf("arm_rms_q15 : pResult = %d\r\n", pResult2);
    //printf("******************************************************************\r\n");
}</code></pre>

<p>测量调用该函数耗时:</p>

<pre>
<code class="language-cpp">        start_cycle_counter();

        DSP_RMS();

        int64_t lCycleUsed = stop_cycle_counter();
        printf("cycle counter = %lld\n",lCycleUsed);</code></pre>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>printf如果需要打印64位数据int64、uint64类型,需要开启完整标准输出库的支持:</p>

<div style="text-align: center;"></div>

<p>直接编译下载程序,输出计算打印结果是0,在STM32官方论坛中找到了答案:</p>

<p><a href="https://community.st.com/t5/stm32cubeide-mcus/wrong-result-when-printing-a-int64-t-value-using-stm32cubeide/td-p/148913" target="_blank">https://community.st.com/t5/stm32cubeide-mcus/wrong-result-when-printing-a-int64-t-value-using-stm32cubeide/td-p/148913</a></p>

<p>&nbsp;</p>

<p><span style="color:#8e44ad;">STM32CubeIDE uses a reduced library by default in order to reduce code size, as it&#39;s usually preferred for embedded development. Part of this tradeoff is dropping support for long long ints in printf-type functions.</span></p>

<p><span style="color:#8e44ad;">&gt; What can I do to print a 64-bit int value?</span></p>

<p><span style="color:#8e44ad;">Change the runtime library from reduced to standard.</span></p>

<p>之前配置的是精简标准输出库,导致输出不正确。</p>

<p>修改后,打印正确:</p>

<div style="text-align: center;"></div>

<p>stm32h7s7 主频配置的是600MHz,1/600 000 000 (s) * 35630(cycle) =5.938*10^-5 (s)=59.38us</p>

<p>可见计算速度还是很快的,总共计算了10个数据的arm_rms_f32、arm_rms_q31、arm_rms_q15。</p>

<div></div>
页: [1]
查看完整版本: 【STM32H7S78-DK】测评+DSP计算速度评估