主要内容

以编程方式访问计时器

关于Timer api

本主题描述了让s -函数利用绝对计时器和流逝计时器提供的效率的api。SimStruct宏用于模拟,TLC函数用于内联代码生成。请注意,

  • 要像上面描述的那样生成和使用新的计时器,您的s -函数必须通过调用来注册使用绝对计时器或流逝计时器的需求ssSetNeedAbsoluteTimessSetNeedElapseTimemdlInitializeSampleTime

  • 读取绝对时间但不使用这些宏注册的现有s函数继续按预期操作,但生成的代码效率较低。

s -函数的C API

本主题中描述的SimStruct宏提供了在模拟期间访问s函数的绝对计时器和流逝计时器的方法。

在下面的函数中SimStruct *年代参数是指向对象的指针simstructs函数的函数。

  • void ssSetNeedAbsoluteTime(SimStruct *S, boolean b):如果b真正的,注册调用的s函数需要绝对时间数据,并为s函数执行的速度分配一个绝对时间计数器(如果还没有分配这样的计数器)。

  • (ssGetNeedAbsoluteTime):如果s函数注册了它需要绝对时间,则返回1。

  • double ssGetTaskTime(SimStruct *S, tid):读取带有任务标识符的给定任务的绝对时间tidssGetTaskTime操作透明,无论您是否使用新的计时器功能。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(系统):生成返回经过时间计数器的分辨率的代码系统.(系统是调用块的父系统。)

相关的话题