Simulink代码生成——多速率任务调度

单任务统一采样时间生成代码

通过如下简单模型测试,设定离散步长0.01,模型中有三个out输出信号,设置采样全部为-1(继承),那么模型中所有的采样速率均为0.01。为了方便代码阅读,对模型进行了一些简单的设置,定义了输入BUS,AliasType。

直接生成代码如下:

#include "Demo1.h"
INPUT stInput;
ExtY_Demo1_T Demo1_Y;
RT_MODEL_Demo1_T Demo1_M_;
RT_MODEL_Demo1_T *const Demo1_M = &Demo1_M_;
void Demo1_step(void)
{Demo1_Y.Out1 = (U8)((U32)stInput.paraA + stInput.paraB);Demo1_Y.Out2 = (U8)(stInput.paraA - stInput.paraB);Demo1_Y.Out3 = (U8)((U32)stInput.paraA * stInput.paraB);
}
void Demo1_initialize(void)
{rtmSetErrorStatus(Demo1_M, (NULL));
}

单任务中设置不同采样时间生成代码

设置了三种不同采样速率,output2和output3采样速率分别设置为0.1和0.5

生成代码如下,产生了一个速率调度的函数rate_scheduler(),分别对应0.1和0.5。在step函数中根据速率来执行不同的逻辑。

#include "Demo1.h"
INPUT stInput;
B_Demo1_T Demo1_B;
ExtY_Demo1_T Demo1_Y;
RT_MODEL_Demo1_T Demo1_M_;
RT_MODEL_Demo1_T *const Demo1_M = &Demo1_M_;
static void rate_scheduler(void);
static void rate_scheduler(void)
{(Demo1_M->Timing.TaskCounters.TID[1])++;if ((Demo1_M->Timing.TaskCounters.TID[1]) > 9) {Demo1_M->Timing.TaskCounters.TID[1] = 0;}(Demo1_M->Timing.TaskCounters.TID[2])++;if ((Demo1_M->Timing.TaskCounters.TID[2]) > 49) {Demo1_M->Timing.TaskCounters.TID[2] = 0;}
}
void Demo1_step(void)
{if (Demo1_M->Timing.TaskCounters.TID[1] == 0) {Demo1_Y.Out1 = (U8)((U32)stInput.paraA + stInput.paraB);Demo1_Y.Out2 = (U8)(stInput.paraA - stInput.paraB);Demo1_B.output3 = (U8)((U32)stInput.paraA * stInput.paraB);}if (Demo1_M->Timing.TaskCounters.TID[2] == 0) {Demo1_Y.Out3 = Demo1_B.output3;}rate_scheduler();
}
void Demo1_initialize(void)
{(void) memset((void *)Demo1_M, 0,sizeof(RT_MODEL_Demo1_T));(void) memset(((void *) &Demo1_B), 0,sizeof(B_Demo1_T));
}

不同采样时间在生成代码时处理成独立的任务


生成代码如下:

#include "Demo1.h"
INPUT stInput;
B_Demo1_T Demo1_B;
ExtY_Demo1_T Demo1_Y;
RT_MODEL_Demo1_T Demo1_M_;
RT_MODEL_Demo1_T *const Demo1_M = &Demo1_M_;
void Demo1_step0(void)
{}
void Demo1_step1(void)
{U8 rtb_output3;(Demo1_M->Timing.RateInteraction.TID1_2)++;if ((Demo1_M->Timing.RateInteraction.TID1_2) > 4) {Demo1_M->Timing.RateInteraction.TID1_2 = 0;}rtb_output3 = (U8)((U32)stInput.paraA + stInput.paraB);Demo1_Y.Out1 = rtb_output3;rtb_output3 = (U8)(stInput.paraA - stInput.paraB);Demo1_Y.Out2 = rtb_output3;rtb_output3 = (U8)((U32)stInput.paraA * stInput.paraB);if (Demo1_M->Timing.RateInteraction.TID1_2 == 1) {Demo1_B.output3 = rtb_output3;}
}
void Demo1_step2(void)
{Demo1_Y.Out3 = Demo1_B.output3;
}
void Demo1_initialize(void)
{(void) memset((void *)Demo1_M, 0,sizeof(RT_MODEL_Demo1_T));(void) memset(((void *) &Demo1_B), 0,sizeof(B_Demo1_T));
}

三种采样时间在生成代码时产生了三个step函数,在示例中给出了如下的任务调度方式:

#include <stddef.h>
#include <stdio.h>
#include "Demo1.h"
#include "rtwtypes.h"
void rt_OneStep(void);
void rt_OneStep(void)
{static boolean_T OverrunFlags[3] = { 0, 0, 0 };static boolean_T eventFlags[3] = { 0, 0, 0 };static int_T taskCounter[3] = { 0, 0, 0 };int_T i;if (OverrunFlags[0]) {rtmSetErrorStatus(Demo1_M, "Overrun");return;}OverrunFlags[0] = true;for (i = 1; i < 3; i++) {if (taskCounter[i] == 0) {if (eventFlags[i]) {OverrunFlags[0] = false;OverrunFlags[i] = true;rtmSetErrorStatus(Demo1_M, "Overrun");return;}eventFlags[i] = true;}}taskCounter[1]++;if (taskCounter[1] == 10) {taskCounter[1]= 0;}taskCounter[2]++;if (taskCounter[2] == 50) {taskCounter[2]= 0;}Demo1_step0();OverrunFlags[0] = false;for (i = 1; i < 3; i++) {if (OverrunFlags[i]) {return;}if (eventFlags[i]) {OverrunFlags[i] = true;switch (i) {case 1 :Demo1_step1();break;case 2 :Demo1_step2();break;default :break;}OverrunFlags[i] = false;eventFlags[i] = false;}}
}
int_T main(int_T argc, const char *argv[])
{(void)(argc);(void)(argv);Demo1_initialize();printf("Warning: The simulation will run forever. ""Generated ERT main won't simulate model step behavior. ""To change this behavior select the 'MAT-file logging' option.\n");fflush((NULL));while (rtmGetErrorStatus(Demo1_M) == (NULL)) {}return 0;
}

