便携式硬实时C或C ++原始以太网协议库

时间:2012-11-18 02:29:17

标签: c++ c protocols real-time raw-ethernet

我正在尝试创建一个具有硬实时功能的业余爱好者便携式机器人库(Windows和Linux)。它应该能够通过标准以太网连接到微控制器,将固件上传到该设备,通过现场总线连接到其他设备,并将固件上传到运行专用控制器的其他微控制器。如果需要硬实时,NIC将是RTnet支持的NIC。我希望典型的伺服速率至少为1 kHz,但最好是2 kHz或更高。它将运行一个完全自定义的协议(不是基于IP的TCP或UDP),因此开销很小,高速现场总线可以在不接收或发送帧时饱和。然后,可以解释以太网帧中的有效负载或将其发送到连接的设备。

1)我更喜欢将协议保留在C ++中,但要知道使用“new”关键字不适用于实时编程。如果我选择使用C ++语言而不是将项目转换为C,我会遇到哪些其他限制?人们会推荐教授如何利用C ++并满足硬实时期限的书籍或网站吗?我相信它是可能的,我希望能够继续使用C ++,因为Orocos项目使用实时C ++。我宁愿不使用C代码。

2)为了保持便携式协议库的通用性,程序如何在非实时以太网适配器和RTnet以太网适配器上同时处理协议运行?

我遇到的一个具体问题是关于一个可以使用boost或Xenomai互斥锁的便携式Mutex类的问题。

问题2的解决方案1可能如下:如果应用程序也已使用Xenomai库编译,则可以使用布尔标志构造互斥锁,以说明在运行时将包装哪些方法(boost或Xenomai)锁定和解锁。如果库是为Xenomai编译的,它可能包含boost mutex和Xenomai互斥锁。我不喜欢这个解决方案,因为如果项目是针对Xenomai编译的,那么它将包含用于boost和Xenomai的互斥锁的私有变量,这似乎是一种不那么优雅的方式,只需要一个人们需要的互斥锁。

问题2的解决方案2可能如下:将2个不同的派生类从纯虚拟接口方法的抽象类写入互斥锁,一个用于boost,一个用于Xenomai。我喜欢这种方式更好,但后来告诉在运行时使用哪个类是麻烦的。我可能不得不拥有一个增强池和Xenomai互斥体。这是大多数硬实时C ++程序解决这个问题的方法吗?

我遇到的问题不仅仅是互斥,而是希望收到反馈,因为我不想从一开始就复制糟糕的设计模式。

3)我相信Beckoff的TwinCAT在Windows 7下实时运行EtherCAT。是否有任何东西将出现在业余爱好者无法接触的情况下至少支持一个具有硬实时功能的NIC Windows 7或更高版本?也许有一个开源的Hypervisor项目。

4)此外,人们如何加载系统,以便他们的四核计算机使用每个核心的100%,以便他们可以判断他们的系统是否未实时运行?

1 个答案:

答案 0 :(得分:2)

一个细节:如果你想为伺服器提供1khz的刷新周期,你为什么要使用硬实时?软实时(即以root身份运行,但是纯用户空间,但将调度程序策略设置为该进程的FIFO级别,将所有内容锁定到内存中,禁用交换空间......)并且您可以轻松获得1khz而不会丢失单个在一整年的运行中留言。

此时,只需使用原始套接字作为以太网协议,并将其称为一天。

至于无关的问题,以太网CD / CA最近在硬件中实现。只是忽略它们。