以编程方式访问计时器
关于Timer api
本主题描述了让s -函数利用绝对计时器和流逝计时器提供的效率的api。SimStruct宏用于模拟,TLC函数用于内联代码生成。请注意,
要像上面描述的那样生成和使用新的计时器,您的s -函数必须通过调用来注册使用绝对计时器或流逝计时器的需求
ssSetNeedAbsoluteTime
或ssSetNeedElapseTime
在mdlInitializeSampleTime
.读取绝对时间但不使用这些宏注册的现有s函数继续按预期操作,但生成的代码效率较低。
s -函数的C API
本主题中描述的SimStruct宏提供了在模拟期间访问s函数的绝对计时器和流逝计时器的方法。
在下面的函数中SimStruct *年代
参数是指向对象的指针simstruct
s函数的函数。
void ssSetNeedAbsoluteTime(SimStruct *S, boolean b)
:如果b
是真正的
,注册调用的s函数需要绝对时间数据,并为s函数执行的速度分配一个绝对时间计数器(如果还没有分配这样的计数器)。(ssGetNeedAbsoluteTime)
:如果s函数注册了它需要绝对时间,则返回1。double ssGetTaskTime(SimStruct *S, tid)
:读取带有任务标识符的给定任务的绝对时间tid
.ssGetTaskTime
操作透明,无论您是否使用新的计时器功能。ssGetTaskTime
在Simulink金宝app®文档。void ssSetNeedElapseTime(SimStruct *S, boolean b)
:如果b
是真正的
,注册调用s -函数需要运行时间数据,并为执行s -函数的触发子系统分配一个运行时间计数器(如果还没有分配这样一个计数器的话)。另请参阅触发子系统中的运行时间计数器.(ssGetNeedElapseTime)
:如果s函数注册了它需要消耗时间,则返回1。(SimStruct *S, (double *)elapseTime)
:返回到由所指向的位置elapseTime
,值(作为双
)与s函数相关联的运行时间计数器。void ssGetElapseTimeCounterDtype(SimStruct *S, (int *)dtype)
:返回与s函数相关联的经过时间计数器的数据类型到指向的位置dtype
.方法使用此函数ssGetElapseTimeCounter
函数(见下文)。(SimStruct *S, (double *)resolution)
:返回与s函数相关联的经过时间计数器到所指向位置的分辨率(即采样时间)决议
.方法使用此函数ssGetElapseTimeCounter
函数(见下文)。void ssGetElapseTimeCounter(SimStruct *S, elapseTime)
:此函数用于使用需要经过时间值的块进行定点计算。ssGetElapseTimeCounter
返回到所指向的位置elapseTime
,与s函数相关联的运行时间计数器的整数值。如果计数器大小为64位,则该值将作为两个32位字的数组返回,低阶字存储在较低的地址。要确定如何访问返回的计数器值,可以通过调用获取计数器的数据类型
ssGetElapseTimeCounterDtype
,如下代码所示:int * y_dtype;ssGetElapseTimeCounterDtype(年代,y_dtype);switch(*y_dtype) {case SS_DOUBLE_UINT32: {uint32_T dataPtr[2];ssGetElapseTimeCounter(年代,dataPtr);}打破;case SS_UINT32: {uint32_T dataPtr[1];ssGetElapseTimeCounter(年代,dataPtr);}打破;case SS_UINT16: {uint16_T dataPtr[1];ssGetElapseTimeCounter(年代,dataPtr); } break; case SS_UINT8: { uint8_T dataPtr[1]; ssGetElapseTimeCounter(S, dataPtr); } break; case SS_DOUBLE: { real_T dataPtr[1]; ssGetElapseTimeCounter(S, dataPtr); } break; default: ssSetErrorStatus(S, "Invalid data type for elaspe time counter"); break; }
方法的调用可以使用实际的运行时间
ssGetElapseTime
函数直接访问运行时间。您不需要获取计数器值,然后计算经过的时间。双* y_elapseTime;……elapseTime ssGetElapseTime(年代)
代码生成的TLC API
当您通过为s函数编写TLC脚本来内联它们时,以下TLC函金宝app数支持在生成的代码中使用时间计数器。
LibGetTaskTimeFromTID
(块)
:生成代码以读取其中任务的绝对时间块
执行。LibGetTaskTimeFromTID
在目标语言编译器文档的TLC函数库参考页中记录了其他示例时间函数。请注意
不要使用
LibGetT
为了这个目的。LibGetT
始终读取基本速率(tid 0
)计时器。如果LibGetT
调用在子节点上执行的块时,读取错误的计时器,导致严重错误。LibGetElapseTime
(系统)
:生成代码以读取其运行时间计数器系统
.(系统
是调用块的父系统。)看到为消耗时间计数器生成代码此函数生成的代码示例。LibGetElapseTimeCounter
(系统)
:生成代码以读取运行时间计数器的整数值系统
.(系统
是调用块的父系统。)此函数应与LibGetElapseTimeCounterDtypeId
而且LibGetElapseTimeResolution
.(参见ssGetElapseTimeCounter
以上)。LibGetElapseTimeCounterDtypeId
(系统)
:生成返回的运行时间计数器的数据类型的代码系统
.(系统
是调用块的父系统。)LibGetElapseTimeResolution
(系统)
:生成返回经过时间计数器的分辨率的代码系统
.(系统
是调用块的父系统。)