文档

以编程方式访问计时器

关于计时器api

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

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

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

用于s函数的C API

本主题中描述的SimStruct宏提供了在模拟期间对S-functions的绝对计时器和运行计时器的访问。

在下面的函数中SimStruct *年代的指针simstruct调用s函数。

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

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

  • double ssGetTaskTime(SimStruct *S, tid):使用任务标识符读取给定任务的绝对时间tidssGetTaskTime操作透明,无论您是否使用新的定时器功能。ssGetTaskTime是在Simulink的SimStruct函数一章中记录的金宝app®文档。

  • void ssSetNeedElapseTime(SimStruct *S, boolean b):如果b真正的,注册调用s函数需要运行时间数据,并为s函数执行的触发子系统分配一个运行时间计数器(如果还没有分配这样的计数器)。另请参阅触发子系统中的运行时间计数器

  • int ssGetNeedElapseTime (SimStruct * S):如果s函数注册了它需要经过的时间,则返回1。

  • void ssGetElapseTime(SimStruct *S, (double *)elapseTime):返回指向的位置elapseTime,值(作为a)的运行时间计数器与s函数。

  • void ssGetElapseTimeCounterDtype(SimStruct *S, (int *)dtype):将与s函数关联的运行时间计数器的数据类型返回到所指向的位置dtype.该函数用于ssGetElapseTimeCounter函数(见下文)。

  • void ssGetElapseResolution(SimStruct *S, (double *)分辨率):将与s函数相关联的运行时间计数器的分辨率(即示例时间)返回到所指向的位置决议.该函数用于ssGetElapseTimeCounter函数(见下文)。

  • void ssGetElapseTimeCounter(SimStruct *S, (void *)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

当您通过编写TLC脚本内联s -函数时,以下TLC函数支金宝app持生成的代码中的运行时间计数器。

  • LibGetTaskTimeFromTID(块):生成代码读取任务的绝对时间执行。

    LibGetTaskTimeFromTID在目标语言编译器文档的TLC函数库参考页面中与其他示例时间函数一起进行了文档化。

    请注意

    不要使用LibGetT为这个目的。LibGetT总是读取基本比率(tid 0)计时器。如果LibGetT调用时,将读取错误的计时器,从而导致严重错误。

  • LibGetElapseTime(系统):生成代码来读取运行时间计数器系统.(系统是调用块的父系统。)看到为运行时间计数器生成代码此函数生成的代码示例。

  • LibGetElapseTimeCounter(系统):生成代码读取运行时间计数器的整数值系统.(系统是调用块的父系统。)这个函数应该与LibGetElapseTimeCounterDtypeIdLibGetElapseTimeResolution.(参见ssGetElapseTimeCounter以上)。

  • LibGetElapseTimeCounterDtypeId(系统):生成返回运行时间计数器的数据类型的代码系统.(系统是调用块的父系统。)

  • LibGetElapseTimeResolution(系统):生成返回经过时间计数器的解析值的代码系统.(系统是调用块的父系统。)

相关的话题