【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> </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>……</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> </p>
<p>首先在mian.c加入对头文件的引用:</p>
<pre data-index="0" name="code">
<code class="language-cpp">#include "perf_counter.h"</code></pre>
<p>然后对 <em><strong>perf_counter</strong></em> 库进行初始化:</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>如果用户并没有自己初始化 <em>SysTick</em>,传递 <em>false</em> 给函数 <em>init_cycle_counter()</em> 。</p>
<p>如果用户自己初始化了 <em>SysTick</em>,传递<em>true</em> 给函数 <em>init_cycle_counter()</em> 。</p>
<p>本项目生产的工程是初始化了<em>SysTick,所以入口参数是true</em> </p>
<div style="text-align: center;"></div>
<p> </p>
<p> </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, &pResult);
//printf("arm_rms_f32 : pResult = %f\r\n", pResult);
/*****************************************************************/
for(pIndex = 0; pIndex < 10; pIndex++)
{
pSrc1 = rand();
}
arm_rms_q31(pSrc1, 10, &pResult1);
//printf("arm_rms_q31 : pResult = %d\r\n", pResult1);
/*****************************************************************/
for(pIndex = 0; pIndex < 10; pIndex++)
{
pSrc2 = rand()%32768;
}
arm_rms_q15(pSrc2, 10, &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> </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> </p>
<p><span style="color:#8e44ad;">STM32CubeIDE uses a reduced library by default in order to reduce code size, as it'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;">> 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]