当前位置: 首页 > article >正文

【BaseFunctions】- KRTS C++示例精讲(1)

BaseFunctions 示例讲解


目录

    • BaseFunctions 示例讲解
      • 打开项目
      • 结构说明
      • 代码讲解


这是第一篇关于KRTS代码精讲,这里面会提及一些关于KRTS相关概念,详细说明可以查看 KRTS快速入门。

打开项目

默认安装位置:【C:\Program Files\Kithara\RealTime Suite Demo\smp】,smp文件夹中。

  1. 打开对应目录文件夹;
  2. 使用【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);
}


http://www.kler.cn/a/448897.html

相关文章:

  • Cline 3.0发布:从AI编程助手到通用智能体平台的进化
  • Docker搭建YesPlayMusic云音乐播放器并实现异地远程连接播放歌曲
  • LeetCode2108 找出数组中的第一个回文字符串
  • docker 部署win系统
  • 天融信网络架构安全实践
  • 从零开始k8s-部署篇
  • 负载均衡式在线OJ
  • Python中的元类
  • 新版Android Studio 2024.1.2版本,如何通过无线wifi连接手机实现交互
  • 代码随想录 day50 第十一章 图论part01
  • 富唯智能 3D 视觉定位:为汽车零部件制造注入高效精准 “源动力”
  • GA-BP回归-遗传算法(Genetic Algorithm)和反向传播神经网络(Backpropagation Neural Network)
  • Zookeeper的监听机制
  • 软件测试丨性能测试工具-JMeter
  • 云手机方案全解析
  • C# 中串口读取问题及解决方案
  • Qt 给App创建自定义帮助文档
  • 【落羽的落羽 C语言篇】自定义类型——结构体
  • 【专题】2024年悦己生活消费洞察报告汇总PDF洞察(附原数据表)
  • 【java基础系列】实现数字的首位交换算法