Simulink的XCP通信协议金宝app®外部模式仿真是一个主从通信协议。默认情况下,软件支持XCP外部模式模拟:金宝app
在您的开发计算机上,用于使用ERT生成的代码(ert.tlc.
)和grt(GRT.TLC.
)系统目标文件。
为了一些支持包金宝app.
如果自定义目标硬件的系统目标文件从erct或GRT系统目标文件派生,则可以使用提供的API来提供XCP目标连接。XCP外部模式限制申请。
外部模式目标连接软件包括:
外模抽象层
XCP从站协议层
XCP奴隶传输层
XCP平台抽象层
要在外部模式仿真期间与Simulink通金宝app信,您的目标应用程序必须从外部模式抽象层调用功能。
源代码文件的父文件夹是:
matlabroot.\ toolbox \ coder \ xcp \ src \ target \ ext_mode
层API被声明包括\ ext_mode.h.
和实现src \ xcp_ext_mode.c
.
要与Simulink通信,目标应用程序使金宝app用外部模式抽象层公开的服务。此流程图显示了与Simulink建立通信所需的目标应用程序步骤。金宝app
该表列出了目标应用程序在每个阶段必须调用的函数。
阶段 | 功能 | 目的 |
---|---|---|
|
提取外部模式命令行参数。 | |
|
初始化生成的Simulink模型代码。金宝app | |
初始化外部模式目标连接。 | ||
|
等待开发计算机的启动请求,当单击“运行”按钮时会创建。 | |
|
|
运行生成的Simulink模型代码的单步。金宝app |
对于模型的采样时间ID,由模型阶跃函数生成采样信号,并将数据包内容传递给通信协议的传输层,传输给开发计算机。 |
||
根据所选通信协议从物理通信接口发送和接收分组和处理分组内容。 |
||
主机停止请求或模拟完成 |
检查是否从开发计算机上的模型接收到停止停止外部模式仿真的请求。单击“停止”按钮时会创建请求。 |
|
检查是否完成生成的模型代码的执行。 | ||
重启 |
|
终止生成的Simulink模型代码。金宝app |
重置外部模式目标连接到初始状态。 |
此伪代码示例显示了如何在目标应用程序中实现各种流程图阶段。在此期间运行
阶段,外部模式运行时环境需要至少两个线程:
负责执行生成的模型代码的周期性线程。
负责运行外部模式通信堆栈和发送和接收数据包的后台线程。
伪代码通过运行模拟多线程定期萎缩
和extmodebackgroundrun.
顺序内相同尽管()
环形。
/ * -------------伪代码示例------------- * // *定期周期性线程* / void定期分阶段(void){/ *运行模型步函数* /型号名称_步();/ *通知外部模式抽象层关于定期事件* / extmodeevent(PERIODIC_EVENT_ID那CurrentsimulationTime);} / *目标应用程序的主要功能* / main(int argc,char * argv []){/ * ------------------------- * / / *解析外部模式命令行参数* / extmodeparseargs(Argc,Argv);/ *初始化模型* /型号名称_初始化();/ *初始化外部模式目标连接* / extModeInit(extModeInfo.那finalSimulationTime);/*------------- HOST START REQUEST -------------*/ /* Wait until a START REQUEST is received from development computer */ extmodeWaitForHostRequest(EXTMODE_WAIT_FOREVER);/*------- HOST STOP REQUEST OR SIMULATION COMPLETE -------*/ /* While SIMULATION is not COMPLETE and STOP REQUEST is not received */ While (! extmodessimulationcomplete () && !extmodeStopRequested()) {/*------------- RUN -------------*/ periodicThread();extmodeBackgroundRun ();} /*------------- 重置 -------------*/ /* 终止模式* /型号名称_terminate();/ *重置外部模式目标连接* / extmodereset();返回0;}
要查看调用函数的代码,请完成中的示例基于XCP通信的外部模式仿真和系统目标文件设置ert.tlc.
.然后,从代码生成文件夹,打开ert_main.c.
.
笔记
如果系统目标文件为GRT.TLC.
或基于GRT的,代码生成器创建RT_MAIN.c.
,默认情况下使用内部文件定义的APIext_work.h.
.启用使用ext_mode.h
API,在构建目标应用程序之前,运行:
set_param(模型,'tlcoptions'那'-aextmodexcpclassicinterface = 0');
如果系统目标文件为ert.tlc.
或ERT-basedGenerateSampleERTMain
被设定为'在'
,代码生成器创建ert_main.c.
并且,默认情况下,使用由此定义的APIext_mode.h
.启用使用ext_work.h.
API,在构建目标应用程序之前,运行:
set_param(模型,'tlcoptions'那'-aextmodexcpclassicinterface = 1');
XCP从协议层根据自动化和测量系统(ASAM)标准化的标准化协会,解释XCP命令和数据,ASAM MCD-1 XCP。
源代码文件夹是:
matlabroot.\ Toolbox \ Coder \ XCP \ SRC \ Target \ Slave \ Protocol \ SRC
XCP从传输层根据ASAM规范从通信介质发送和接收消息。
源文件夹为:
matlabroot.\工具箱\编码器\ xcp \ src \目标\ \运输\ src奴隶
XCP平台抽象层提供:
对于定制示例,请参阅创建自定义抽象层.
XCP驱动程序通过通信通道发送和接收XCP消息。在外部模式仿真中,构建过程会自动将驱动程序文件添加到构建信息对象。
XCP驱动程序基于Rtiostream
API。例如,基于主机的外部模式模拟使用这些Rtiostream
文件:
matlabroot.
\ toolbox \ coder \ttriostream \ src \ttriostreadtcpip.c
matlabroot.
\ toolbox \ coder \ttriostream \ src \ rtiostriostream_serial.c
有关实施和测试的详细信息Rtiostream
通信通道,请参阅:
通信RTIOSTREAM API.(嵌入式编码)
XCP从软件需要动态分配可变大小的连续内存块以保持内部数据结构。
在外部模式仿真中,构建过程会自动将内存分配器文件添加到构建信息对象。
这xcpMemBlockSizes
和xcpMemBlockCounts
预处理器Macros定义内存分配。
默认内存分配器可以分配和删除最多16组不同的内存块。对于每个集,您可以在编译期间覆盖默认分配。您可以指定:
的块大小xcp_mem_block_
预处理器宏。N.
_尺寸
每个设置的块的数量xcp_mem_block_
预处理器宏。N.
_NUMBER
例如,这些预处理器宏创建四个64个字节和8个256字节块的块。
#define xcp_mem_block_1_size 64 #define xcp_mem_block_1_number 4 #define 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的默认文件金宝app®和窗户®系统。
该表描述了必须为部署在目标硬件上的XCP从软件提供的功能。
功能 | 细节 |
---|---|
相互排斥 |
使用。来访问系统数据结构相互排斥金宝app支持,XCP驱动程序取决于用于定义,初始化,锁和解锁的基本API。 要支持金宝app目标硬件的相互排除,请提供自定义实现。 Linux和Windows的默认实现支持相互排除。金宝app #if define (_WIN32) || defined(__WIN32__) || defined(WIN32)…#define XCP_MUTEX_DEFINE(lock) HANDLE lock #define XCP_MUTEX_INIT(lock) lock = CreateMutex(0, FALSE, 0) #define XCP_MUTEX_LOCK(lock) WaitForSingleObject((lock), INFINITE) #define XCP_MUTEX_UNLOCK(lock) ReleaseMutex(lock) #else…#define XCP_MUTEX_LOCK(lock) pthread_mutex_lock(&(lock), NULL) #define XCP_MUTEX_LOCK(lock) pthread_mutex_lock(&(lock)) #define XCP_MUTEX_LOCK(lock) pthread_mutex_unlock(&(lock))…# endif |
睡眠 | 提供一个睡眠API,使呼叫线程睡眠直到明确的时间。Linux和Windows系统的默认实现是: #if define (_WIN32) || defined(__WIN32__) || defined(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,支持目标硬件提供的日志服务。金宝app如果你没有定义 |
地址转换 |
XCP标准将内存中变量的地址表示为具有8位扩展的32位地址。 XCP主站通过解析构建过程创建的调试信息来提取模型的信号和参数的地址。调试信息处于DWARF或PDB格式。 通过发送包含参数的XCP命令,XCP主站请求访问参数和信号 什么时候 使用 #f定义(__ mingw32__)||定义(__ mingw64__)#define xcp_address_get(addressextension,地址)\(uintptr_t *)((uintptr_t *)地址)#else #define xcp_address_get(addressextension,地址)\(uint8_t *)((地址)+(uint8_t *)&__ imagebase)#万一 兼容 是0。 |
设置和复制内存 |
您可以指定复制内存的优化版本并设置内存操作。 如果你没有定义 #ifndef XCP_MEMCPY #define XCP_MEMCPY memcpy #endif #ifndef XCP_MEMSET #define XCP_MEMCPY memcpy #endif |
解析命令行参数 |
如果目标硬件不支持命令行参数的解析,则定义预处理器宏金宝app 更换 set_param(型号名称,'OntargetWaitForstart','ON'); -don_target_wait_for_start = 1 )到编译器。 |
对于构建过程,您可以定义创建自定义平台抽象层的后代码生成命令。
指定标题文件xcp_platform_custom.h.
.此Linux示例定义了所需的功能。
#ifndef xcp_platform_custom_h #define xcp_platform_custom_h / * xcp_address_get * / #include#define xcp_address_get(addressextension,地址)(uint8_t *)((uintptr_t *)((uintptr_t)地址)/ * xcp_mutex * / #include #definexcp_mutex_define(锁定)pthread_mutex_t锁#define xcp_mutex_init(lock)pthread_mutex_init(&(lock),null)#define xcp_mutex_lock(lock)pthread_mutex_lock(&(锁定))#define xcp_mutex_unlock(锁定)pthread_mutex_unlock(&(lock))/ * xcp_sleep* / #include / * gettimeofday * / #if _posix_c_source> = 199309l #include / * for nanosleep * / #else #include #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
定义后代码生成命令。
功能myXCPTargetPostCodeGenCommand buildInfo buildInfo.addDefines ('-dxcp_custom_platform'那“选择”);%配置默认内存分配器buildInfo.addDefines (“-DXCP_MEM_BLOCK_1_SIZE = 64”那“选择”);buildInfo.addDefines (“-DXCP_MEM_BLOCK_1_NUMBER = 46 '那“选择”);buildInfo.addDefines ('-dxcp_mem_block_2_size = 256'那“选择”);buildInfo.addDefines ('-dxcp_mem_block_2_number = 10'那“选择”);添加我的rtiostreambuildInfo.addSourceFiles (customRtIOStreamFileName...customRtiostreamSrcPath);%如果目标硬件不支持命令解析金宝app%行参数buildInfo.addDefines ('-dextmode_disable_args_processing'那“选择”);结尾
extmodebackgroundrun.
|extmodeevent.
|extmodegetfinalsimulationtime.
|extModeInit.
|extmodeparseargs.
|extmodereset.
|extmodeSetFinalSimulationTime
|extModesImulationComplete.
|extmodestoprequested.
|extmodeWaitForHostRequest