通过一个简单的例子来理解simulink代码生成

本次所用硬件和软件

硬件:飞思卡尔XEP100
软件:simulink2018a

实现功能

LED灯闪烁

模型搭建

在这里插入图片描述
在这里插入图片描述

simulink代码生成配置

1.ctrl+e打开设置,设置为固定步长
在这里插入图片描述

2.选择系统目标语言(其实就是选择TLC的一个模板)
勾选Generate code only(目的是为了防止生成exe文件,意义不大,省事)
你好你好你好
3.勾选code packing中compact(目的是生成文件少,在自己移值时候方便点)
在这里插入图片描述
4.另外,可以选择自动生成报告(不生成也可以,可以提前看看生成的代码),如果不勾选,记得自动代码保存的路径与打开matlab工作路径相同
在这里插入图片描述
其他配置可以更加个性化代码的生成样式,这里暂时先不谈。

数据词典的建立

什么是数据字典,作用是什么,怎么关联,可以直接看这位大神的Simulink代码生成:数据字典的建立、关联模型(俺也是跟他学的)
我们这个例子中,只需要2个变量,其配置数据类型如下:
1.flag作为模型输出量,选择ExportGlobal(一般输出量我都选这个),类型选择uint8,因为后续只需要拿它做0和1,选最小的就行。
另外,对于ExportGlobal,initial value不设置比较好,设置了生成就为结构体了,所以我一般不设置(个人水平有限,不知道别的办法了)
在这里插入图片描述
2.cnt(因为懒得写count,就是计数用的),选择Global(原因是因为cnt作为函数局部变量,如果自动代码生成会配置为结构体类型,看着难受,所以选Global),对应的stateflow模型中的变量设为data store memory,这样生成的cnt就为全局变量了。
在这里插入图片描述

值得一提的是,数据字典中的变量类型要和stateflow里面的一样。

开始生成代码

在配置结束后直接选择用ctrl+b快捷键生成,在哪里配置呢,这里

进入界面后,一般只需要在下面 Word Size界面选择对应型号单片机就可以了,如果找不到对应型号(比如51单片机就找不到),也没有关系,因为它的意义在于选择数据类型与字节对应关系,你自己填写相应的也一样。
在这里插入图片描述

代码的简单分析

1.先不看别的,文件个数为四个(选择compact的缘故),需要用到的是后面三个,ert_main.c不用,因为实际main.c要自己去配置。
在这里插入图片描述
在这里插入图片描述
上面这张图片,对应着生成的 rtwtypes.h文件,相当于生成代码与单片机的数据类型对接了,反应在下面图片代码里面。
在这里插入图片描述

2.对于代码的布置结构,其实和 选择的TLC(目标语言编译)有关,默认的结果如下:
在这里插入图片描述

3.其他细化的先不说,目前只需要知道A5_blink.c文件中的三个函数,如下
在这里插入图片描述
用到的只有A5_blink_initialize和A5_blink_step,一个是初始化函数,一个是说明模型作用的函数,terminate()我还没用到过。
上面生成的3个,直接放进去

开始移植到单片机

飞思卡尔用的编译器是codewarrior(用过最难用的编译器,感觉比记事本还难用)
在这里插入图片描述

main.c配置

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
 #include "A5_blink.h"
 #include "rtwtypes.h"
#define LED PORTB_PB0
#define LED_dir  DDRB

unsigned char flag=0;



void zzz(void) 
{
LED=flag ;

}
/*************************************************************/
/*                        延时函数                           */
/*************************************************************/
   void delay(void) 
{                                                
  
  unsigned int i,j;
  for(j=0;j<2;j++)
  for(i=0;i<60000;i++) ;
    
}          


/*************************************************************/
/*                          主函数                           */
/*************************************************************/
void main(void) {
	DisableInterrupts;
	A5_blink_initialize();
  LED_dir=0x01 ;     //设置为输出
	EnableInterrupts;


  for(;;) 
  {  
        delay();
          A5_blink_step();
              zzz() ;
         
   
  } 

}

资源可自行下载

在initialize函数中添加初始值得方法

设置一个变量,定义为datamemory,然后设置一个初始值,那么生成的代码中会在initialize()函数中自带这个变量的初始值。
如果设置变量为datamemory,需要把变量的Dimensions设为1,Dimensions mode设为auto,Complexity为real。

  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值