速率转换和异步块
由于异步函数调用子系统可以抢占或被其他模型代码抢占,当多个信号元素连接到异步块时,就会出现不一致。问题是,当抢占发生时,传递给函数调用子系统和从函数调用子系统传递的信号可能正在被写入或读取。因此,使用了一些旧数据和一些新数据。在某些情况下,标量信号也会出现这种情况。例如,如果一个信号是双字节(8字节),则读或写操作可能需要两条机器指令。
请注意
本节中演示的操作系统集成技术使用中断模板块库中的块。该库中的块提供了起点示例,以帮助您为目标环境开发自定义块。
关于速率转换和异步块
的仿真软万博1manbetx件®率转换Block被设计用于处理在不同速率的块之间进行数据传输时发生的抢占问题。这些问题将在基于时间的调度和代码生成.
您可以通过选择模型配置参数自动处理速率转换问题自动处理数据传输的速率转换.这使您不必手动插入率转换块,以避免无效的速率转换,包括无效的asynchronous-to-periodic而且asynchronous-to-asynchronous速率转换,在多速率模型中。对于异步任务,Simulink引擎为数据传输期间的数据完万博1manbetx整性而不是确定性配置插入块。
对于异步速率转换,使用率转换块提供数据完整性,但不能提供确定性。因此,在插入时率转换块,则必须清除block参数确保确定的数据传输(最大延迟).
当你插入率转换代码生成器假定高优先级的任务可以抢占低优先级的任务,而低优先级的任务不能抢占高优先级的任务。如果没有为任何一个块分配与任务相关的优先级,或者两个块的任务优先级相同,代码生成器假定其中一个任务可以抢占另一个任务。
周期任务的优先级由Simulink引擎根据万博1manbetx解算器的选择部份解算器窗格中的“配置参数”对话框。当周期采样时间约束参数设置为无约束
时,模型基本速率优先级设置为40
.子对象的优先级依次递增或递减1
从基本速率的优先级,取决于参数的设置优先级值越高,任务优先级越高.
您可以使用参数手动分配优先级周期采样时间特性.Simu万博1manbetxlink引擎不为异步块分配优先级。例如,连接回控件的函数调用子系统的优先级异步中断块由异步中断块。
块参数万博1manbetxSimulink任务优先级的异步中断Block为每个输入的中断号指定一个优先级(必需的)VME中断数.优先级数组设置连接到每个中断的子系统的优先级。
为任务同步如果示例RTOS (VxWorks . block)®)为目标,清除块参数优先级值越高,任务优先级越高.参数万博1manbetxSimulink任务优先级指定相对于连接块的块优先级(除了为生成的任务代码分配RTOS优先级)。
的vxlib1
为了方便起见,标准库提供了两种类型的速率转换块。类的预配置实例率转换布洛克:
保护速率转换块:率转换配置Block参数的块确保数据传输过程中的数据完整性选择和确保确定的数据传输清除。
未保护的速率迁移块:配置了确保数据传输过程中的数据完整性清除。
处理异步任务的速率转换
对于涉及异步任务的速率转换,您可以维护数据完整性。然而,你不能达到决定论。您可以选择使用率转换块或特定于目标的速率转换块。
考虑下面的模型,其中包含一个率转换块。
您可以使用率转换以以下任意一种方式阻止:
维护数据完整性,无确定性
无保护的
或者,您也可以使用特定于目标的速率转换块。下面的块可以用于示例RTOS (VxWorks):
保护速率跃迁块(读者)
保护速率跃迁块(作家)
无保护的速率转换块
处理多个异步中断
考虑下面的模型,其中两个函数触发同一个子系统。
这两项任务的优先级必须相同。当优先级相同时,结果取决于它们是周期性触发还是异步触发,也取决于诊断设置。下表和注释描述了这些结果:
万博1manbetx支持多触发器函数调用子系统的采样时间和优先级
异步优先级= 1 |
异步优先级= 2 |
异步优先级未指定 |
周期优先级= 1 |
周期优先级= 2 |
|
---|---|---|---|---|---|
异步优先级= 1 |
万博1manbetx支持(1) |
||||
异步优先级= 2 |
万博1manbetx支持(1) |
||||
异步优先级未指定 |
万博1manbetx支持(2) |
||||
周期优先级= 1 |
万博1manbetx支持 |
||||
周期优先级= 2 |
万博1manbetx支持 |
使用模型配置参数控制这些结果具有同等优先级的任务;将此诊断设置为
没有一个
如果目标系统中具有相同优先级的任务不能相互抢占。对于这种情况,将无条件地发出以下警告消息:
函数调用子系统
具有多个不指定优先级的异步触发器。如果这些触发器可以相互抢占,则无法维护数据完整性。
上表中的空单元格表示具有不同优先级的多个触发器,这些触发器不受支持。万博1manbetx
代码生成器为连接到多个中断的函数调用子系统提供绝对时间管理,其中计时器设置为TriggerA
而且TriggerB
(时间来源,分辨率)都是一样的。
假设对于上面所示的模型,以下所有条件都成立:
函数调用子系统由两个具有相同优先级设置的异步触发器(TriggerA和TriggerB)触发。
每个触发器通过调用函数来设置时间源和计时器属性
ssSetTimeSource
而且ssSetAsyncTimerAttributes
.被触发的子系统包含一个需要消耗或绝对时间的块(例如,离散时间积分器)。
异步函数调用子系统有一个全局变量,clockTick #
(#
是与子系统关联的任务ID)。这个变量存储异步任务的绝对时间。有两种方法可以处理时间:
如果时间源设置为
SS_TIMESOURCE_BASERATE
,代码生成器在函数调用子系统中生成计时器代码,从基本速率时钟计时更新时钟计时变量。如果TriggerA和TriggerB的优先级相同,则可以保证数据的完整性。如果时间源为
SS_TIMESOURCE_SELF
,为TriggerA和TriggerB生成的代码从硬件时钟更新相同的时钟滴答变量。
时钟滴答变量的字长可以直接设置,也可以根据模型配置参数的设置建立应用程序生命周期(天)以及TriggerA和TriggerB s函数设置的定时器分辨率(必须相同)。看到异步任务中的定时器而且控制时间计数器的内存分配获取更多信息。
保护数据完整性挥发性
关键字
当您选择块参数时在数据传输过程中,保证数据的完整性,为a生成的代码率转换块定义挥发性
全局缓冲区和信号量,并使用它们来保护传输数据的完整性。额外的保护,或没有保护率转换Block,你可以显式地应用挥发性
传输的数据。有关更多信息,请参见使用const和volatile类型限定符保护全局数据(嵌入式编码).