主要内容

创建自定义异步库

这个主题描述如何实现异步块与您的目标RTOS一起使用异步中断任务同步块作为起点。率转换区块是与目标无关的,因此不需要开发定制的速率转换区块。

请注意

本节中演示的操作系统集成技术使用一个或多个块vxlib1图书馆。这些块提供了起点示例,以帮助您为目标环境开发自定义块。

关于实现异步块

您可以通过修改块实现来定制异步库块。这些文件

  • 这个块是底层的s功能的mex文件

  • 控制块代码生成的TLC文件

此外,您需要修改块掩码以删除特定于示例RTOS (VxWorks)的引用®),并合并目标RTOS所需的参数。

自定义块实现是一个高级的主题,需要熟悉Simulink金宝app®MEX s -函数格式和API,并带有目标语言编译器(TLC)。下列文件涵盖了这些主题:

下面几节讨论异步库块的C/ c++和TLC实现,包括必需的SimStructTLC异步支持库中的宏和函数(金宝appasynclib.tlc).

异步中断块实现

的源文件异步中断区块位于matlabroot/ rtw / c /龙卷风/设备开放):

C MEX块实现

大部分代码vxinterrupt1.c执行与异步支持无关的普通函数(例如,从块掩码获取和验证参数、将参数标记为不可调优以及将参数数据传递给金宝app模型.rtw文件)。

mdlInitializeSizes函数使用特殊SimStruct宏和SS_OPTIONS异步块所需的设置,如下所述。

注意,以下宏之前不能被调用ssSetOutputPortWidth被称为:

  • ssSetTimeSource

  • ssSetAsyncTimerAttributes

  • ssSetAsyncTimerResolutionEl

  • ssSetAsyncTimerDataType

  • ssSetAsyncTimerDataTypeEl

  • ssSetAsyncTaskPriorities

  • ssSetAsyncTaskPrioritiesEl

如果之前调用了上面的一个宏ssSetOutputPortWidth,出现以下错误信息:

sl_sfcnmustspeciyportwidthbfcallsomemacro {s -function '%s' in '%' '必须在调用宏%s之前使用sssetoutputporttwidth设置输出端口%d宽度}

ssSetAsyncTimerAttributes。ssSetAsyncTimerAttributes声明块需要一个计时器,并设置为块参数指定的计时器分辨率定时器的分辨率(秒)

函数原型是

ssSetAsyncTimerAttributes(SimStruct *S, double res)

在哪里

  • S是一个Simstruct指针。

  • 参数定时器的分辨率(秒)被设置为res

下面的代码摘录显示了对ssSetAsyncTimerAttributes的调用。

/*设置异步定时器属性*/ ssSetAsyncTimerAttributes(S,mxGetPr(TICK_RES)[0]);

ssSetAsyncTaskPriorities。ssSetAsyncTaskPriorities为在每个中断级别执金宝app行的块设置Simulink任务优先级,如块参数所指定的金宝app仿真软件任务优先级

函数原型是

ssSetAsyncTaskPriorities(SimStruct *S, int numISRs, int *优先级数组)

在哪里

  • 年代是一个SimStruct指针。

  • numISRs是否为块参数指定中断的数量VME中断编号

  • priorityarray是否为块参数指定一个包含中断号的整数数组VME中断编号

下面的代码片段显示了调用ssSetAsyncTaskPriorities

/*设置异步任务优先级*/ priorityArray = malloc(numISRs*sizeof(int_T));(我= 0;我< numISRs;i++) {priorityArray[i] = (int_T)(mxGetPr(ISR_PRIORITIES)[i]);} ssSetAsyncTaskPriorities(S, numISRs, priorityArray);免费(priorityArray);priorityArray =零;}

SS_OPTION设置。下面的代码摘录显示了SS_OPTION设置vxinterrupt1.cSS_OPTION_ASYNCHRONOUS_INTERRUPT当函数调用子系统附加到中断时应该使用。有关更多信息,请参阅文档SS_OPTIONSS_OPTION_ASYNCHRONOUSmatlabroot/金宝app模型/ include /simstruc.h

