自定义XCP的从属软件

Simulink的XCP通信协议万博1manbetx®外部模式模拟是主从通信协议。默认情况下,该软件支持XCP外部模式模拟:万博1manbetx

如果定制目标硬件的系统目标文件来自ERT或GRT系统目标文件,则可以使用提供的api来提供XCP目标连接。XCP外部模式限制应用。

外部模式目标连接软件包括:

  • 外部模式抽象层

  • XCP从协议层

  • XCP从传输层

  • XCP平台抽象层

外部模式抽象层

到外部模式模拟期间使用Simulink通万博1manbetx信,目标应用程序必须从外部模式抽象层调用功能。

源代码文件的父文件夹为:

matlabroot\工具箱\编码器\ xcp \ src \ \ ext_mode目标

该层的API中声明包括\ ext_mode.h和实施src \ xcp_ext_mode.c

到使用Simulink,由外部模式抽象层万博1manbetx露出的目标应用程序使用的服务进行通信。该流程图显示了所需的目标应用程序的步骤,以建立与通信的Simulink。万博1manbetx

该表列出的功能,你的目标应用程序必须在每个阶段调用。

阶段 功能 目的

初始化

extmodeParseArgs

提取外部模式命令行参数。

型号名称_初始化

初始化生成的仿真模型的代码。万博1manbetx

extmodeInit

初始化外部模式的目标连接。

HOST START REQUEST

extmodeWaitForHostRequest

等待开发的计算机,这是当你点击运行按钮创建一个启动请求。

运行

型号名称_步

运行生成的Simulink模型代码的单个步骤。万博1manbetx

extmodeEvent

对于模型的采样时间ID,将模型阶跃函数生成的信号采样,并将数据包内容传递到通信协议的传输层,传输到开发计算机。

extmodeBackgroundRun

发送和接收由根据选择的通信协议的物理通信接口和处理数据包的内容分组。

HOST STOP请求或模拟COMPLETE

extmodeStopRequested

检查是否从开发计算机上的模式收到停止外部模式模拟的请求。当您单击停止按钮创建的请求。

extmodeSimulationComplete

检查生成的模型代码的执行是否完成。
重启

型号名称_terminate

终止生成仿真模型的代码。万博1manbetx

extmodeReset

重置外部模式的目标连接到初始状态。

这个伪代码示例展示了如何在目标应用程序中实现各个流程图阶段。在运行阶段,外部模式运行时环境至少需要两个线程:

  • 周期性线程负责生成的模型代码的执行。

  • 后台线程负责运行外部模式通信栈以及发送和接收分组。

伪代码会模拟运行多线程periodicThreadextmodeBackgroundRun顺序地在相同的而()循环。

/ * -------------伪码示例------------- * / / *定义周期性的螺纹* /空periodicThread(无效){/ *执行命令模型阶跃函数* /型号名称_步();/ *通知外部模式抽象层大约定期事件* / extmodeEvent(PERIODIC_EVENT_ID,currentSimulationTime);} / *对目标应用* /主主要功能(INT的argc,字符* argv的[]){/ * ------------- ------------ INITIALIZE-  * / / *解析外部模式命令行参数* / extmodeParseArgs(的argc,argv的);/ *初始化模式* /型号名称_初始化();/ *初始化外部模式的目标连接* / extmodeInit(extModeInfo,finalSimulationTime);/ * ------------- HOST START REQUEST ------------- * / / *等待直到开始请求从开发计算机* / extmodeWaitForHostRequest(EXTMODE_WAIT_FOREVER接收);/ * ------- HOST STOP请求或模拟COMPLETE ------- * / / *当模拟是不完整的,停止要求的情况下* /时(!extmodeSimulationComplete()&&!extmodeStopRequested()){/ * ------------- ------------- RUN * / periodicThread();extmodeBackgroundRun();} / * ------------- ------------- RESET * / / *终止模型* /型号名称_terminate ();/*重置外部模式目标连接*/ extmodeReset();返回0;}

要查看调用函数的代码,完成示例外部模式模拟利用XCP通信系统目标文件调成ert.tlc。然后,从代码生成文件夹中打开ert_main.c

XCP从协议层

XCP从协议层根据自动化和测量系统(ASAM)标准化协会标准(ASAM MCD-1 XCP)解释XCP命令和数据。

源代码文件夹是:

matlabroot\工具箱\编码器\ XCP \ SRC \目标\从属\协议\ SRC
在外部模式模拟中,构建流程自动将所需的文件添加到构建信息对象

XCP从传输层

的XCP从传输层发送和根据ASAM规格从通信介质接收消息。

源文件夹是:

