首先找到官方示例,随便一个都行。我是后续需要用它的定时器所以选了这个。
下面这一段就是QT里面的内容,"Kernel.dll"这个dll根据具体工程来。
//1 启动Kithara,
int CRealTimeNetWork::onInitKitharaDriver()
{
Error ksError;
//1 打开驱动
ksError = KS_openDriver(
pCustomerNumber); // Customer number
if (ksError != KS_OK) {
return 1001;
}
2 加载内核
ksError = KS_loadKernel(
&hKernel, // Kernel handle
"Kernel.dll", // Name of DLL
NULL, // Name of init routine
NULL, // Init parameter (not used)
KSF_KERNEL_EXEC); // Flags, load where chosen
if (ksError != KS_OK) {
KS_closeDriver();
return 1002;
}
// 3 创建共享内存
ksError = KS_createSharedMemEx(&hShmEx, "ShareMem_UDP", sizeof(stUdpShareMem),0);// Flags - KSF_ALTERNATIVE | KSF_CONTINUOUS
if(ksError != KS_OK) {
KS_closeDriver();
return 1003;
}
ksError = KS_getSharedMemEx(hShmEx, (void **)&gpRSIShareMemUser, 0);
if(ksError != KS_OK) {
KS_closeDriver();
return 1004;
}
也可以通过以下方法创建
//ksError = KS_createSharedMem(
// (void**)&gpRSIShareMemUser, // Address of application pointer
// (void**)&pSysPtr, // Address of kernel pointer
// "ShareMem_UDP", // Name of shared memory area
// sizeof(stUdpShareMem), // Size of shared memory area
// 0); // Flags, here 0 (see manual)
//if (ksError != KS_OK) {
// KS_closeDriver();
// return 1003;
//}
//
//3.1 是否进行初始化
if (gpRSIShareMemUser->isShareMemInit == false)
{
KSRTL_memset(gpRSIShareMemUser, 0x00, sizeof(stUdpShareMem));
gpRSIShareMemUser->isShareMemInit = true;
gpRSIShareMemUser->testNum[2] = 2222;
gpRSIShareMemUser->isUdpIint = false;
}
//4.1 先执行初始化函数
ksError = KS_execKernelFunction(
hKernel, // Kernel handle
"_initFunction", // Name of routine
gpRSIShareMemUser,
NULL, // Context parameter (not used)
KSF_SAVE_FPU | KSF_KERNEL_EXEC
); // Flags where to call
if (ksError != KS_OK)
{
KS_closeDriver();
return 1005;
}
//4 创建函数回调
ksError = KS_createKernelCallBack(
&hCallBack, // Address of callback handle
hKernel, // Kernel DLL handle
"_timerCallBack", // Name of callback function
pSysPtr, // Reference parameter to the callback
KSF_DIRECT_EXEC, // Flags, here kernel level
16); // Priority, only used on Ring3 // Priority
if (ksError != KS_OK)
{
KS_closeDriver();
return 1006;
}
//6 输出返回值
return 0;
}
然后剩下的是dll里面的函数,注意函数的名字比较关键_initFunction,在上面代码中KS_execKernelFunction函数得需要。
//内核层共享内存指针
stUdpShareMem* gpShareMemKernel = NULL;
uint _globalCounter;
Error ksError; //错误标志位
extern "C" __declspec(dllexport) Error __stdcall _initFunction(void* pArgs, void* pContext) {
KSHandle hShareMem_KUKARSI2;
//1 创建共享内存
KS_printK("%s", "进入初始化函数:KS_createSharedMemEx");
ksError = KS_createSharedMemEx(&hShareMem_KUKARSI2,
"ShareMem_UDP",
sizeof(stUdpShareMem),
0
//0
);
if (ksError != KS_OK)
{
KS_printK("WHT: KS_createSharedMem Error:%lld", ksError);
}
//2 获取共享内存地址KSF_REALTIME_EXEC
ksError = KS_getSharedMemEx(hShareMem_KUKARSI2, (void**)&gpShareMemKernel, KSF_KERNEL_EXEC);
if (ksError != KS_OK)
{
KS_printK("WHT: KS_getSharedMemEx Error");
}
//3 如果没有初始化,则进行初始化
if (gpShareMemKernel->isShareMemInit == false)
{
KSRTL_memset(gpShareMemKernel, 0x00, sizeof(stUdpShareMem));
gpShareMemKernel->isShareMemInit = true;
}
gpShareMemKernel->testNum[2] = 3333;
return KS_OK;
}
后面可以在创建一个别的东西,或者在这个init里面进行对数据的操作,看看可不可以就可以了。
注意:如果在QT上面发现数据对不上,在引头文件的时候,要注意字节对齐
#pragma pack(push,1)
#include "..\RealTimeCallBack.h"
#pragma pack(pop)
这个是我的头文件
#include "..\_KitharaSmp\_KitharaSmp.h"
//--------------------------------------------------------------------------------------------------------------
// This is a user defined argument structure to the callback routine.
// You are free to define your own arguments in any record/class.
//--------------------------------------------------------------------------------------------------------------
struct stUdpShareMem {
//1 通信句柄
bool isShareMemInit; //共享内存是否初始化完成,应该是Motion先处理,然后用
uint counter_;
KSHandle hEvent_;
uint finished_;
int64 testNum[3]; //测试数据
bool isUdpIint; //是否初始化完成
KSSocketAddr remoteAddr; //远程地址
KSHandle hSocket; //通信用socket句柄
};
注意:程序结束一定要释放你创建的东西,如果不幸程序没正常退出,恭喜你得需要关机重启嘻嘻嘻!
//------------------------------------------------------------------------------------------------------------
// Remove callbacks.
//------------------------------------------------------------------------------------------------------------
ksError = KS_removeCallBack(
hCallBack); // Callback handle
if (ksError != KS_OK)
{
return 9007;
}
//------------------------------------------------------------------------------------------------------------
// Remove the shared memory
//------------------------------------------------------------------------------------------------------------
/* ksError = KS_freeSharedMem(
gpRSIShareMemUser); */ // Application pointer
ksError = KS_freeSharedMemEx(hShmEx, 0);
if (ksError != KS_OK) {
//outputErr(ksError, "KS_freeSharedMemEx", "Unable to remove shared memory!");
return 9008;
}
//------------------------------------------------------------------------------------------------------------
// Unload the Kernel
//-----------------------------------------------------------------------------------------------------------
ksError = KS_freeKernel(
hKernel); // Kernel DLL handle
if (ksError != KS_OK)
return 9009;
//------------------------------------------------------------------------------------------------------------
// At last we have to close the driver to free any allocated resources.
//------------------------------------------------------------------------------------------------------------
ksError = KS_closeDriver();
if (ksError != KS_OK)
{
return 9010;
}