首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实时操作系统(RTOS)上的Python

实时操作系统(RTOS)上的Python
EN

Stack Overflow用户
提问于 2009-09-10 01:12:23
回答 5查看 23.5K关注 0票数 18

我计划在RTOS平台上实现一个小规模的数据采集系统.(无论是在QNX上还是在RT系统上。)

据我所知,这些工作是使用C/ C++执行的,以最大限度地利用系统。然而,我很想知道,并想了解一些有经验的人的意见,然后我盲目地投入到编码行动中去,用Python编写所有东西是否可行和明智(从底层仪器接口到闪亮的图形用户界面)。如果不是,将设计的关键时间部分与"C“混合,或者用C编写所有东西,甚至不放一行Python代码。

或者至少使用Python包装C代码以提供对系统的更容易的访问。

你建议我改哪条路?我很高兴你指出一些类似的设计案例和进一步的阅读。

谢谢

NOTE1:强调QNX的原因是因为我们已经有了一个基于QNX4.25的数据采集系统(M300),用于我们的大气测量实验。这是一个专有的系统,我们不能访问它的内部。进一步研究QNX可能对我们有利,因为6.4有一个免费的学术许可选项,附带Python2.5和最近的GCC版本。我从未测试过RT-Linux系统,也不知道它在稳定性和效率方面与QNX有多大的可比性,但我知道所有Python生境和非Python工具(比如Google Earth)的所有成员都可以在大部分时间内在工作上开发新系统。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-09-10 02:17:38

我不能代表所有的数据采集装置,但是他们中的大多数人都在等待数据的到来--至少是我曾经做过的那些。

然后,当数据进入时,您需要立即记录事件或响应它,然后它返回到等待的游戏。这通常是数据采集系统中最关键的时间部分。由于这个原因,我通常会说,在数据采集的I/O部分中坚持使用C,但是没有任何特别令人信服的理由不在非时间关键部分使用Python。

如果您的需求相当松散--可能只需要毫秒精度--这将为用Python完成所有工作增加一些负担。就开发时间而言,如果您已经对Python感到满意,那么如果您只在出现瓶颈时才使用Python和重构,那么您可能会更快地拥有一个成品。用Python完成大部分工作也将使彻底测试代码变得更加容易,而且作为一般经验规则,代码行数将减少,从而减少了bug的空间。

如果您需要指定多任务(而不是多线程),无堆栈Python也可能是有益的。这就像多线程一样,但是线程(或者用无堆栈的术语来说是tasklet)不是OS级线程,而是Python/应用程序级的线程,因此在线程之间切换的开销大大降低了。您可以将Stackless配置为多任务协作或先发制人。最大的缺点是阻塞IO通常会阻塞整个任务集。无论如何,考虑到QNX已经是一个实时系统,很难推测无堆栈是否值得使用。

我的投票将是采取尽可能多的Python-可能的路线-我认为它是低成本和高效益。如果您确实需要用C重写,那么您已经可以开始编写工作代码了。

票数 15
EN

Stack Overflow用户

发布于 2013-02-21 20:52:00

我已经构建了几个全Python软实时(RT)系统,主要周期从1ms到1秒不等。在此过程中,我学到了一些基本的策略和策略:

  1. 使用线程/多处理(只使用)从主线程卸载非RT工作,其中线程之间的队列是可以接受的,并且可以协作线程(没有抢占线程!)。
  2. 避开吉尔。这基本上意味着不仅要避免线程,而且要尽可能地避免系统调用,特别是在关键时间操作期间,除非它们是非阻塞的。
  3. 实用时使用C模块。事情(通常)用C的速度更快!但是,主要是如果您不必编写自己的代码:除非真的没有其他选择,否则请继续使用Python。优化C模块的性能是一个皮塔,特别是当跨Python接口转换成为代码中最昂贵的部分时。
  4. 使用Python加速器加速代码。我的第一个RT项目极大地受益于精神病学(是的,我已经做了很长时间了)。我今天一直使用Python2.x的原因之一是PyPy:总是使用LLVM的速度更快!
  5. 不要害怕忙碌--在需要关键时间的时候等待。使用time.sleep()在期望的时间内“悄悄地”前进,然后在最后的1-10毫秒内等待。我已经能够在10微秒左右的时间内获得可重复的性能。确保您的Python任务以最大OS优先级运行。
  6. 矮胖的石头!如果您正在进行“实时”分析或大量的统计,就没有办法比使用Numpy更快、更少的工作(代码更少、bug更少)完成更多的工作。我不知道任何其他语言,包括C/C++。如果您的大部分代码由Numpy调用组成,您将非常非常快。我等不及PyPy的Numpy端口完成了!
  7. 注意Python是如何以及何时进行垃圾收集的。监控您的内存使用情况,并在需要时强制GC。确保在关键时间操作期间显式禁用GC。我所有的RT系统都连续运行,Python喜欢占用内存。仔细的编码可以消除几乎所有的动态内存分配,在这种情况下,您可以完全禁用GC!
  8. 尽可能多地以批方式执行处理。不要按输入速率处理数据,而是尝试以输出速率处理数据,这通常要慢得多。分批处理也使收集更高层次的统计数据更加方便。
  9. 我提到使用PyPy了吗?值得一提的是两次。

使用Python进行RT开发还有许多其他好处。例如,即使您相当肯定您的目标语言不可能是Python,在Python中开发和调试一个原型也会带来巨大的好处,然后使用它作为最终系统的模板和测试工具。多年来,我一直在使用Python创建系统“硬部分”的快速原型,并创建快速的‘n’脏测试GUI。这就是我的第一个RT Python系统是如何出现的:即使在测试GUI运行的情况下,原型(+Psyco)也足够快!

-BobC

编辑:忘了提到跨平台的好处:我的代码几乎到处运行,a)没有重新编译(或编译器依赖,或需要交叉编译器),b)几乎没有平台相关的代码(主要用于文件处理和串行I/O等错误代码)。我可以在Win7-x86上进行开发,并在Linux上部署(或者其他任何POSIX操作系统,这些操作系统现在都有Python )。PyPy目前主要是x86,但ARM端口正在以令人难以置信的速度发展。

票数 24
EN

Stack Overflow用户

发布于 2009-09-10 02:28:08

通常,反对在实时上下文中使用高级语言的原因是不确定的--当您运行一个例程时,可能需要100 is;下一次运行相同的例程时,它可能决定扩展一个哈希表,调用malloc,然后malloc请求内核提供更多的内存,从立即返回、毫秒后返回到几秒钟后返回,再到错误,从代码中没有一个是立即明显的(或可控的)。理论上,如果你用C(甚至更低的)写,你可以证明你的关键路径将“总是”(除非流星撞击)在X时间运行。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1402933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档