实测!keil的micro lib居然是负优化?

实测!keil的micro lib居然是负优化?文章比较了在 ARMccv5 和 KeilMicrolib 环境下 使用 DMA 和中断进行串口数据发送的性能差异 发现 armccv5 显著优于 keilmicrolib 尤其在 printf 和 sprintf 操作中 keil 的优化不足

大家好,欢迎来到IT知识分享网。

简介

因为项目需要超高的处理速度,使用串口输出数据,本想着测试串口的极限速度,使用printf输出数据,却没想到,测试出来keil的micro lib速度居然远不如armcc v5的速度

使用DMA测试

DMA代码

程序调用代码很简单,

LogMessage("curr\t %d\t", current); LogMessage("volt\t %d\t", voltage); 

其中LogMessage函数里使用sprintf函数将数据解析后放入DMA发送,DMA发送也很简单,必须等待上一帧发送完成之后再次发送新的DMA

void sendMessageByDma(const char *pFmt, ...) { 
    // 等待 上一个中断、 DMA 发送完毕 while (flagInDmaTx) { 
    } flagInDmaTx=1; //  int len=0; va_list args; va_start(args, pFmt); len=sprintf(stringDmaTx, pFmt, args); va_end(args); // 不考虑溢出的情况 dma_data_number_set(DMA1_CHANNEL1, len); dma_channel_enable(DMA1_CHANNEL1, TRUE); // DMA1 开始发送串口1 } 

为了使发送数据最快,使用了默认的printf和keil里的micro lib做了测试

armcc v5 测试结果-DAM

armcc v5 DAM
如图可以看到,第一帧(电流)数据和第二帧电压数据直接的间隔,可以认为是sprintf的执行时间,(主程序无其他内容,仅仅是采样,输出),使用armcc 所消耗的时间大约是8.72μs

keil micro lib 测试结果-DMA

keil micro lib DMA
在keil中勾选micro lib时,发现这个时间变长了,变成了121.78μs!
说好的keil micro lib更精简,效率更高的呢?都是骗子

使用中断测试

为了更进一步看看是哪个细节耗时长,我将串口重定向改成中断方式,使用的函数也由sprintf改成printf,此时结果如下

armcc v5 测试结果-INT

armcc v5 INT
printf每解析一个字节,都会重定向到中断,因此,可以看到每个字节之间都是有间隔的,但是可以看到,在发送空格之后,花费的时间较高,此时应当是代码执行“把current变量转变成%d输出”所花费的时间,此处花费大约4.93μs,这是占比最大的,其他时间都是每个字符循环输出的开销

keil micro lib 测试结果-INT

keil micro lib INT
再改成keil micro lib后,大吃一惊,代码执行“把current变量转变成%d输出”所花费的时间,居然达到了63.02us!
由此可见,keil的micro lib是在负优化

测试条件

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/143238.html

(0)
上一篇 2025-05-04 22:10
下一篇 2025-05-04 22:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信