Edw*_*ard 5 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.是否会出现任何在Windows 7或Windows 7下支持至少一个具有硬实时功能的NIC的爱好者无法触及的内容后来?也许有一个开源的Hypervisor项目.
4)此外,人们如何加载系统,以便他们的四核计算机使用每个核心的100%,以便他们可以判断他们的系统是否未实时运行?
一个细节:如果你想要 1khz 的伺服系统刷新周期,为什么要使用硬实时?软实时(即以 root 身份运行,但纯用户空间,但将调度程序策略设置为该进程的 FIFO 级别,将所有内容锁定到内存中,禁用交换空间...),您将轻松获得 1khz,而不会错过任何一个运行一整年的消息。
此时,只需为以太网协议使用原始套接字即可。
至于不相关的问题,以太网 CD/CA 如今是在硬件中实现的。忽略它们即可。