通过一个简单的例子来理解simulink代码生成
- 本次所用硬件和软件
- 实现功能
- 模型搭建
- simulink代码生成配置
- 数据词典的建立
- 开始生成代码
- 代码的简单分析
- 开始移植到单片机
- main.c配置
- 在initialize函数中添加初始值得方法
本次所用硬件和软件
硬件:飞思卡尔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。
最后
以上就是优雅芒果最近收集整理的关于通过一个简单的例子来理解simulink代码生成本次所用硬件和软件实现功能模型搭建simulink代码生成配置数据词典的建立开始生成代码代码的简单分析开始移植到单片机main.c配置在initialize函数中添加初始值得方法的全部内容,更多相关通过一个简单内容请搜索靠谱客的其他文章。
发表评论 取消回复