[讨论] 关于MicroPython基于STM32开发串口及文件操作的优化设计

shenshen927   2017-8-26 17:43 楼主
有这样的一个需求(我的开发板是pyb,mcu是STM32F405),有一个串口在源源不断的接收数据,数据接收速率非常高,波特率可能达到921600,我需要一直监听并接收该数据,对数据做相应的处理后,需要将这些数据以文件的形式保存在sd卡中。 针对这样的需求,我在实现的时候有以下几个方面的考虑,请教版上大牛。 1、由于串口速率较高,我应该采用while(True)死循环的方式一直读,还是采用定时器的方式定时读如果采用定时器,目前stm32f405的最小定时间隔是不是1毫秒这个定时间隔对921600的速率来说会不会造成数据拥塞最终导致串口缓冲区溢出(话说f405的串口缓冲有多大),从而存在数据丢失的可能 2、由于我收到数据后,需要做相应的解析处理并存储为文件,这部分操作 放到上面说的循环里面做合适么对于上位机编程来讲,一般文件IO的处理都是比较慢的,嵌入式方面在不上系统的前提下也没有线程的概念吧,因此如果这部分操作放在接收数据的循环里面执行,会不会因为文件存储而造成阻塞串口接收或者阻塞其它功能的执行 3、请问,这样的需求,如何设计最优呢 本帖最后由 shenshen927 于 2017-8-26 17:45 编辑

回复评论 (6)

已经在另外帖子回复了。不过想补充几点:

无论什么软件或者系统,尽量不要用while(1)去读取串口和其它外设,这样会影响整体效率,阻塞其它功能,除非实在没有其它办法了。

如果串口速度太高,可以考虑多MCU的使用,尽量利用mpy的长处,而避免它解释执行的弱点。
点赞  2017-8-26 20:56
引用: dcexpert 发表于 2017-8-26 20:56
已经在另外帖子回复了。不过想补充几点:

无论什么软件或者系统,尽量不要用while(1)去读取串口和其它外 ...

多MCU的话,你的意思是用其中一个MCU专门来处理串口?
mpy的主要长处也就是代码量少,开发工作小了吧。
我是在想,921600这个波特率,和 几毫秒的定时读取 比较匹配?这个能否大致推算出来。
点赞  2017-8-26 21:15
引用: dcexpert 发表于 2017-8-26 20:56
已经在另外帖子回复了。不过想补充几点:

无论什么软件或者系统,尽量不要用while(1)去读取串口和其它外 ...

另外,您说“考虑到python语言解释执行带来的延迟,太小的定时时间会影响系统效率。”
记得在另外一个帖子看过评测,mpy的执行效率相比stm32原生c的固件库来说,整数执行效率大概在二十到三十几倍,浮点运算效率大概在一百零几倍。
那么,定时器的最小定时间隔不要小于多少?能否给一个推荐值呀。
点赞  2017-8-26 21:23
引用: shenshen927 发表于 2017-8-26 21:15
多MCU的话,你的意思是用其中一个MCU专门来处理串口?
mpy的主要长处也就是代码量少,开发工作小了吧。
...

要看你的功能要求是什么,921600的波特率,大概就是92K/s,如果数据是连续的,一秒有90K数据,大部分嵌入式MCU是直接处理不了,需要用DMA或者用更高的MCU,才有足够的性能和RAM处理。

如果波特率高,但是数据量小,那么MCU还是可以处理,数据会先保存到缓冲区,然后MCU进行数据处理。

mpy的好处在于不用管系统底层,在不同型号的MCU之间容易移植程序,这和代码量关系不大,mpy同样是可以做很复杂程序的。对于较大的程序,需要注意垃圾回收机制,它对运行效率有一定影响。虽然系统有自动回收机制,但是有时还是需要自己控制。

定时器的时间,需要你多比较测试一下,才能得出结果。
点赞  2017-8-27 14:17
引用: dcexpert 发表于 2017-8-27 14:17
要看你的功能要求是什么,921600的波特率,大概就是92K/s,如果数据是连续的,一秒有90K数据,大部分嵌入 ...

好的,谢谢版主耐心解答,我再研究下~
点赞  2017-8-27 22:23
引用: shenshen927 发表于 2017-8-27 22:23
好的,谢谢版主耐心解答,我再研究下~

不客气了,大家一起学习交流。
点赞  2017-8-28 10:08
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复