我打算实现一个RTOS平台上的小型数据采集系统。 (无论是在QNX或RT-Linux系统。)
据我所知,这些作业是使用C / C ++,以获得最大的系统执行。 不过我很好奇,想知道,想了解一些有经验的人的意见之前,我盲目地跳进编码行动是否会是用Python语言编写的一切(从低级别的仪器通过一个闪亮的图形用户界面接口)是可行的和明智的。 如果没有,用“C”,设计的时序关键部件混合或C来写的一切,甚至不把一行Python代码。
或至少包装用Python提供对系统更容易访问的C代码。
哪种方式,你会建议我去上班吗? 如果你点一些类似的设计案例,并进一步读数以及我会很高兴。
谢谢
注1:强调对QNX的原因是由于我们已经拥有了QNX 4.25为基础的数据采集系统( M300为我们的大气测量实验)。 这是一个专有系统,我们不能访问它的内部。 因为6.4进一步寻找对QNX可能是有利的,我们有一个自由的学术许可选项,自带的Python 2.5,以及最近的GCC版本。 我从来没有测试了RT-Linux系统,不知道怎么可比它QNX的稳定性和效率方面,但我知道,Python的栖息地和非Python的工具(如谷歌地球)的所有成员,新系统可以对作品的大部分时间外的开箱开发。
我不能为每一个数据采集的设置在那里说话,但他们大多耗费了大量的“实时操作” 等待数据进来-至少是那些我已经工作的。
然后,当数据不进来,你需要立即记录事件或响应它,然后又回到了等待的游戏。 这是一个典型的数据采集系统的时间最关键的部分。 出于这个原因,我一般会说坚持使用的C显示了数据采集的I / O部件,但没有任何特别令人信服的理由不使用Python在非时间关键的部分。
如果你有相当宽松的要求 - 只需要精确到毫秒,也许是 - ,增加了一些更多的重量在Python做的一切。 至于开发时间的推移,如果你已经熟悉的Python,你可能有一个成品显著越早如果你做的一切在Python和重构只能作为瓶颈出现。 这样做的大部分在Python你的工作也将使其更容易彻底测试你的代码,并作为一般的经验法则,将会有更少的代码和错误从而更少的空间。
如果您需要专门的多任务 (不是多线程 ), 无堆栈的Python可能也是有益的。 这就像多线程,但螺纹(或微进程,在无堆栈行话)不是OS级线程,但是Python /应用程序级,所以微进程之间切换的开销显著降低。 您可以配置Stackless的协同或抢先多任务。 最大的缺点是,阻塞IO通常会阻止您的整个微进程的。 无论如何,考虑到QNX已经是一个实时系统,很难猜测无堆栈是否值得一用。
我的投票将采取AS-多的Python-AS-可能的路线 - 我看到它的成本低,高效益。 如果当你确实需要用C重写,你已经有工作的代码来启动。
我已经建立了几个所有的Python软实时(RT)系统,原发性周期时间从1毫秒到1秒。 还有我的人生路上学会了一些基本的战略战术:
只有使用线程/多从主线程,在线程之间的队列是可以接受的,协作线程卸载非RT工作是可能的(没有抢占线程!)。
避免GIL。 这基本上意味着不仅避免线程,同时也避免了系统调用来尽最大的可能,尤其是在时间紧迫的行动,除非是非阻塞的。
实际使用时的C模块。 使用C事情(通常)走得更快! 但是,如果主要是你没有写自己:留在Python,除非实在是没办法。 优化的C模块性能是一个PITA,特别是在跨越了Python-C接口翻译时成为代码的最昂贵的部分。
使用Python加速器,加速你的代码。 我的第一个RT Python项目从Psyco是受益匪浅(是的,我一直在做这一段时间)。 其中一个原因,我与Python 2.x的今天住是PyPy:事情总是走得更快与LLVM!
需要关键时序时,不要害怕忙等待。 使用time.sleep(),以“偷渡”所需的时间,那么最后1-10毫秒在繁忙的等待。 我已经能够获得可重复的性能与10微秒量级的自定时。 要确保你的Python任务在最高优先级的操作系统上运行。
NumPy的石头! 如果你正在做“活”的分析或吨的统计数据,有没有办法有助于更快地完成更多的工作,并与比使用numpy的工作少(更少的代码,更少的错误)。 不要在我所知道的任何其他语言,包括C / C ++。 如果您的大部分代码组成numpy的电话,你会非常,非常快。 我等不及要完成的numpy的端口PyPy!
要知道如何以及何时Python做垃圾回收。 监控您的内存使用,并在需要时强制GC。 请务必在时间紧迫的行动来明确禁止GC。 我所有的RT的Python系统的连续运行,和Python爱猪的记忆。 细心的编码可以消除几乎所有的动态内存分配,在这种情况下,你可以完全禁用GC!
尝试在批执行处理以尽可能最大的程度。 而不是在输入速率处理数据的,尝试在输出率,这是常慢得多来处理数据。 加工批量也使得它更方便地收集更高级别的统计数据。
我提到使用PyPy? 嗯,这是值得一提的两倍。
有使用Python中的RT发展的许多其他好处。 例如,即使你是相当肯定你的目标语言不能Python的,它可以付出巨大的好处开发和调试Python中的原型,然后用它作为既为最终系统的模板和测试工具。 我一直在使用Python来多年创建一个系统的“硬件”的快速原型,并创造quick'n'dirty测试的GUI。 这是我的第一个RT Python的系统是如何应运而生:原型(+ Psyco的)是速度不够快,即使在测试GUI运行!
-BobC
编辑:忘了提跨平台的好处:我的代码运行几乎无处不有)无需重新编译(或编译器的依赖,或需要交叉编译器),和b)几乎不依赖于平台的代码(主要为其它东西一样文件处理和串行I / O)。 我可以开发Win7上,x86和Linux上部署-ARM(或任何其他POSIX操作系统,都具有Python的这些天)。 PyPy主要是x86的现在,但ARM端口以惊人的速度发展。
一般来说兑在实时环境中使用的高级语言的原因就是不确定性 -当你运行一个程序一次可能需要100us的; 下次你运行它可能决定延长一个哈希表,调用malloc相同例行程序的时间,然后的malloc请求更多的内存的内核,这可以从即刻返回后返回毫秒返回秒后,以示数,做任何事情,没有一个是立即从代码表观(或可控)。 尽管理论上,如果你用C写的(甚至更低),你可以证明你的关键路径将“永远”在X运行时间(不包括流星撞击)。
我们的团队已经做了一些工作,结合多个语言在QNX并有相当多用的办法成功的。 使用Python可以对生产力有很大的影响,像工具SWIG和ctypes的。更方便的优化代码,并从不同的语言相结合的特点。
但是,如果你正在写东西的时间至关重要,它应该几乎肯定会用C语言编写。 这样做就意味着您避免像GIL(一种解释的langauge的隐性成本全局解释器锁 ),以及竞争对许多小内存分配。 这些事情都可以对你的应用程序如何执行有很大的影响。
同样在QNX蟒倾向于不与其它分布(即/存在有时模块丢失)100%兼容。
一个重要的提示:对于Python的QNX一般仅适用于x86的。
我敢肯定,你可以编译它PPC和其他archs,但是这行不通开箱。