5

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

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

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

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

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

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

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

3) 我相信 Beckoff 的 TwinCAT 可以在 Windows 7 下实时运行 EtherCAT。在 Windows 7 下支持至少一个具有硬实时的 NIC 或之后?也许有一个开源的 Hypervisor 项目。

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

4

1 回答 1

2

一个细节:如果你想要一个 1khz 的伺服系统刷新周期,你为什么要使用硬实时?软实时(即以 root 身份运行,但纯用户空间,但将调度程序策略设置为该进程的 FIFO 级别,将所有内容锁定到内存中,禁用交换空间 ...),您将轻松从中获得 1khz,而不会错过任何一个运行一整年的消息。

此时,只需为您的以太网协议使用原始套接字即可。

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

于 2012-11-25T08:27:00.177 回答