Simulink代码生成——多速率任务调度相关推荐

  1. Simulink代码生成: 延时模块及其代码

    Simulink代码生成: 延时模块及其代码_u013288925的博客-CSDN博客_simulink延时模块

  2. simulink怎么生成vxworks的执行程序_从EPB模型谈谈Simulink代码生成

    前段时间有读者朋友问代码生成的例子,说他正在做EPB的仿真模型,但总是和应用串不到一块去,我这里就从一个简单EPB控制模型来谈谈simulink代码生成,总结代码生成方法的同时也顺便回答他的问题. 1 ...

  3. simulink快捷键_从EPB模型谈谈Simulink代码生成

    前段时间有读者朋友问代码生成的例子,说他正在做EPB的仿真模型,但总是和应用串不到一块去,我这里就从一个简单EPB控制模型来谈谈simulink代码生成,总结代码生成方法的同时也顺便回答他的问题. 1 ...

  4. Simulink代码生成:目标硬件配置

    本文研究Simulink中关于目标硬件相关的配置. 文章目录 1 目标硬件的含义 2 Simulink中的硬件配置 3 代码中的位长度信息 4 总结 1 目标硬件的含义 不管运行什么软件,都是无法离开 ...

  5. Simulink代码生成:生成C++类

    博主最近在工作中用Simulink生成C++类的代码,因此将一些感悟记录下来.本文通过一个简单的例子研究Simulink生成C++类的代码以及一些相关配置. 文章目录 1 创建模型 2 C++类生成配 ...

  6. Simulink代码生成:生成ASAP2文件

    本文研究通过Simulink生成A2L文件的方法,以及其中的一些注意点. 文章目录 1 ASAP2文件 2 生成标定量.观测量的A2L文件 2.1 建模过程 2.2 配置界面 2.3 生成A2L文件 ...

  7. Simulink代码生成:Step函数接口配置

    本文研究Simulink生成代码时的step函数的名称和参数. 文章目录 1 问题引入 2 配置过程 3 代码生成 4 总结 1 问题引入 在之前的一篇博客<Simulink代码生成:Simul ...

  8. [FOC-Simulink]使用Simulink代码生成工具基于STM32开发板对永磁同步电机进行开环控制

    本文介绍使用Simulink代码生成功能在STM32开发板平台上运行永磁同步电机. 硬件基础: Nucleo-G431RB开发板 X-NUCLEO-IHM07M1驱动扩展板 57BLDC-24V-21 ...

  9. Simulink代码生成(二十二)——TSP开发之创建外部设备模块

    Simulink代码生成(二十二)--TSP开发之创建外部设备模块 文章目录 Simulink代码生成(二十二)--TSP开发之创建外部设备模块 一.C Mex Sfunction文件解读 一.C M ...

最新文章

  1. 开源社区的危机:拒绝被“白嫖”?2大著名项目遭作者破坏
  2. linux 初始化工作环境
  3. Extjs--FormPanel(2)
  4. matlab怎么整合成一个模块,Matlab如何将m文件制定成模块
  5. localToGlobal 本地转换全局
  6. BZOJ 1597 [Usaco2008 Mar] 土地购买
  7. springday04-go1
  8. 第二代支付系统专题之报文篇(二)大额支付报文完整版(含二代新增功能业务说明)...
  9. 阿里云SDK手册之java SDK
  10. 10多年IT从业者手把手教你备考信息系统项目管理师(简称高项)
  11. Matplotlib显示灰度图
  12. Java+MYSQL基于ssm的网上出差审批与费用报销管理系统
  13. 程序员,要不要考软考高级职称?
  14. 物联卡机卡分离后该怎么处理?教你一招就能解决!
  15. ASO代理业务浅析(一)aso服务商
  16. vue移动端项目微信公众号授权登录
  17. 读卡购票c语言程序,基于51单片机的c语言韦根卡读卡程序 门禁系统
  18. nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘email‘ not found. Availab
  19. 计算机学生英语面试自我介绍ppt,三星面试英语自我介绍.ppt
  20. 玩转百度竞价到底用哪种匹配模式比较好!

热门文章

  1. CIO40: IT管理者知识体系(长大以后)
  2. 2021年“韭零后”基民人群洞察:学历高也免不了被“割”
  3. matlab麻雀搜索算法(SSA)优化BP神经网络,权值和阈
  4. 推荐几款可以转换图片格式的软件
  5. Exploit writing tutorial part 3b : SEH Based Exploits – just another example
  6. 超酷的树莓派掌机ardupi发布!!!
  7. creator打包微信小游戏笔记
  8. 初学react native(脚手架与expo一些报错)
  9. 动漫的开始,我编程的登陆
  10. 卸载重新安装mysql会怎样_关于MySQL卸载重新安装的问题