大家好,欢迎来到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
如图可以看到,第一帧(电流)数据和第二帧电压数据直接的间隔,可以认为是sprintf的执行时间,(主程序无其他内容,仅仅是采样,输出),使用armcc 所消耗的时间大约是8.72μs
keil micro lib 测试结果-DMA
在keil中勾选micro lib时,发现这个时间变长了,变成了121.78μs!
说好的keil micro lib更精简,效率更高的呢?都是骗子
使用中断测试
为了更进一步看看是哪个细节耗时长,我将串口重定向改成中断方式,使用的函数也由sprintf改成printf,此时结果如下
armcc v5 测试结果-INT
printf每解析一个字节,都会重定向到中断,因此,可以看到每个字节之间都是有间隔的,但是可以看到,在发送空格之后,花费的时间较高,此时应当是代码执行“把current变量转变成%d输出”所花费的时间,此处花费大约4.93μs,这是占比最大的,其他时间都是每个字符循环输出的开销
keil micro lib 测试结果-INT
再改成keil micro lib后,大吃一惊,代码执行“把current变量转变成%d输出”所花费的时间,居然达到了63.02us!
由此可见,keil的micro lib是在负优化
测试条件
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/143238.html