目录
- 通用问题
- 我的内核驱动程序已经签名了吗?
- 是否可以在打开驱动程序时防止显示介绍窗口?
- Windows 7 仍然支持吗?
- 错误0x10142422(`KSERROR_CANNOT_START_KERNEL`)在`KS_openDriver`时出现?
- 错误 10145241 (KSERROR_CANNOT_START_KERNEL) 在 KS_openDriver 时出现?
- 可以在C#应用程序中使用Kithara RealTime Suite吗?
- Kithara RealTime Suite可以在虚拟机中运行吗?
- 问要在Visual Studio 2005中打开带有WPF的C#项目
- 是否可以在Kithara RealTime Suite中使用VB6或者OCX组件?
- 运行kithara后系统时钟出现异常
- 实时系统
- 移植
- USB
- 回调、信号以及内核代码
- EtherNet、TCP、UDP
- EtherCAT
通用问题
我的内核驱动程序已经签名了吗?
是的,我们的实时驱动程序——通常包括我们所有的安装和应用程序文件——已经签名。特别是对于64位系统,这是正确使用软件的必要条件。然而,签名的驱动程序显示出可靠性。
这也意味着我们的软件可以简单地用作您的PCI/PCIe或USB设备的驱动程序。为此,包含的INF文件必须按照记录的方法添加一条条目。这样做是为了在每个系统上安全地访问硬件。
我们的建议是:将所需的硬件ID发送给我们,我们会将它们插入INF文件,并在过程中通过CAT文件对其进行签名。
是否可以在打开驱动程序时防止显示介绍窗口?
是的,这是可以的。
打开注册表编辑器(regedit.exe)并找到以下节点:
HKEY_LOCAL_MACHINE/SOFTWARE/Kithara/Drivers/<driver_name>
在此文件夹中插入一个名为“HideInfo”的DWORD值(32位),其值为1。这样,介绍窗口一天只会出现一次,并且仅在使用开发者许可证时。在运行时安装中,介绍窗口将永远不会出现。
Windows 7 仍然支持吗?
不支持。由于微软已经停止了对Windows 7的认证,我们也无法为其提供更新。
错误0x10142422(KSERROR_CANNOT_START_KERNEL
)在KS_openDriver
时出现?
有时,安装程序或KS_openDriver
可能无法正确启动您的Kithara驱动程序。在这种情况下,KS_openDriver
会报告错误KSERROR_CANNOT_START_KERNEL
,特别是错误代码0x10142422。如果您收到此错误,则需要手动启动驱动程序。请按照以下步骤操作:
- 点击“开始”按钮 > “运行…” > 输入"regedit" > 确认点击“确定”打开注册表编辑器。
- 找到键
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Kithara-
。您的驱动程序名称与 DLL 文件名称相同。 - 点击该键,在窗口右侧看到Start值。
- 双击Start值,输入1,并确认点击“确定”。
- 重启Windows。
现在,KS_openDriver
应该能够成功运行。
错误 10145241 (KSERROR_CANNOT_START_KERNEL) 在 KS_openDriver 时出现?
此错误是由于驱动程序的签名证书引起的。证书或解释证书的Windows版本已过期。
您需要:
- 禁用Windows安全启动,以允许加载没有有效证书的驱动程序
- 或者获取具有有效证书(EV代码签名证书)的更新驱动程序
另外,您可以:
- 更新您的Windows,使其能够识别现代证书类型。
可以在C#应用程序中使用Kithara RealTime Suite吗?
是的,Kithara RealTime Suite包括一个C#类,用于公开Kithara RealTime Suite的API。使用这个类,可以在C#应用程序中利用整个功能范围。然而,包含实时能力代码的部分程序必须以DLL形式提供,使用原生机器代码(x86或x64),通常由C/C++或Delphi生成。
为了尽可能简化开发阶段,我们提供了一个项目模板,展示如何将实时能力代码集成到您的应用程序中。您可以直接使用这个项目文件进行自己的开发。
Kithara RealTime Suite可以在虚拟机中运行吗?
在虚拟环境中,无法保证实时能力。控制虚拟机的Hypervisor无法在虚拟环境内受到影响。这意味着无法保证快速的响应时间。
原则上,Kithara RealTime Suite可以安装在虚拟机上。例如,这对于调试目的可能是有益的。然而,无法保证时间性能,并且某些功能可能不可用。
问要在Visual Studio 2005中打开带有WPF的C#项目
您需要按照以下步骤操作:
-
安装必要的扩展:
Visual Studio 2005最初不支持WPF,因为它随附的是.NET Framework 2.0,而WPF从.NET Framework 3.0开始支持。您需要安装一个名为“VS 2005 Extensions for .NET Framework 3.0 (WPF & WCF) CTP”的扩展。- 微软提供了这个扩展,但在2008年6月从官方下载中心中移除。
- 您可以从CNET等替代来源下载:下载链接。
-
安装步骤:
下载扩展后,按照以下步骤操作:- 运行安装程序
vsextwfx.msi
。 - 如果您已安装了比3.0更高版本的.NET Framework,请使用以下命令行启动安装程序,以覆盖兼容性检查:
msiexec /i vsextwfx.msi WRC_INSTALLED_OVERRIDE=1
- 这样可以确保即使检测到较新的.NET Framework版本,安装也能顺利进行。
- 运行安装程序
-
打开项目:
- 安装完成后,启动Visual Studio 2005。
- 现在应该能够打开和处理包含WPF组件的C#项目。
按照这些步骤,您可以在Visual Studio 2005中启用对WPF的支持,并处理包含WPF特性的C#项目。
是否可以在Kithara RealTime Suite中使用VB6或者OCX组件?
原则上,可以在我们的软件中使用VB6。但由于VB6现在已经非常老旧,因此我们提供的示例程序很少。我们软件的主要目标是提供实现“Windows下实时”功能的库。这只能在Windows的内核级别上实现。因此,需要能在内核级别运行的语言。目前只有C/C++和Delphi是支持的这种语言。此外,我们也支持一些C#项目示例,因为可以将主要应用程序用C#编写,然后将仅包含时间关键部分的部分编译成C++的DLL。
如果您使用VB.NET,那么可以轻松使用C#接口。但是仍然需要编写一个用C或C++编写的DLL来处理时间关键的代码。如果不涉及时间关键(实时)需求,那么可以继续在应用程序级别上使用C#或VB.NET编写所有代码。
即使可以使用VB6进行编程,我们也不推荐这样做,因为VB6无法正确执行多线程应用程序。同样的情况也适用于OCX组件,这也是我们没有开发OCX组件的原因。
运行kithara后系统时钟出现异常
您可以手动禁用KRTS,使Windows时钟保持自身的同步状态。操作步骤如下:
- 在Windows注册表中创建键
HKEY_LOCAL_MACHINE\SOFTWARE\Kithara\Modules\clock
在该键下添加一个名为 DisableAdjustclocks 的DWORD值。 - 将
HKEY_LOCAL_MACHINE\SOFTWARE\Kithara\Modules\clock\DisableAdjustclocks
的值设置为 1。 - 系统重启后,Windows时间将不再被调整或与KRTS时钟同步。
这些步骤可以帮助您在Kithara RealTime Suite中修复同步问题之前手动调整和管理Windows时钟。
实时系统
如何在C#程序中利用实时特性?
Windows本身不是一个实时系统。要实现实时特性,必须在实时上下文(内核级别)中执行时间关键的代码。由于在.NET环境中,C#无法实时执行,因此其时间行为仍取决于Windows调度程序。但是可以将时间关键的C#线程分配给绝对最高的线程优先级。
以前程序员无法做到这一点。因此,Kithara提供了相应的机制。至少,这些机制可以确保应用程序优先于所有其他Windows应用程序。为了实现真正的实时行为,关键代码应该使用C++或Delphi编写,并移至DLL文件中,以便可以直接加载到实时上下文中。
用于应用程序和实时上下文之间通信的机制包括共享内存、数据或消息管道、事件或套接字。我们提供了多个示例项目,展示如何在C#应用程序中嵌入“硬”实时特性。
什么会导致实时任务的抖动?
通过将CPU专用于Kithara RealTime,Windows或运行在Windows上下文中的其他软件不会对系统的实时行为产生影响。
然而,不同的硬件可能具有更好或更差的实时能力,特别是BIOS/UEFI的配置选项可能会影响实时能力。
-
C1E = Enhanced Power Save Modes of the CPU.
现代CPU的节能模式使CPU可以非常快速地切换到不同的睡眠模式,关闭CPU的不同功能块。从这些睡眠模式唤醒CPU需要时间,并会引入延迟。
为了获得最佳的实时体验,应该关闭所有节能模式。
您可以在BIOS/UEFI中找到以下选项(具体取决于您的BIOS/UEFI设置):- C1E
- C-States
- Deeper C States
-
SpeedStep
现代CPU的节能选项会使CPU在空闲时切换到较低的频率。在需求增加时恢复到更高的频率需要时间,并会引入延迟。
为了获得最佳的实时体验,应该关闭动态频率变化。
您可以在BIOS/UEFI中找到以下选项(具体取决于您的BIOS/UEFI设置):- EIST
- SpeedStep
- Turbo Boost
- PowerNow!
- Cool’n’Quiet
-
Legacy USB Support
根据我们的经验,这些选项(取决于UEFI的实现方式)可能会对实时能力产生不良影响,应该将其关闭。 -
超线程/同时多线程(SMT)
在大多数情况下,应该关闭超线程以确保每个“逻辑”CPU对物理CPU资源的完全访问。请参阅《将CPU专用于Kithara RealTime》中的相应说明。 -
WBINVD = 清除所有内部缓存的汇编指令。
例如,Nvidia图形设备驱动程序使用此指令。此问题只能通过避免使用此指令的软件来解决。对于设备驱动程序,只有切换到不使用此指令的不同硬件才能帮助解决问题。
网卡驱动如何动态切换
有两种方法可以实现自动切换驱动, 包括但不限于网卡驱动、XHCI驱动等
- 在打开驱动的时候添加
KSF_DYNAMIC_SWITCH
标志 - 在注册表中
HKEY_LOCAL_MACHINE/SOFTWARE/Kithara/Drivers/<driver_name>
添加一个DWORD
数据类型的SwitchAlwaysDynamic项, 值设置为1
Error 1040?000 (KSERROR_NO_REALTIME_ACCESS) by KS_openDriver
?
KS_openDriver函数可能会返回KSERROR_NO_REALTIME_ACCESS错误。
这并不总是一个错误。
它更像是一个警告,表明运行驱动程序的机器由于某种原因没有实时能力。
具体原因将由扩展错误码指定:
KSERROR_NO_REALTIME_ACCESS | 0x5000
: 检测到Windows虚拟化。参见KSERROR_NO_REALTIME_ACCESS | 0xA000
: 未找到APIC(高级可编程中断控制器)。
系统没有APIC(Advanced Programmable Interrupt Controller)。不支持没有APIC的“标准PC”配置。KSERROR_NO_REALTIME_ACCESS | 0xB000
: Windows未使用APIC。KSERROR_NO_REALTIME_ACCESS | 0xC000
: 未找到实时CPU - 请启用专用模式。
在Windows 8/8.1和Windows 10上运行实时任务时,需要使用专用CPU,但没有可用的CPU。
参见KSERROR_NO_REALTIME_ACCESS | 0xD000
: 未允许实时。通常表示缺少实时许可证。
在这些情况下,任何不使用(显式或隐式)实时功能的函数仍然可以成功使用。
如何调试实时代码?
假设应用程序的实时部分位于一个 DLL 中,并且在调用KS_loadKernel
函数时没有设置KSF_REALTIME_EXEC
标志,那么可以通过标准的 Windows 机制将 DLL 加载到应用程序的上下文中,然后像通常一样进行调试。这样可以彻底评估算法的正确性及其他方面。
要在实时环境中进行更深入的开发(在调用KS_loadKernel
时设置了KSF_REALTIME_EXEC
标志),您可以使用 Kithara Kernel Tracer。
移植
Real-time在Windows 10 x64上如何实现?
然而,Windows 10 x64引入了所谓的“内核补丁保护”,以限制对操作系统的访问。因此,在被Windows使用的CPU核心上执行实时任务的代码执行是不可能的。
然而,通过使用专用模式,可以将单个或多个CPU核心从Windows操作系统中释放出来(更多信息请参阅此处)。在这种情况下,Kithara实时系统独占地在相应的CPU上启动。这使得在Windows 10 x64系统上实现了具有最佳实时特性的实时功能。
可以在64位系统上使用我的32位实时应用程序吗?
我们区分3种不同的组合:
- 在32位Windows上运行32位应用程序
- 在64位Windows上运行64位应用程序
- 在64位Windows上运行32位应用程序
情况1)和2)是显而易见的,这里不再讨论。
对于情况3),我们建议以下解决方案:
将具有实时要求的部分功能移入一个独立的DLL中。
使用我们的KiK64机制,即使您的应用程序是为32位开发的,并且DLL是为64位操作系统开发的,您也可以从应用程序调用这些功能。
有关KiK64机制的详细信息,请参阅。
Kithara DOS Enabler是否支持Windows 10?
是的,Kithara DOS Enabler可以使硬件相关的DOS和16位Windows程序在Windows 10下正常工作。
支持32位和64位系统。
Kithara DOS Enabler拥有自己的DOS系统(FreeDOS),并在专用CPU核心上本地执行16位应用程序。
通过消除Windows系统对实时应用程序的任何影响,实现了时间关键的应用程序。
要编写硬件相关和时间关键的32位和64位应用程序,请参考Kithara RealTime Suite。
USB
如何设置接收超时?
接收超时通过在调用 KS_openUsbEndPoint
函数时激活标志 KSF_USE_TIMEOUTS
来实现。接收超时时间设置如下:
int timeout = 500; // 超时时间,单位为毫秒
KS_execUsbCommand(hUsbEndPoint, KS_USB_SET_PACKET_TIMEOUT, 0, &timeout, sizeof(timeout), 0);
确保在设置超时时,hUsbEndPoint
是有效的 USB 端点句柄。这样可以指定系统在等待接收数据时的最长等待时间。
USB是否支持实时能力?
是的,通过USB实时模块,可以直接访问xHCI控制器,从而实现与USB设备(例如USB3 Vision相机)的实时通信。
回调、信号以及内核代码
在C++中,在实时上下文中可以创建一个类的全局对象吗?
是的,有不同的方法可以实现这一点。
你需要考虑的是,在动态链接库(DLL)加载时常见的启动代码并不在实时环境下执行。
也就是说,全局对象的构造函数必须通过其他方式执行。
以下是几种方法:
-
使用静态指针变量:
MyClass* _pObject; int myFunction(...) { static MyClass* _pObject; if (!_pObject) _pObject = new MyClass(...); _pObject->doSomething(); // other operations }
这种方法中,全局对象的实例化延迟到第一次调用
myFunction
函数时。 -
在
KS_loadKernel
中使用初始化函数:MyClass* _pObject; int myInit(void*, void*) { _pObject = new MyClass(...); // other initialization } int myFunction(...) { _pObject->doSomething(); // other operations }
这种方法中,全局对象的初始化发生在
KS_loadKernel
函数中。 -
使用
KS_loadKernel
和定位 new:MyClass _object; int myInit(void*, void*) { new (&_object) MyClass(...); // other initialization } int myFunction(...) { _object.doSomething(); // other operations }
这种方法通过定位 new 在已分配的内存上构造对象
_object
。
总的来说,在内核级或实时环境中,你可以很好地使用类和对象。不过,需要谨慎处理全局对象的初始化,确保不会影响实时性能或引入不必要的复杂性。
如果一个已经被标记为已信号的事件再次被标记为已信号会发生什么?
对一个已经被标记为已信号的事件再次进行标记将不会产生任何效果。
如果一个事件被标记为已信号,事件的消费者会自动通过消费事件来重置信号,如果这个事件是一个“自动重置事件”(默认情况)。
如果事件是通过使用标志 KSF_MANUAL_RESET 调用 KS_createEvent 创建的,则它不会成为一个“自动重置事件”。
在这种情况下,事件的消费不会重置信号,必须通过调用 KS_resetEvent 来完成这一操作。
这允许多个消费者对事件做出反应。
回调函数的原型应该是什么样子呢?
一般来说,回调函数的原型应该如下:
int __stdcall _myCallBack(void* pArgs, void* pContext);
其中:
pArgs
:是通过KS_createCallBack
函数提供的引用参数。pContext
:是依赖于信号事件的上下文参数。
如果上下文参数不需要,函数的原型可以简化为:
int __stdcall _myCallBack(void* pArgs);
在这种情况下,必须使用带有标志 KSF_NO_CONTEXT
调用 KS_createCallBack
函数,否则会错误地恢复堆栈,可能导致例如蓝屏等问题。
EtherNet、TCP、UDP
是否可以在共享的 IRQ 上使用实时以太网?
如果中断与其他硬件共享,通常就不能再称为实时中断了。
函数 KS_openAdapter
会报告 KSERROR_INTERRUPT_IS_SHARED
错误。
背景信息:
只有在 IRQ 可以独占保留的情况下,才能使用带有标志 KSF_REALTIME_EXEC
的网络适配器注册中断。
可能是一个 PCI 设备,并且相同的 IRQ 被其他设备使用,这将导致上述错误。
可以在 KS_openAdapter
调用中设置 KSF_FORCE_OVERRIDE
标志以强制使用实时中断。
然而,这可能会影响其他硬件/设备的中断服务例程,导致系统冻结或蓝屏。
由于为 PCI 卡保留特定的独占中断非常困难,基本上建议使用 PCI Express 硬件(PCIe)。
通过使用 PCIe,中断自动是独占的,因为使用了消息传送中断(MSI)。
因此,在桌面系统上使用 PCIe 卡或在笔记本电脑上使用 PCI ExpressCards 是首选而不是使用 PCI 硬件。
当调用 KS_openAdapter
时出现 KSERROR_INTERRUPT_IS_SHARED
错误,这是什么意思呢?
为了获得最大的实时性能,我们需要对硬件进行独占访问。
不幸的是,PCI 设备有能力共享 IRQ 线路,并且它们经常这样做。
您可以通过在 Windows 设备管理器中点击 ‘查看 → 按类型查看的资源’ 来查看使用的 IRQ。
您有几种解决这个问题的选项:
- 最好的方法是使用 PCIe(PCI Express)硬件,其中 IRQ 线路从不共享。
- 另一个好的解决方案是确保您的 PCI 硬件使用独占的 IRQ。要实现这一点并不容易,您可以尝试使用另一个 PCI 插槽,并希望主板为此插槽使用另一个 IRQ 线路,或者在某些 BIOS 中,您可以为特定的 PCI 插槽保留某些 IRQ。
- 第三个选项是不使用实时执行来打开适配器(即在
KS_openAdapter
中不使用KSF_REALTIME_EXEC
),并强制 EtherCAT 主控使用这样的适配器(使用KS_createEcatMaster
并带有KSF_FORCE_OVERRIDE
标志)。
在这种解决方案中,会丢失一些实时行为,但您能够打开主控,有时这对于测试目的已经足够好了。
最后一个选项是强制使用实时和共享 IRQ 来打开适配器,这是不推荐的,因为最常见的效果是您的计算机会完全无响应,唯一的解决方法是硬件重置。要这样做,您需要在 KS_openAdapter
中使用 KSF_REALTIME_EXEC
和 KSF_FORCE_OVERRIDE
标志。
有时这种方法会奏效,这取决于与哪些硬件共享 IRQ。
EtherCAT
有关于 KSERROR_APPLICATION_LAYER_ERROR
的更多信息吗?
是的,关于此错误码的额外信息包含在低 16 位中,它们的描述详见以下表格。
在调用 KS_createEcatMaster
出现错误 1F0F0000(KSERROR_MISSING_XML_INFORMATION)?
这个错误表示在提供的描述性 XML 文件中找不到与该从站匹配的条目,因此无法保证该从站已被充分识别和正确初始化。
要解决这个问题,请在调用 KS_createEcatMaster
时指定 XML 文件的路径。
如果您仍然希望在没有现有 XML 文件的情况下打开一个从站,可以在调用 KS_createSlave
或 KS_createSlaveIndirect
时指定 KSF_FORCE_OVERRIDE
标志。
在调用 KS_createEcatSlave
时出现错误 10190000(KSERROR_DEVICE_ALREADY_USED)?
当相同的 ID 和位置组合不明确时,KS_createEcatSlave
会报告 KSERROR_DEVICE_ALREADY_USED
错误。
ID 和位置的解释遵循以下规则:
- 当 ID = 0 且 position = 0 时:选择第一个符合供应商、产品和版本,并且尚未分配的从站。
- 当 ID = 0 且 position ≠ 0 时:忽略 ID,position 是从站的绝对位置。
- 当 ID ≠ 0 时:position 是相对于指定 ID 的端子的位置。
这些规则有助于确定从站的唯一性和正确的配置方式。
标签:Windows,常见,实时,问题解答,KS,Kithara,应用程序,KSERROR From: https://blog.csdn.net/EZCODETECH/article/details/140171614