【BaseFunctions】- KRTS C++示例精讲(1)
BaseFunctions 示例讲解
目录
- BaseFunctions 示例讲解
- 打开项目
- 结构说明
- 代码讲解
这是第一篇关于KRTS代码精讲,这里面会提及一些关于KRTS相关概念,详细说明可以查看 KRTS快速入门。
打开项目
默认安装位置:【C:\Program Files\Kithara\RealTime Suite Demo\smp】,smp文件夹中。
- 打开对应目录文件夹;
- 使用【Visual Studio 2022】打开C++项目的示例;
– ps: 根据安装的IDE版本自行选择对应的项目
结构说明
- _KitharaSmp.h : KRTS封装的一些通用函数,其中 【runSample()】函数是封装的main入口;
- _KitharaSmp.cpp : 通用函数的实现;
- KrtsDemo.h : KRTS开发的库的头文件,这里根据不同用户可能有所不同,DEMO版本为KrtsDemo.h 文件;
- ··Kithara.cpp : KRTS内核层日志打印,想要在内核中打印输出,需要依赖该文件,将此文件加入项目即可,查看打印输出需要使用【ktrace.exe】;
ps: ktrace.exe使用方法,启动KRTS程序之前,先打开此软件,进行监听。 - BaseFunctions.cpp : 项目源码
代码讲解
/* Copyright (c) 2004-2024 by Kithara Software GmbH. All rights reserved. */
//##############################################################################################################
//
// 文件: BaseFunctions.cpp
//
// 使用模块: Base Module
//
// 描述: 使用基础模块通用功能的示例应用程序
//
// 创建: r.hal 2004-07-02
//
//##############################################################################################################
/*=====================================================================*\
| *** 免责声明 *** |
| |
| 本代码仅是示例程序,您可以随意使用,我们不承担任何法律责任! |
| |
\*=====================================================================*/
//##############################################################################################################
//
// 目的:
// 1. 这个简单的例子展示了基础模块中一些常用函数的使用。
// 2. 可以查询正在使用的驱动程序的名称和版本。
// 3. 可以向错误处理系统添加自己的错误代码。
//
//##############################################################################################################
#include "../_KitharaSmp/_KitharaSmp.h"
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
// 别忘了输入你的序列号、6位客户编号,这是打开驱动程序所必需的。
//
// 如果你使用Demo版本,也可以使用“DEMO”代替。
// 如果你使用Beta版本,也可以使用“BETA”代替。
//
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 如上说所,定义的客户号
const char _pCustomerNumber[] = "DEMO";
// showVersion() 显示版本号,转换为'Kithara风格'。 它在这个文件的末尾定义。
void showVersion(uint version);
// 主程序入口
void runSample() {
// 调用KitharaSmp.h 中的函数,输出文本
outputTxt("***** Kithara example program 'BaseFunctions' *****");
// 错误码定义,KSError 是 Kithara API 所有函数的返回类型,通过 【KSError】 可以查询接口的返回错误信息。
KSError ksError;
//------------------------------------------------------------------------------------------------------------
// 打开驱动程序的第一步,所有KRTS程序必须进行的操作。
// 只要该函数调用成功后,我们可以使用其他函数。如果打开失败,则无法调用其他函数。
// 此函数接受您的客户编号作为参数,其中包含 Kithara(如果适用可以为“DEMO”或“BETA”)。
//------------------------------------------------------------------------------------------------------------
ksError = KS_openDriver(
_pCustomerNumber); // 客户编号
if (ksError != KS_OK) {
outputErr(ksError, "KS_openDriver", "Unable to open the driver!");
return;
}
// 查询驱动名称
char pBuf[32];
ksError = KS_getDriverConfig(
"", // 使用模块名称访问getConfig
// 为所选模块的功能
// 使用空字符串访问基础模块
KSCONFIG_DRIVER_NAME, // 配置类型
pBuf); // 配置数据缓冲区
if (ksError != KS_OK) {
outputErr(ksError, "KS_getDriverConfig", "Unable to get driver configuration.");
KS_closeDriver();
return;
}
outputTxt(" ");
outputTxt("You are using the driver \'", false);
outputTxt(pBuf, false);
outputTxt("\'");
// 查询驱动程序和系统详细信息。
KSSystemInformation systemInfo; // 系统信息承接的结构体,结构体中有CPU、Dll、系统等信息
systemInfo.structSize = sizeof(KSSystemInformation); // 不要忘记初始化structSize!
// 获取系统信息
ksError = KS_getSystemInformation(
&systemInfo, // 返回数据的地址
KSF_NO_FLAGS); // 未使用
if (ksError != KS_OK) {
outputErr(ksError, "KS_getSystemInformation", "Unable to get system information.");
KS_closeDriver();
return;
}
// 获取驱动版本
uint driverVersion = 0;
ksError = KS_getDriverVersion(
&driverVersion); // 要写入版本号的地址
if (ksError != KS_OK)
outputErr(ksError, "KS_getDriverVersion", "Unable to get the driver version.");
else {
outputTxt("Driver version : ", false);
// 显示版本信息
showVersion(driverVersion);
}
// 查询信息的输出展示
// DLL和SYS的版本号应该相同!
if (systemInfo.dllBuildNumber == systemInfo.sysBuildNumber) {
outputDec(systemInfo.dllBuildNumber, "Driver build number: ");
}
else {
outputTxt("Build number of the DLL and SYS file are different!");
// 调用KitharaSmp.h 中的函数,十进制输出
outputDec(systemInfo.dllBuildNumber, "DLL file build number: ");
outputDec(systemInfo.sysBuildNumber, "SYS file build number: ");
}
outputTxt(" ");
outputTxt("DLL file location : ", false);
outputTxt(systemInfo.pDllPath);
outputTxt("DLL file version : ", false);
showVersion(systemInfo.dllVersion);
outputTxt("SYS file location : ", false);
outputTxt(systemInfo.pSysPath);
outputTxt("SYS file version : ", false);
showVersion(systemInfo.sysVersion);
outputTxt(" ");
// 调用KitharaSmp.h 中的函数,布尔类型输出
outputBool(systemInfo.isLogVersion, "Log-version status : ");
outputBool(systemInfo.isStableVersion, "Stable-version status : ");
outputBool(systemInfo.isDll64Bit, "DLL is a 64-bit version: ");
outputBool(systemInfo.isSys64Bit, "SYS is a 64-bit version: ");
outputTxt(" ");
outputTxt("Operating system details:");
outputTxt("Name : ", false);
outputTxt(systemInfo.pSystemName);
outputTxt("Version : ", false);
// 调用KitharaSmp.h 中的函数,四位十六进制类型输出
outputHex04(systemInfo.systemVersion);
outputTxt("Service pack: ", false);
outputTxt(systemInfo.pServicePack);
outputTxt(" ");
outputDec(systemInfo.numberOfCPUs, "Total number of CPUs: ");
outputDec(systemInfo.numberOfSharedCPUs, "Number of CPUs shared by Windows and RealTime: ");
outputDec(systemInfo.numberOfCPUs - systemInfo.numberOfSharedCPUs, "Number of available dedicated CPUs: ");
outputDec(systemInfo.kiloBytesOfRAM, "Size of physical RAM in KB: ");
outputTxt(" ");
//------------------------------------------------------------------------------------------------------------
// 下面的代码显示了如何添加带有说明的自定义错误代码。
//------------------------------------------------------------------------------------------------------------
// 自定义的错误代码ID
KSError myErrorCode = KSERROR_CATEGORY_USER + 0x00770000;
// 添加错误描述
ksError = KS_addErrorString(
myErrorCode, // 错误码
"KSERROR_MY_ERROR_CODE", // 自定义的错误描述
KSLNG_DEFAULT); // 默认配置
if (ksError != KS_OK)
outputErr(ksError, "KS_addErrorString", "Unable to add error string.");
//------------------------------------------------------------------------------------------------------------
// 查询新错误消息的错误信息。KRTS接口返回的错误也可以使用该函数进行查询
//------------------------------------------------------------------------------------------------------------
const char* pErrorString;
ksError = KS_getErrorString(
myErrorCode, // 错误码
&pErrorString, // 返回错误文本
KSLNG_DEFAULT); // 默认英文文本
if (ksError != KS_OK)
outputErr(ksError, "KS_getErrorString", "Unable to get error string."); // 调用KitharaSmp.h 中的函数,错误信息输出
//------------------------------------------------------------------------------------------------------------
// KS_getErrorString()将错误的错误字符串作为常量字符串存储。
// 如果要更改错误字符串,请使用KS_getErrorStringEx(),它将复制将错误字符串写入用户缓冲区。
//------------------------------------------------------------------------------------------------------------
outputHex08(myErrorCode, "User error code ", " = '", false);
outputTxt(pErrorString, false);
outputTxt("'");
// 通用的错误输出方式同样适用于新创建的错误。
outputErr(myErrorCode, "KS_addErrorString test", "New error type, generated by customer.");
outputTxt(" ");
// 最后,必须关闭驱动程序以释放分配的资源。
ksError = KS_closeDriver();
if (ksError != KS_OK)
outputErr(ksError, "KS_closeDriver", "Unable to close the driver!");
// 等待一会,保证资源全部释放
waitTime(500 * ms);
outputTxt(" ");
outputTxt("End of program 'BaseFunctions'.");
}
//--------------------------------------------------------------------------------------------------------------
// showVersion()显示版本号,转换为“Kithara风格”。
//--------------------------------------------------------------------------------------------------------------
void showVersion(uint version) {
uint major = (version >> 12) & 0x0f;
uint minor = (version >> 4) & 0xff;
char pLetter[2] = " ";
pLetter[0] = " abcdefghijklmno"[version & 0x0f];
outputDec(major, "", ".", false);
outputHex02(minor, "", "", false);
outputTxt(pLetter);
}