
汇聚博主多年工程经验的新书《Simulink嵌入式开发实战》现已上市针对Simulink与MBD开发技术形成了一套完整的知识体系和方法论。详细介绍和优惠链接可以参考博客《Simulink嵌入式开发实战》新书上市感谢粉丝长期以来的支持文章目录1 问题引入2 Simulink建模2.1 Chart模型2.2 触发子系统3 代码生成与分析4 总结本文研究如何通过Chart模块进行多个周期调度。1 问题引入在很多以前的博客中博主用Simulink生成的代码中包含一个Step函数。在代码编译的过程中会把这个Step函数放入OS调度的函数中譬如Task_5ms()函数内这个函数就会每隔5ms被操作系统执行一次。但是博主最近在工作中遇到一个需求是一个Simulink模型中的不同子系统以不同的周期被调度但是生成的代码还得是一个step函数。这就需要在模型内实现多个周期调度研究了一下认为可以通过Chart模块发送不同的事件Event来完成这个任务。2 Simulink建模博主通过简单的Simulink建模来记录一下这个方案的思路。2.1 Chart模型在模型中Chart模块充当了一个“调度器”的角色以不同的频率的事件调度外部的子系统。首先默认这个模型的调度事件是2.5ms。1新建一个Simulink模型拖入一个Chart模块如图所示2双击进入Chart模块在其中建立如下图所示的State命名为Scheduler其中进入Scheduler时en会发送call_2d5ms、call_5ms、call_10ms三个事件。然后在这个状态内du持续发送这三个事件但是频率不同。call_2d5ms事件是每个周期发送一次call_5ms事件是每两个周期发送一次call_10ms事件是每4个周期发送一次。这样由于整个模型的调度周期是2.5ms所以call_2d5ms事件是2.5ms触发一次call_5ms事件是5ms触发一次call_10ms事件是10ms触发一次。3在属性栏将这三个事件都设为输出事件4退出到上一层会看到Chart模块多出了三个端口用Goto模块将这三个端口分别引出以备后面的Function-Cal子系统使用。5在模块的properties中取消勾选Execute (enter) Chart At Initialization这样的话生成代码就不会初始化Chart里面的内容了2.2 触发子系统建立三个Function-Call子系统分别由上文的Chart模块的三个输出事件调用每个子系统都是相同的输入port但是子系统内的Gain模块的放大系数不一样。其中2.5ms的子系统对于着2倍5ms的子系统对于着3倍10ms的子系统对于着4倍.这样方便观察生成的代码。3 代码生成与分析配置好Embedded Coder后Ctrl B生成代码观察Step函数内容函数一开始会使用i1,i2,i3三个全局变量作为计数器每次调度step函数时如果小于12或4就会自加1。后面的代码中如果i1,i2,i3分别等于12或4的时候就会执行对于子系统里面的内容。这就意味着模型中的Function1每一次step函数执行一次Function2每两次step函数执行一次Function3每四次step函数执行一次。只要把step函数放进2.5ms中周期调度这三个子系统就会以2.5ms5ms10ms来执行也就完成了博主一开始提出的问题。4 总结本文研究通过Chart模块在一个模型中进行多个周期调度的办法适用的场景比较特殊但是可以很方便地解决这类问题。返回个人博客总目录