matlabroot\工具箱\编码器\ XCP \ SRC \目标\从属\运输\ SRC
在外部模式模拟中,构建流程自动将所需的文件添加到构建信息对象

XCP平台抽象层

XCP平台抽象层提供:

对于定制示例,请参阅创建自定义抽象层

XCP驱动程序

XCP驱动程序通过通信通道发送和接收XCP消息。在外部模式模拟中,构建过程自动将驱动程序文件添加到构建信息对象中。

该XCP驱动程序是基于rtiostreamAPI。例如,基于主机的外部模式模拟使用这些rtiostream文件:

  • matlabroot\工具箱\编码器\ rtiostream的\ src \ rtiostreamtcpip.c

  • matlabroot\工具箱\编码器\ rtiostream的\ src \ rtiostream_serial.c

有关实现和测试rtiostream通信通道,请参阅:

对于自定义平台抽象层,必须添加rtiostream文件到构建信息对象。对于一个示例,请参见创建自定义抽象层

内存分配器

该XCP从属软件需要可变大小的动态分配时,连续的存储块,以保持内部数据结构。

在外部模式下的模拟,生成过程自动添加内存分配器文件到构建信息对象。

xcpMemBlockSizesxcpMemBlockCounts预处理宏定义的内存分配。

默认存储器分配器可以分配和释放多达16个不同组的存储块。对于每一组,可以在编译期间覆盖默认分配。您可以指定:

  • 通过块大小XCP_MEM_BLOCK_N_尺寸预处理器宏。

  • 块的每一组通过数XCP_MEM_BLOCK_N_数预处理器宏。

例如,这些预处理宏创建的64个字节的四个块和256个字节的八个块。

的#define XCP_MEM_BLOCK_1_SIZE 64的#define XCP_MEM_BLOCK_1_NUMBER 4#定义XCP_MEM_BLOCK_2_SIZE 256的#define XCP_MEM_BLOCK_2_NUMBER 8

配置不同组的升序排列的块大小:

XCP_MEM_BLOCK_N_尺寸<XCP_MEM_BLOCK_N+ 1_SIZE

最小的块大小,XCP_MEM_BLOCK_1_SIZE,必须大到足以容纳一个指针。

方法为内存分配器配置对齐方式XCP_MEM_ALIGNMENT预处理器宏。例如:

#定义XCP_MEM_ALIGNMENT 8

其他平台抽象层功能

此文件定义了平台抽象层的界面:

matlabroot\工具箱\编码器\ XCP \ SRC \目标\从属\平台\包括\ xcp_platform.h
要实现自定义平台抽象层功能,添加XCP_CUSTOM_PLATFORM编译信息对象的预处理器宏。在命名的文件中提供自定义功能的实现xcp_platform_custom.h。如果你没有定义XCP_CUSTOM_PLATFORM,构建过程使用默认文件支持的Linux万博1manbetx®和Windows®系统。

此表描述了必须为部署在目标硬件上的XCP从软件提供的功能。

功能 细节

互斥

要访问系统数据结构互斥万博1manbetx支持,XCP驱动程序取决于其定义,初始化,锁定和解锁基本的API。

要为目万博1manbetx标硬件支持互斥,请提供自定义实现。

Linux和Windows的默认实现支持互斥。万博1manbetx

如果定义(_WIN32) |定义(剩余win32__) ||定义(WIN32)…定义XCP_MUTEX_INIT(lock)锁= CreateMutex(0, FALSE, 0)# include < pthread。定义XCP_MUTEX_INIT(&(lock), NULL)定义XCP_MUTEX_LOCK(&(lock)) pthread_mutex_lock(&(lock)))# endif

睡眠

提供一个sleep API,使调用线程处于睡眠状态,直到经过指定的时间。Linux和Windows系统的默认实现是:

如果定义(_WIN32) |定义(剩余win32__) ||定义(WIN32)…#define XCP_SLEEP(seconds,microseconds) Sleep((seconds) * 1000 \ + (((microseconds) + 1000 - 1) / 1000)) #else ... #if _POSIX_C_SOURCE >= 199309L #define XCP_SLEEP(seconds,microseconds) do {struct timespec t;\ t.tv_sec = seconds; t.tv_nsec = microseconds * 1000; nanosleep(&t, NULL);} while(0) #else /* nanosleep is not available. Use select instead. */ #define XCP_SLEEP(seconds,microseconds) do {struct timeval t; t.tv_sec = seconds;\ t.tv_usec = microseconds; select(0, NULL, NULL, NULL, &t);} while(0) #endif /* _POSIX_C_SOURCE >= 199309L */ ... #endif

记录

要生成诊断消息时,XCP从软件需要自定义打印API,通过目标硬件提供支持日志记录服务。万博1manbetx如果没有定义XCP_PRINTF预处理宏,默认的实现是空的。

