Kithara RTS进程和QT 创建共享内存

首先找到官方示例,随便一个都行。我是后续需要用它的定时器所以选了这个。
我是在这个基础上面改的,就是把它前半部分抄了过来。

下面这一段就是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;
	}
  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Kithara Codesys是一种实时操作系统(RTOS)和编程环境,用于开发嵌入式控制应用程序。该软件是由德国Kithara Software开发的,旨在提供高性能和稳定性,以满足工业自动化和机器控制领域的需求。 Codesys是一种广泛使用的工业自动化开发环境,它提供了一个集成的开发工具和库,用于创建和管理PLC(可编程逻辑控制器)应用程序。而Kithara Codesys则是在Codesys基础上,结合了Kithara实时操作系统的特性和功能。 Kithara Codesys在实时性能方面表现出色,能够处理实时应用程序的严格时间要求。它提供了具有优先级调度的多任务支持,可以同时管理多个并发任务,并确保各个任务按照预定的时间间隔和优先级进行执行。这种实时性能是在Kithara实时操作系统的基础上实现的,它提供了低延迟的中断处理和实时任务调度,确保应用程序对外部输入的及时响应。 Kithara Codesys还具有灵活的硬件支持,支持多种不同的硬件平台和接口。它可以与各种专用硬件设备和传感器进行连接,并通过标准的PLC编程语言进行控制和通信。这使得开发人员可以根据自己的需求选择合适的硬件平台,以实现最佳的控制和自动化方案。 总的来说,Kithara Codesys是一种强大的嵌入式控制开发环境,结合了Codesys的功能和Kithara实时操作系统的实时性能。它在工业自动化领域有广泛的应用,能够满足各种复杂的控制需求,并提供稳定可靠的运行环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小加藤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值