建立公益诉讼连接使用目标
包
之前,您可以运行processor-in-the-loop(公益诉讼)模拟,必须设置模型之间的连接金宝app®和你的目标硬件。连通性使公益诉讼仿真:
构建目标应用程序。
下载、启动和停止应用程序在目标硬件。
金宝app支持模型和目标硬件之间的通信。金宝app
使用其中一种工作流。
工作流 | 什么时候使用 |
---|---|
目标 包和rtiostream API |
使用这个工作流目标应用程序如果你有大量I / O要求需要高带宽通信。 有关更多信息,请参见使用rtiostream API为公益诉讼目标连接。 |
目标 包和调试器 |
使用这个工作流如果:
有关更多信息,请参见使用调试器为公益诉讼目标连接。 |
使用rtiostream
API为公益诉讼目标连接
提供公益诉讼模型和目标之间的连接硬件,您可以使用金宝app目标计划
与rtiostream API。在这个例子中,您的开发计算机硬件是目标。
-
创建一个
target.Board
对象提供了MATLAB®与你的目标的描述硬件。hostTarget = target.create (“董事会”,…“名字”,“英特尔示例董事会”);
支持代金宝app码生成和数据I / O在公益诉讼的模拟,将对象与处理器连接,和沟通的描述。
-
副董事金宝app会的支持代码生成
target.Processor
对象,该对象包含一个语言实现。对于这个示例,创建一个target.Processor
对象和重用现有的target.LanguageImplementation
对象。为建立一个定制的信息target.LanguageImplementation
对象,看到注册新硬件设备。处理器= target.create (“处理器”,“名字”,“ExampleProcessor”);处理器。LanguageImplementations = target.get (“LanguageImplementation”,…“英特尔- x86 - 64 (Windows64)”);
关联
target.Board
对象与新target.Processor
通过使用对象处理器
财产hostTarget。处理器= processor;
-
创建一个对象,其中包含执行目标应用程序的详细信息。对象描述运行目标应用程序所需的工具在目标硬件。捕捉目标应用程序启动和停止系统命令,您可以使用
HostProcessExecutionTool
或SystemCommandExecutionTool
类。applicationExecution = target.create (“HostProcessExecutionTool”);applicationExecution。Name =“Windows应用程序”;
创建一个
命令
下载并运行目标应用程序对象。指定的字符串变量“(EXE)美元”
到字符串
财产持有者为目标应用程序名称,这是未知的,直到执行。runCommand = target.create (“命令”);runCommand。字符串=“(EXE)美元”;applicationExecution。StartCommand = runCommand;hostTarget.Tools。ExecutionTools = applicationExecution;
-
创建一个
CommunicationInterface
对象为目标硬件提供的通信通道和细节rtiostream API实现。使用:
运TCP / IP
rtiostream
实现源文件。一个
BuildDependencies
对象指定的rtiostream
API,编译的源文件与目标应用程序。一个
MainFunction
将参数传递给目标应用程序对象
审稿= target.create (“CommunicationInterface”);审稿。Name =“Windows TCP界面”;审稿。频道=“TCPChannel”;审稿。APIImplementations = target.create(“APIImplementation”,…“名字”,“x86 RTIOStream实现”);comms.APIImplementations。API = target.create (“API”,“名字”,“RTIO流”);comms.APIImplementations。BuildDependencies =target.create (“BuildDependencies”);comms.APIImplementations.BuildDependencies。源文件=…{fullfile (“(MATLAB_ROOT)美元”,…“工具箱”,…“编码器”,…“rtiostream”,…“src”,…“rtiostreamtcpip”,…“rtiostream_tcpip.c”)};comms.APIImplementations。MainFunction= target.create(“MainFunction”,…“名字”,TCP RtIOStream主要的);comms.APIImplementations.MainFunction。参数= {“利用”,' 1 ',“- port”,' 0 '};hostTarget。CommunicationInterfaces =审稿;
-
这一步是可选的。公益诉讼模拟使用的通信协议模型和目标硬件之间传输的数据。金宝app的
target.PILProtocol
类描述了协议的参数。对于这个示例,您可以提高目标运行时性能通过增加I / O协议使用的缓冲区大小。创建一个
target.PILProtocol
对象和I / O指定缓冲区大小。pilProtocol = target.create (“PILProtocol”);pilProtocol。Name =“Windows公益诉讼协议”;pilProtocol。下面的= 50000;pilProtocol。下面的= 50000;hostTarget。CommunicationProtocolStacks = pilProtocol;
如果你不执行这一步,违约
target.PILProtocol
使用值。 -
您可以配置一个公益诉讼模拟生产执行概要文件生成的代码。支持代金宝app码执行分析,您必须创建一个定时器对象描述检索当前时间从生成的代码运行在目标硬件。定时器对象描述必须包括的描述函数,检索时间和它的实现。
这个例子使用一个C函数,
timestamp_x86
,它返回当前时间uint64
数据类型。timerSignature = target.create (“函数”);timerSignature。Name =“timestamp_x86”;timerSignature。ReturnType =“uint64”;
在一个API对象捕捉功能。
timerApi = target.create (“API”);timerApi。函数s = timerSignature; timerApi.Language = target.Language.C; timerApi.Name =“Windows计时器API”;
获取函数的依赖关系,即源和运行功能所需的头文件。
timerDependencies = target.create (“BuildDependencies”);timerDependencies。IncludeFiles = {“host_timer_x86.h”};timerDependencies。IncludePaths = {“美元(MATLAB_ROOT) /工具箱/编码器/资料/ src”};timerDependencies。源文件= {“host_timer_x86.c”};
创建一个对象,结合API和依赖关系。
timerImplementation = target.create (“APIImplementation”);timerImplementation。API = timerApi;timerImplementation。BuildDependencies =timerDependencies; timerImplementation.Name =“Windows计时器实现”;
创建计时器对象,并将它与定时器信息。
计时器= target.create (“定时器”);计时器。APIImplementation = timerImplementation; timer.Name =“Windows计时器”;
计时器分配给处理器对象。
处理器。计时器=定时器;
-
前面的步骤中创建的目标对通信的硬件支持和运行目标应用程序。金宝app现在,建立开发计算机之间的连接和目标硬件通过创建一个
TargetConnection
对象。指定:通信通道,这是相同的频道中指定目标硬件通信接口——请参阅第4步。
连接属性。
董事会的目标,描述在前面的步骤中指定。
连接= target.create (“TargetConnection”);连接。Name =“主机进程连接”;连接。目标= hostTarget;连接。CommunicationChannel = target.create (“TCPChannel”);connection.CommunicationChannel。Name =“外部过程TCPCommunicationChannel”;connection.CommunicationChannel。IPAddress =“localhost”;connection.CommunicationChannel。端口=' 0 ';
-
在MATLAB注册连接,将目标硬件和连接信息添加到一个内部数据库使用
target.add
函数。默认情况下,这些信息仅用于当前MATLAB会话。登记跨MATLAB会话持久化,指定名称-值对“UserInstall”,真的
。target.add([hostTarget connection],“UserInstall”,真正的);
-
现在,您可以指定您的开发计算机作为公益诉讼的目标硬件模拟。在你运行一个公益诉讼仿真之前,在配置参数对话框中,设置硬件板来
例如英特尔董事会
。
使用调试器为公益诉讼目标连接
提供公益诉讼模型和目标之间的连接硬件,您可以使用金宝app目标计划
调试器,例如,GNU®调试器。
-
实现接口的类
myImplementationClass
。例如伪代码实现,明白了DebugIOTool模板。classdefmyImplementationClass < target.DebugIOTool属性(访问=私人)…结束方法…结束方法(访问=私人)…结束结束
-
创建
target.Board
对象为MATLAB提供的描述你的目标硬件。hostTarget = target.create (“董事会”,…“名字”,“GDB调试公益诉讼IO”);
-
副董事金宝app会的支持代码生成
target.Processor
对象,该对象包含一个语言实现。对于这个示例,创建一个target.Processor
对象和重用现有的target.LanguageImplementation
对象。为建立一个定制的信息target.LanguageImplementation
对象,看到注册新硬件设备。hostTarget。处理器= target.get(“处理器”,…“英特尔- x86 - 64(64年Linux)”);
-
创建一个
target.ExecutionService
对象引用调试器抽象接口。matlabExecution = target.create (“ExecutionService”,…“名字”,“GDB启动”);matlabExecution。APIImplementation =…target.create (“APIImplementation”,…“名字”,“myServiceImplementation”);matlabExecution.APIImplementation。BuildDependencies =…target.create (“MATLABDependencies”);matlabExecution.APIImplementation.BuildDependencies。类=…{“myImplementationClass”};matlabExecution.APIImplementation。API =…target.get (“API”,…“DebugIOTool”);
-
关联
target.ExecutionService
对象的target.Board
对象。hostTarget.Tools。DebugTools = matlabExecution;
-
董事会对象添加到一个内部数据库和跨MATLAB会话对象持久化。
target.add (hostTarget“UserInstall”,真正的);
-
在你运行一个公益诉讼仿真之前,在配置参数对话框中,设置硬件板来
GDB调试公益诉讼IO
。
DebugIOTool模板
本节提供了一个伪代码的例子target.DebugIOTool
调试器的抽象。使用一个target.DebugIOTool
对象:
控制在调试器中运行的应用程序的生命周期。
自动化常见的调试器的行为。例如,应用断点和继续执行从暂停状态。
读和写应用程序使用的内存。
对于交互调试器,您可以使用MATLAB语言外部接口api,该调试器供应商供应。
target.DebugIOTool 对象 |
评论 |
---|---|
classdefDebugIOToolTemplate < target.DebugIOTool
|
示例实现的 |
属性(访问=私人)DebuggerHandle;结束
|
可选的。 添加任何国家需要与调试器或应用程序在调试器中运行的财产 |
方法 |
执行调试器的方法实现交互。每个方法返回一个 |
函数这个= DebugIOToolTemplate ()结束 |
可选的。 构造函数的 执行基本的初始化。例如,调用设置状态 |
函数errFlag = open ()。DebuggerHandle = this.callExternalDebugger (“开放”);errFlag = false;结束 |
可选的。 添加逻辑在这里打开调试器。通常情况下,使用系统命令或外部API提供的调试器。 如果你不能打开调试器还没有加载应用程序调试器,不实现这个方法。使用 如果你不能打开调试器还没有开始执行应用程序,不实现这个方法。使用 |
函数errFlag = loadApplication(这)this.callExternalDebugger (装载应用程序的,…this.Application,…。this.ApplicationCommandLineArguments);this.callExternalDebugger (设置断点的,this.Breakpoints);errFlag = false;结束 |
可选的。 应用程序加载到调试器。 添加逻辑应用程序加载到调试器。例如,一个项目加载到一个IDE调试器或应用程序可执行文件加载到调试器利用。 也添加逻辑设置断点调试器中断执行。 的路径存储在应用程序文件 额外的命令行参数都存储在应用程序 断点设置存储在 如果你不能加载应用程序的应用程序还没有开始执行,不实现这个方法。实现的逻辑 |
函数errFlag = startApplication(这)this.callExternalDebugger (“启动应用程序”);errFlag = false;结束 |
必需的。 在调试器中启动应用程序执行。 添加逻辑来启动应用程序在调试器中执行。 应用程序的路径加载存储在 额外的命令行参数传递给应用程序存储在 断点设置存储在 |
函数errFlag = stopApplication(这)this.callExternalDebugger (“停止应用程序”);errFlag = false;结束 |
可选的。 停止应用程序在调试器中执行。 添加逻辑来停止应用程序在调试器中执行。 如果你的 如果你的 |
函数errFlag = unloadApplication(这)this.callExternalDebugger (卸载应用程序的);errFlag = false;结束 |
可选的。 卸载应用程序的调试器。 如果你实现了 如果你的 |
函数errFlag =关闭(这)this.callExternalDebugger (“关闭”);errFlag = false;结束 |
可选的。 关闭调试器。 添加逻辑关闭调试器。如果你实现了 |
函数[atBreakpoint, errFlag] =…stoppedAtBreakpoint(断点)结果= this.callExternalDebugger (“确定断点触”,…breakpoint.File,…breakpoint.Line,…breakpoint.Function);atBreakpoint = ~ isempty(结果);errFlag = false;结束 |
必需的。 问目前停在指定断点调试器。返回 添加逻辑来确定调试器打破了断点传递到函数的执行。 的 设置 |
函数errFlag = continueExecution(这)this.callExternalDebugger (“继续执行”);errFlag = false;结束 |
必需的。 如果应用程序暂停调试器继续执行。 |
函数errFlag =写(variableName, memoryStream) sizeOfMemoryVariable = uint64(元素个数(memoryStream));arrayFormat = repmat (“% d”,[1 sizeOfMemoryVariable]);arrayFormat(结束)= [];this.callExternalDebugger (sprintf ([“执行(void *) memcpy (% s。”…”(unsigned char [% d]) {% s}, % d) '),…variableName,…sizeOfMemoryVariable,…sprintf (arrayFormat memoryStream),…sizeOfMemoryVariable));errFlag = false;结束 |
写指定的内存流目标平台内存变量名。 添加逻辑来写
最小的可寻址整数变量代表一个指针类型。例如,写操作在目标平台上 (void *) memcpy (< variableName >、(unsigned char [< sizeOfMemoryStream >]) {< memoryStream (1) >, < memoryStream (2) >}, < sizeOfMemoryStream >); memcpy 方法写数据到变量。 |
函数[memoryStream, errFlag] =阅读(这一点,…variableName,…sizeToRead) memoryStream = this.callExternalDebugger (…sprintf (“读(unsigned char [% d]) * % s”,…sizeToRead variableName));memoryStream = uint64 (memoryStream);errFlag = false;结束 |
读取指定的内存流从目标平台内存变量名。 添加逻辑读的 的 最小的可寻址整数变量代表一个指针类型。这个C代码读取操作是等价的: < sizeToRead > (unsigned char []) * < variableName > |
结束
|
|
方法(访问=私人)函数变长度输入宗量输出= callExternalDebugger(~),输出= [];流(“\ nInstructed调试器' % s ' \ n”变长度输入宗量,{1});如果输入参数个数> 2 disp (的使用参数:);disp(变长度输入宗量(2:结束));结束结束结束 |
私有方法。 |
结束
|
|
classdefDebugIOToolTemplate < target.DebugIOTool% DEBUGIOTOOLTEMPLATE target.DebugIOTool的示例实现%调试器抽象。% 2020年版权MathWorks公司。属性(访问=私人)%可选%添加任何国家需要与调试器或交互%的应用程序在调试器中运行的财产% DebugIOTool。应用私人访问,因此只有这个文件%可以访问的状态。%%为例,国家可以处理调试器%应用程序调试器外部提供的API。DebuggerHandle;结束%执行调试器的方法实现交互。%每个方法将返回一个“errFlag”逻辑标记。如果方法%执行没有错误,“errFlag”设置为false。%认为还使用MATLAB的错误方法自定义报告%错误信息。方法% target.DebugIOTool构造函数。构造函数%创建工具允许它的方法的一个实例%的实例。可选的。函数这个= DebugIOToolTemplate ()%可以执行基本的初始化。例如%设置准备调用打开状态结束%打开调试器。可选的。函数errFlag = open ()%添加逻辑在这里打开调试器。通常情况下,使用系统%命令或外部API提供的调试器。%%如果你不能打开调试器还没有加载%的应用程序调试器,这种方法不应该%的逻辑应该执行实施% loadApplication的方法。%%如果你不能打开调试器还没有开始%的执行应用程序,这种方法不应该%的逻辑应该执行实施% startApplication的方法。这一点。DebuggerHandle = this.callExternalDebugger (“开放”);errFlag = false;结束%的应用程序加载到调试器。可选的。函数errFlag = loadApplication(这)%添加逻辑应用程序加载到调试器。%,这可能为一个IDE调试器或装载一个项目%利用应用程序可执行文件加载到调试器。%%另外添加逻辑在调试器中设置断点%中断执行。%%的路径加载存储在应用程序%的应用程序可以访问这个类的属性%使用这个。应用程序in this method.%%的额外的命令行参数传递应用程序存储在%% this.ApplicationCommandLineArguments。%%断点设置存储在this.Breakpoints%%如果你不能加载应用程序还没有开始%的执行应用程序,这种方法不应该%的逻辑应该执行实施% startApplication的方法。this.callExternalDebugger (装载应用程序的,…this.Application,…。this.ApplicationCommandLineArguments);this.callExternalDebugger (设置断点的,this.Breakpoints);errFlag = false;结束%在调试器中启动应用程序执行。必需的。函数errFlag = startApplication(这)%添加逻辑来启动应用程序执行的%调试器。%%的路径加载存储在应用程序%的应用程序可以访问这个类的属性%使用这个。应用程序in this method.%%额外的命令行参数传递给应用程序存储在%% this.ApplicationCommandLineArguments。%%断点设置存储在this.Breakpointsthis.callExternalDebugger (“启动应用程序”);errFlag = false;结束%停止应用程序在调试器中执行。可选的。函数errFlag = stopApplication(这)%添加逻辑来停止应用程序执行的%调试器。%如果你startApplication的方法打开调试器,%执行相反的操作,即关闭%调试器。%%如果startApplication的方法加载应用程序,%执行相反的操作,即卸载%从调试器应用程序。this.callExternalDebugger (“停止应用程序”);errFlag = false;结束%卸载应用程序的调试器。可选的。函数errFlag = unloadApplication(这)%,如果实施“loadApplication”方法,%然后添加逻辑卸载应用程序%调试器。%如果你loadApplication的方法打开调试器,%执行相反的操作,即关闭%调试器。this.callExternalDebugger (卸载应用程序的);errFlag = false;结束%关闭调试器。可选的。函数errFlag =关闭(这)%添加逻辑关闭调试器。如果你实现了%“开放”方法你应该实现这个方法。this.callExternalDebugger (“关闭”);errFlag = false;结束%问目前停在指定的调试器%断点。返回true,如果在指定断点,假的%。必需的。函数[atBreakpoint, errFlag] =…stoppedAtBreakpoint(断点)%添加逻辑来确定调试器执行了%在断点处传递到函数。%%的输入变量的类型是target.Breakpoint“断点”%提供断点的描述。它包含%属性函数,描述了文件和行%断点的位置。%%设置atBreakpoint如果调试器返回值为true%在断点处停止,如果没有或假。结果= this.callExternalDebugger (“确定断点触”,…breakpoint.File,…breakpoint.Line,…breakpoint.Function);atBreakpoint = ~ isempty(结果);errFlag = false;结束%如果应用程序执行暂停在继续执行%调试器。必需的。函数errFlag = continueExecution(这)this.callExternalDebugger (“继续执行”);errFlag = false;结束%写指定的内存流到目标平台内存%给指定的变量名。函数errFlag =写(variableName, memoryStream)%添加逻辑编写memoryStream variableName数据%变量在目标。这个函数应该假定%合适断点执行这样一个打击%的行动。%% memoryStream是一个矢量uint64值写入%的目标平台。unit64值作为容器%在目标平台上最小的可寻址的整数。在%的大多数情况下,这将是一个容器大小的字符%的目标平台,一般是8位。%%指定的变量将代表一个指针%最小的可寻址的整数类型。%作为例子写操作在目标平台上%字符代表最小的可寻址的整数%相当于以下memcpy C代码调用:%% (void *) memcpy (< variableName >,< sizeOfMemoryStream > % (unsigned char [])% {< memoryStream (1) >、< memoryStream (2) >,…},% < sizeOfMemoryStream >);%%的调试器允许时立即执行的代码%执行坏了,如果是这样的话,尝试使用上面的命令%写数据到变量如以下例子:sizeOfMemoryVariable = uint64(元素个数(memoryStream));arrayFormat = repmat (“% d”,[1 sizeOfMemoryVariable]);arrayFormat(结束)= [];this.callExternalDebugger (sprintf ([“执行(void *) memcpy (% s。”…”(unsigned char [% d]) {% s}, % d) '),…variableName,…sizeOfMemoryVariable,…sprintf (arrayFormat memoryStream),…sizeOfMemoryVariable));errFlag = false;结束%阅读指定的内存流目标平台的内存%由给定的变量名。函数[memoryStream, errFlag] =阅读(这一点,…variableName,…sizeToRead)%添加逻辑读从variableName变量%的目标。这个函数应该认为适当的%断点一直执行这样的操作。%% uint64 memoryStream返回值应该是一个向量的%值。unit64值作为最小的一个容器%在目标平台上可寻址的整数。在大多数情况下%,这将是一个容器大小的字符的目标%的平台,通常是8位。%%指定的变量将代表一个指针%最小的可寻址的整数类型。%读取操作应该equivilant检查结果%的C代码如下:% (unsigned char [< sizeToRead >]) * < variableName >%%的调试器允许时立即执行的代码%执行坏了,如果是这样的话,尝试使用上面的命令%检查缓冲区的值并返回MATLAB。memoryStream = this.callExternalDebugger (…sprintf (“读(unsigned char [% d]) * % s”,…sizeToRead variableName));%的内存流必须作为一个向量返回uint64%值memoryStream = uint64 (memoryStream);errFlag = false;结束结束方法(访问=私人)函数变长度输入宗量输出= callExternalDebugger(~),输出= [];流(“\ nInstructed调试器' % s ' \ n”变长度输入宗量,{1});如果输入参数个数> 2 disp (的使用参数:);disp(变长度输入宗量(2:结束));结束结束结束结束
另请参阅
相关的话题
MATLAB命令
你点击一个链接对应MATLAB命令:
运行该命令通过输入MATLAB命令窗口。Web浏览器不支持MATLAB命令。金宝app
你也可以从下面的列表中选择一个网站:
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。