地址转换

的XCP标准表达变量的地址在存储器中作为一个8位扩展的32位地址。

XCP主程序通过解析构建过程创建的调试信息来提取信号和模型参数的地址。调试信息采用DWARF或PDB格式。

所述XCP万事达通过发送包含参数的XCP命令请求访问参数和信号addressExtension地址

什么时候addressExtension地址信息由所述目标硬件接收,则XCP从属必须将地址转换成在所述目标硬件存储器中的变量的位置。可变位置由加载分配,并且目标特异性。

使用XCP_ADDRESS_GET()宏指定转换逻辑。Linux和Windows系统的默认实现是:

的#if定义(__ MINGW32__)||定义(__ MINGW64__)的#define XCP_ADDRESS_GET(addressExtension,地址)\(uint8_T *)((uintptr_t的)地址)的#else的#define XCP_ADDRESS_GET(addressExtension,地址)\(uint8_T *)((地址)+(uint8_T *)&__基址)#万一
目前,只有32位硬件架构支持,所以万博1manbetxaddressExtension是0。

设置和复制存储

可以指定复制内存和设置内存操作的优化版本。

如果没有定义XCP_MEMCPYXCP_MEMSET预处理宏,默认实现指定标准的C函数,memcpymemset的

定义了XCP_MEMSET

解析命令行参数

如果你的目标硬件不支持的命令行参数解析,定义了预处理宏万博1manbetxEXTMODE_DISABLE_ARGS_PROCESSING

更换-w选项,您可以使用此命令来指定目标应用程序进入并保持等待状态,直到它收到来自Simulink的连接消息:万博1manbetx

set_param(型号名称, 'OnTargetWaitForStart', '上');
构建过程提供所需的选项(-DON_TARGET_WAIT_FOR_START = 1)给编译器。

创建自定义抽象层

对于构建过程中,您可以定义创建自定义平台抽象层后的代码生成命令。

  1. 指定头文件xcp_platform_custom.h。此Linux示例定义了所需的功能。

    的#ifndef XCP_PLATFORM_CUSTOM_H的#define XCP_PLATFORM_CUSTOM_H / * XCP_ADDRESS_GET * /#包括中的#define XCP_ADDRESS_GET(addressExtension,地址)(uint8_T *)((uintptr_t的)地址)/ * * XCP_MUTEX /#包括的#defineXCP_MUTEX_DEFINE(锁)pthread_mutex_t锁的#define XCP_MUTEX_INIT(锁)调用pthread_mutex_init(&(锁定),NULL)的#define XCP_MUTEX_LOCK(锁定)的pthread_mutex_lock(&(锁定))的#define XCP_MUTEX_UNLOCK(锁)调用pthread_mutex_unlock(&(锁定))/ * XCP_SLEEP* /#包括在中/ * gettimeofday的* /#如果_POSIX_C_SOURCE> = 199309L的#include 中/ *为了nanosleep * / #else伪的#include #包括在 /* for select */ #endif /* _POSIX_C_SOURCE >= 199309L */ #if _POSIX_C_SOURCE >= 199309L #define XCP_SLEEP(seconds,microseconds) do {struct timespec t;\ t.tv_sec = seconds; t.tv_nsec = microseconds * 1000; nanosleep(&t, NULL);} while(0) #else /* nanosleep is not available. Use select instead. */ #define XCP_SLEEP(seconds,microseconds) do {struct timeval t; t.tv_sec = seconds;\ t.tv_usec = microseconds; select(0, NULL, NULL, NULL, &t);} while(0) #endif /* _POSIX_C_SOURCE >= 199309L */ #endif

  2. 定义后的代码生成命令。

    功能myXCPTargetPostCodeGenCommand buildInfo buildInfo.addDefines (“-DXCP_CUSTOM_PLATFORM”,'OPTS');%配置默认的内存分配器buildInfo.addDefines('-DXCP_MEM_BLOCK_1_SIZE = 64','OPTS');buildInfo.addDefines('-DXCP_MEM_BLOCK_1_NUMBER = 46','OPTS');buildInfo.addDefines(“-DXCP_MEM_BLOCK_2_SIZE = 256”,'OPTS');buildInfo.addDefines('-DXCP_MEM_BLOCK_2_NUMBER = 10','OPTS');%添加我的rtiostreambuildInfo.addSourceFiles (customRtIOStreamFileNamecustomRtIOStreamSrcPath);%如果目标硬件不支持命令解析万博1manbetx%行参数buildInfo.addDefines('-DEXTMODE_DISABLE_ARGS_PROCESSING','OPTS');结束

也可以看看

|||||||||

相关话题

外部网站