ssSetOptions(S, (SS_OPTION_EXCEPTION_FREE_CODE |

如果S-function指定SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME选项并继承的示例时间,代码生成器根据块是否不变来确定如何为块生成代码。如果一个块的端口信号是不变的,那么它就是不变的。如果信号在整个仿真过程中具有一个常量值,那么它就是不变的。如果你指定常数阻塞采样时间,不要假定端口信号是不变的。有关更多信息,请参见内联不变的信号.如果块不是不变的,代码生成器只在初始化入口点函数中生成代码。如果该块是不变的,则代码生成器不会为该块生成代码。

薄层色谱实现

本节讨论的每个函数vxinterrupt1.tlc,重点介绍了为生成目标RTOS代码而需要更改的目标特定特性。

生成# include指令。vxinterrupt1.tlc以语句开头

%包括“vxlib.tlc”

vxlib.tlc是一个特定于目标的文件,用于生成包含示例RTOS (VxWorks)头文件的指令。你应该用一个为你的目标RTOS生成包含的文件来替换它。

BlockInstanceSetup函数。的每个连接输出异步中断块,BlockInstanceSetup在生成的代码中为相应的ISR定义函数名。函数名是这种形式的

isr_全国矿工工会_vec_抵消

在哪里全国矿工工会是否为块参数定义了ISR号VME中断编号,抵消中断表偏移量是由块参数定义的吗中断矢量偏移量

在自定义实现中,此命名约定是可选的。

函数名被缓存以供输出函数,它生成实际的ISR代码。

输出函数。输出的连接的输出异步中断块。为每个这样的输出生成一个ISR。

ISR代码缓存在“功能”部分生成的代码。在生成ISR之前,输出以下:

  • 生成对下游块的调用(缓存在临时缓冲区中)。

  • 确定ISR是否应该被锁定(由block参数指定)抢占国旗(s)).

  • 确定块是否连接到异步中断块是一个任务同步块。(此信息是通过使用asynclib调用LibGetFcnCallBlockLibGetBlockAttribute.)如果是这样,

    • ISR的抢占标志必须设置为1.否则会导致错误。

    • 生成保存和恢复浮点上下文的RTOS (VxWorks)调用,除非用户已将模型配置为只生成整型代码。

在生成ISR代码时,输出调用asynclib函数LibNeedAsyncCounter以确定所连接的子系统是否需要一个计时器。如果是,且时间源设置为SS_TIMESOURCE_SELF通过ssSetTimeSourceLibSetAsyncCounter用于生成RTOS (VxWorks)。tickGet函数调用并更新计数器。在你的实现中,你应该生成一个对目标RTOS的等价调用,或者生成代码来读取目标硬件上的计时器寄存器。

函数开始。开始函数生成所需的RTOS (VxWorks)调用(int_connectsysInt_Enable)连接并启用每个ISR。您应该用对目标RTOS的调用来替换它。

终止功能。终止函数生成调用sysIntDisable禁用每个ISR。您应该用对目标RTOS的调用来替换它。

任务同步块实现

的源文件任务同步区块位于matlabroot/ rtw / c /龙卷风/设备开放).他们是

C MEX块实现

就像异步中断块,任务同步块设置一个计时器,在这个例子中是一个固定的分辨率。与块关联的任务的优先级由块参数获取金宝app仿真软件任务优先级.的SS_OPTION设置与用于异步中断块。

ssSetAsyncTimerAttributes(年代,0.01);优先级= (int_T) (*(mxGetPr(priority))));ssSetAsyncTaskPriorities(年代,1、优先);ssSetOptions(S, (SS_OPTION_EXCEPTION_FREE_CODE | SS_OPTION_ASYNCHRONOUS | SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME |}

薄层色谱实现

生成# include指令。vxtask1.tlc以语句开头

%包括“vxlib.tlc”

vxlib.tlc是一个特定于目标的文件,用于生成包含示例RTOS (VxWorks)头文件的指令。你应该用一个为你的目标RTOS生成包含的文件来替换它。

BlockInstanceSetup函数。BlockInstanceSetup函数派生任务名称、块名称和稍后在代码生成中使用的其他标识符。它还检查和警告未连接的块条件,并为信号量生成存储声明(stopSem),在中断溢出情况下使用。

函数开始。开始函数生成所需的RTOS (VxWorks)调用来定义信号量的存储空间,该信号量用于管理由任务同步块。这取决于CodeFormatTLC变量的目标,或静态存储声明或动态内存分配调用生成。这个函数还创建一个信号量(semBCreate),并生成一个RTOS任务(taskSpawn).您应该使用对目标RTOS的调用来替换这些调用。

输出函数。输出函数生成一个等待信号量的示例RTOS (VxWorks)任务。当它获得信号量时,它更新块的tick定时器并调用下游子系统代码,如生成和同步执行RTOS任务输出还生成授予信号量的代码(从中断级调用)。

终止功能。终止函数生成示例RTOS (VxWorks)调用taskDelete结束由块生成的任务的执行。您应该用对目标RTOS的调用来替换它。

还要注意,如果目标RTOS动态地分配了与任务相关联的内存,则终止函数应该释放内存。

asynclib.tlc年代upport Library

asynclib.tlc是一个TLC函数库,支持异步块的实现。金宝app有些函数是专门为异步块而设计的。例如,LibSetAsyncCounter为异步块生成更新计时器的调用。其他函数是返回异步块所需信息的实用程序(例如,关于已连接的函数调用子系统的信息)。

下表总结了图书馆中的公共调用。有关详细信息,请参阅库源代码和vxinterrupt1.tlcvxtask1.tlc文件,调用库函数。

asynclib的总结。tlc库函数

函数

描述

LibBlockExecuteFcnCall

供带有函数调用输出的内联s函数使用。生成代码以执行函数调用子系统。

LibGetBlockAttribute

从块记录返回一个字段值。

LibGetFcnCallBlock

给定一个S-Function块和调用索引,返回下游函数调用子系统块的块记录。

LibGetCallerClockTickCounter

提供对上游异步任务的时间计数器的访问。

LibGetCallerClockTickCounterHighWord

提供对上游异步任务时间计数器高值的访问。

LibManageAsyncCounter

确定异步任务是否需要计数器并管理它自己的计时器。

LibNeedAsyncCounter

如果调用块需要异步计数器,则返回TLC_TRUE,否则返回TLC_FALSE

LibSetAsyncClockTicks

返回设置clockTick由异步任务维护的计数器。

LibSetAsyncCounter

生成代码来设置块的异步计数器的tick值。

LibSetAsyncCounterHighWord

生成代码来设置块的异步计数器的高值

相关的话题