这个主题描述如何实现异步块与您的目标RTOS一起使用异步中断和任务同步块作为起点。率转换区块是与目标无关的,因此不需要开发定制的速率转换区块。
请注意
本节中演示的操作系统集成技术使用一个或多个块vxlib1
图书馆。这些块提供了起点示例,以帮助您为目标环境开发自定义块。
您可以通过修改块实现来定制异步库块。这些文件
这个块是底层的s功能的mex文件
控制块代码生成的TLC文件
此外,您需要修改块掩码以删除特定于示例RTOS (VxWorks)的引用®),并合并目标RTOS所需的参数。
自定义块实现是一个高级的主题,需要熟悉Simulink金宝app®MEX s -函数格式和API,并带有目标语言编译器(TLC)。下列文件涵盖了这些主题:
金宝app仿真软件的话题什么是s函数?,在模型中使用s函数,S-Functions如何工作,实现S-Functions描述MEX s -函数和s -函数API的一般情况。
的内联S-Functions,内联C MEX s -函数,s -函数和代码生成描述如何创建用于代码生成的TLC块实现。
下面几节讨论异步库块的C/ c++和TLC实现,包括必需的SimStruct
TLC异步支持库中的宏和函数(金宝appasynclib.tlc
).
的源文件异步中断区块位于
(开放):matlabroot
/ rtw / c /龙卷风/设备
vxinterrupt1.c
: C mex文件源代码,用于配置和模拟
vxinterrupt1.tlc
TLC实现,用于代码生成
asynclib.tlc
: TLC库的支持函数,由TLC实金宝app现块调用。库调用总结为asynclib.tlc年代upport Library.
大部分代码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.c
.SS_OPTION_ASYNCHRONOUS_INTERRUPT
当函数调用子系统附加到中断时应该使用。有关更多信息,请参阅文档SS_OPTION
和SS_OPTION_ASYNCHRONOUS
在
.matlabroot
/金宝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
调用LibGetFcnCallBlock
和LibGetBlockAttribute
.)如果是这样,
ISR的抢占标志必须设置为1
.否则会导致错误。
生成保存和恢复浮点上下文的RTOS (VxWorks)调用,除非用户已将模型配置为只生成整型代码。
在生成ISR代码时,输出
调用asynclib
函数LibNeedAsyncCounter
以确定所连接的子系统是否需要一个计时器。如果是,且时间源设置为SS_TIMESOURCE_SELF
通过ssSetTimeSource
,LibSetAsyncCounter
用于生成RTOS (VxWorks)。tickGet
函数调用并更新计数器。在你的实现中,你应该生成一个对目标RTOS的等价调用,或者生成代码来读取目标硬件上的计时器寄存器。
函数开始。的开始
函数生成所需的RTOS (VxWorks)调用(int_connect
和sysInt_Enable
)连接并启用每个ISR。您应该用对目标RTOS的调用来替换它。
终止功能。的终止
函数生成调用sysIntDisable
禁用每个ISR。您应该用对目标RTOS的调用来替换它。
的源文件任务同步区块位于
(开放).他们是matlabroot
/ rtw / c /龙卷风/设备
vxtask1.cpp
: mex文件源代码,用于配置和模拟。
vxtask1.tlc
TLC实现,用于代码生成。
asynclib.tlc
: TLC库的支持函数,由TLC实金宝app现块调用。库调用总结为asynclib.tlc年代upport Library.
就像异步中断块,任务同步块设置一个计时器,在这个例子中是一个固定的分辨率。与块关联的任务的优先级由块参数获取金宝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)调用来定义信号量的存储空间,该信号量用于管理由任务同步块。这取决于CodeFormat
TLC变量的目标,或静态存储声明或动态内存分配调用生成。这个函数还创建一个信号量(semBCreate
),并生成一个RTOS任务(taskSpawn
).您应该使用对目标RTOS的调用来替换这些调用。
输出函数。的输出
函数生成一个等待信号量的示例RTOS (VxWorks)任务。当它获得信号量时,它更新块的tick定时器并调用下游子系统代码,如生成和同步执行RTOS任务.输出
还生成授予信号量的代码(从中断级调用)。
终止功能。的终止
函数生成示例RTOS (VxWorks)调用taskDelete
结束由块生成的任务的执行。您应该用对目标RTOS的调用来替换它。
还要注意,如果目标RTOS动态地分配了与任务相关联的内存,则终止
函数应该释放内存。
asynclib.tlc
是一个TLC函数库,支持异步块的实现。金宝app有些函数是专门为异步块而设计的。例如,LibSetAsyncCounter
为异步块生成更新计时器的调用。其他函数是返回异步块所需信息的实用程序(例如,关于已连接的函数调用子系统的信息)。
下表总结了图书馆中的公共调用。有关详细信息,请参阅库源代码和vxinterrupt1.tlc
和vxtask1.tlc
文件,调用库函数。
asynclib的总结。tlc库函数
函数 |
描述 |
---|---|
|
供带有函数调用输出的内联s函数使用。生成代码以执行函数调用子系统。 |
|
从块记录返回一个字段值。 |
|
给定一个S-Function块和调用索引,返回下游函数调用子系统块的块记录。 |
|
提供对上游异步任务的时间计数器的访问。 |
|
提供对上游异步任务时间计数器高值的访问。 |
|
确定异步任务是否需要计数器并管理它自己的计时器。 |
|
如果调用块需要异步计数器,则返回 |
|
返回设置 |
|
生成代码来设置块的异步计数器的tick值。 |
|
生成代码来设置块的异步计数器的高值 |