查看: 10573|回复: 12

[讨论] 怎么计算在不同型号下的单片机运行Printf()函数的时间?

[复制链接]

该用户从未签到

32

主题

138

帖子

0

中级会员

Rank: 3Rank: 3

积分
390
最后登录
2017-12-29
发表于 2017-4-8 15:53:43 | 显示全部楼层 |阅读模式
1、型号不同,主频不同,怎么计算时间?
2、型号相同,输出打印的内容不同,又该怎么计算?
3、考虑单片机输出到电脑端的传输时间,又怎样?

最后:对于KL25调用Printf还是传输一个字符需要的时间大概多少?0.1ms?0.01ms?1us?0.1us?
回复

使用道具 举报

  • TA的每日心情
    郁闷
    2021-1-9 21:21
  • 签到天数: 56 天

    连续签到: 1 天

    [LV.5]常住居民I

    52

    主题

    677

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    1470
    最后登录
    2021-1-9
    发表于 2017-4-16 03:36:57 | 显示全部楼层
    胡孟龙 发表于 2017-4-15 14:12
    谢谢前辈的指点,虽然我现在还是不知道怎么计算Printf函数启动的时间,但是在连续输出200个数据的情况下 ...

    没什麽复杂的,就是不调用那些格式化处理,直接通过UART将数据发送出去,这样最省时间,例如一次发送16bit(2个Byte)应该能满足需要了(你的ADC不会超过16bit的精度吧?),采用DMA的方式发送(这样发送时不需要MCU内核的干预,省时间),关于怎样配置UART的DMA发送方式去看MCU手册的相关配置。
    处理流程如下:
    1、初始化DMA
    2、初始化UART(配置以DMA方式通讯)
    3、接收ADC数据
    4、将ADC数据放置到DMA的缓冲区(数据会通过UART自动发送出去,不需要再干预)
    5、处理下一组ADC
    6、循环到第4步
    这样就OK了
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-1-9 21:21
  • 签到天数: 56 天

    连续签到: 1 天

    [LV.5]常住居民I

    52

    主题

    677

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    1470
    最后登录
    2021-1-9
    发表于 2017-4-15 13:43:18 | 显示全部楼层
    本帖最后由 中山无雪 于 2017-4-15 13:49 编辑
    胡孟龙 发表于 2017-4-10 10:32
    您好,首先十分感谢您的回答。我记得单片机中移植的Printf函数也是蛮复制的,这段函数的执行时间相对传送 ...

    其实这段代码很好理解,自己可以去看看,不外乎就是将输出定位到一个串口上,而串口都是一个byte一个byte发送数据的,在printf的实现上消耗时间最多的部署串口本身的输出(这段时间可以计算出来),而是做数据格式的转换,有一大长段代码,而且不同的输出内容代码量不一致,这将导致消耗时间的不一致,不好计算。

    其实若是需要精确计算时间最好别用printf,而是自己写代码,将数据直接通过串口输出,这样的代码量会少,时间也可控。


    是否需要将这个时间计算在内要看你系统的要求,对于高精度的应用几个us也是要计算在内的,一般的应用就算了
    对于高精度应用还要注意使用外置晶振,而且晶振的容差要小
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7881
    最后登录
    2025-4-11
    发表于 2017-4-8 17:18:24 | 显示全部楼层
    你可以用定时器计算
    或者改变IO的电平状态,利用示波器看电平变化持续时间来确定
    来根华子
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-1-9 21:21
  • 签到天数: 56 天

    连续签到: 1 天

    [LV.5]常住居民I

    52

    主题

    677

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    1470
    最后登录
    2021-1-9
    发表于 2017-4-8 23:16:48 | 显示全部楼层
    本帖最后由 中山无雪 于 2017-4-8 23:19 编辑

    115200baud代表 115200byte/s,每传送一个字节耗时=1/115200 = 8.68055...e-6秒=8.68us

    当然了,不同的速率时间肯定是不一致的
    和MCU/MPU的主频、型号没关系,也和传输的内容没关系,只和UART的速率设置有关系
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    32

    主题

    138

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    390
    最后登录
    2017-12-29
     楼主| 发表于 2017-4-10 10:32:45 | 显示全部楼层
    中山无雪 发表于 2017-4-8 23:16
    115200baud代表 115200byte/s,每传送一个字节耗时=1/115200 = 8.68055...e-6秒=8.68us

    当然了,不同的速 ...

    您好,首先十分感谢您的回答。我记得单片机中移植的Printf函数也是蛮复制的,这段函数的执行时间相对传送时间是可以忽略的吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24950
    最后登录
    2025-7-25
    发表于 2017-4-10 10:52:18 | 显示全部楼层
    胡孟龙 发表于 2017-4-10 10:32
    您好,首先十分感谢您的回答。我记得单片机中移植的Printf函数也是蛮复制的,这段函数的执行时间相对传送 ...

    如果你要考虑整个代码的执行时间,你可以加上systick定时器,计算下代码的执行时间。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    32

    主题

    138

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    390
    最后登录
    2017-12-29
     楼主| 发表于 2017-4-10 11:14:13 | 显示全部楼层
    Printf("4d%",t);
    Printf("d%",t);
    两者发送的字节数一样吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    32

    主题

    138

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    390
    最后登录
    2017-12-29
     楼主| 发表于 2017-4-10 11:15:25 | 显示全部楼层
    小恩GG 发表于 2017-4-10 10:52
    如果你要考虑整个代码的执行时间,你可以加上systick定时器,计算下代码的执行时间。 ...

    怎么做呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24950
    最后登录
    2025-7-25
    发表于 2017-4-10 12:05:41 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    32

    主题

    138

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    390
    最后登录
    2017-12-29
     楼主| 发表于 2017-4-15 14:12:53 | 显示全部楼层
    中山无雪 发表于 2017-4-15 13:43
    其实这段代码很好理解,自己可以去看看,不外乎就是将输出定位到一个串口上,而串口都是一个byte一个byte ...

    谢谢前辈的指点,虽然我现在还是不知道怎么计算Printf函数启动的时间,但是在连续输出200个数据的情况下,调试发现启动时间相对数据输出的时间就是比较短的了。
    我的程序的任务要求是ADC Pingpong采样(300us一个数据),两个数组切换保存数据,然后主循环中输出打印,只要Printf输出一个数组的时间小于ADC存满一个数组的时间即可。
    由于数据是32位的,输出一个数据Printf大概在277us。实际测试后发现数据没有丢失情况发生。

    怎么写代码的方式我还不知道怎么做?可否指点下,前辈。
    在上面这个程序做完后,现在接到的任务是ADC切换采集8路数据(MAX14753),打印输出。还正在做。。。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-26 22:42 , Processed in 0.106367 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表