0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于如何定义结构体的分析和介绍

MATLAB 来源:djl 作者:柚籽 2019-09-16 10:31 次阅读

我们来聊聊结构体。

E-Coder 在做自动代码生成的时候,在默认情况下,它会把所有的输入信号定义为一个结构体_U,把所有的输出信号定义为另一个结构体_Y,把所有的参数定义为一个结构体_P。虽然这样的结构体不一定是我们想要的,但至少,说明自动代码生成是支持结构体的。

本文并不解决“哪些情况下应该使用结构体”这个问题,这里来说说:

怎么实现我想要的结构体?

从之前的文章中我们说到,自动生成代码时,想让各种信号、参数定义和声明采用什么样的方式,都是通过数据对象 (Data Object) 来实现的。那,如果我希望把信号 a ,b,c 或者参数 k1,k2,k3 定义为一个结构体,该怎么实现呢?

构造结构体

要得到:

typdef struct {

double k1;

double k2;

double k3;

} kk_type;

kk_type kk={2.0,3.0,4.0};

怎么做:

设置数据对象的Storage Class属性为 Struct

或者使用Simulink Bus来定义新的结构体类型 outyy

举个例子

1.新建如下的简单模型并生成代码

先看一下 “正常的” 不使用结构体的情况:

关于如何定义结构体的分析和介绍

看下面这张图,定义好了对应的信号数据对象 (Simulink.Signal) u1、u2、u3、yy1、yy2、yy3,与参数数据对象(Simulink.Parameter) k1、k2、k3。

通过名字对应以及关联操作,实现关联,也就是上图中的蓝色小叉子。具体如何操作以前介绍过。

关于如何定义结构体的分析和介绍

Ctrl + B,生成代码:

关于如何定义结构体的分析和介绍

2.把参数 k1、k2、k3 放在指定的结构体 kk 里

选中数据对象 k1,k2,k3,把 StorageClass 都设置为 Struct(Custom),并指定结构体名字为 kk。这样在自动生成代码时,这几个参数会自动放入结构体 kk 中。

关于如何定义结构体的分析和介绍

看到,在生成的代码里,得到一个新的结构体类型 kk_type:

关于如何定义结构体的分析和介绍

并且,根据这几个参数的值,得到了结构体变量 kk:

关于如何定义结构体的分析和介绍

3.把信号 yy1、yy2、yy3 也放在一个输出结构体里

刚才的参数结构体是通过设置数据对象的 StorageClass 为 Struct 来实现的。而现在,以信号为例,使用另一种方式来实现这个目的: Simulink Bus。

a.首先,通过 Simulink Bus 来定义一个新的结构体数据类型 outyy:

关于如何定义结构体的分析和介绍

定义这个 Bus 的结构,里面的成员名就是最后出现在代码里的名字:

关于如何定义结构体的分析和介绍

那么此时,一个新的数据类型就构造好了。将来在生成代码时,这个新的结构体类型就是这样:

关于如何定义结构体的分析和介绍

数据类型定义好了,接着,我们就要来用它了。

b. 把 Simulink 的三个输出信号使用 Bus Creator 模块变成总线信号,取名叫 outStruct:

关于如何定义结构体的分析和介绍

设置这个 Bus Creator 模块的数据类型为刚定义好的结构体 outyy。另外,还得勾选它为非虚拟总线。那么这样,它在生成代码时,就会被当做结构体来看:

关于如何定义结构体的分析和介绍

c. 如同之前每一个 double\single 类型的信号一样,接着,也为 outStruct信号定义一个同名的数据对象 outStruct。

在 Simulink 模型上的 outStruct 信号线的属性界面上勾选关联到这个数据对象,得到蓝色小叉子。

关于如何定义结构体的分析和介绍

4. 最后生成代码

关于如何定义结构体的分析和介绍

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6512

    浏览量

    87601
  • 数据类型
    +关注

    关注

    0

    文章

    228

    浏览量

    13499
  • 结构体
    +关注

    关注

    1

    文章

    125

    浏览量

    10750
收藏 人收藏

    评论

    相关推荐

    定义了一个结构,但是分配的地址不连续,为什么?

    定义了一个结构,但是分配的地址不连续,是KEIL的问题还是我的问题?
    发表于 04-26 08:12

    求助,关于G031ADC结构设置的几个疑问求解

    本人在使用ADC时想使用多通道模式,所以便在CUBEMX上将十九个通道全部打开(包括三个内部通道),生成代码以后详细看了一下结构的配置发现有几个疑惑, 1.ADC通道分为规则通道和注入通道,那么
    发表于 03-15 07:03

    求助,请问一个结构如何全部定义到 __attribute__ 区域?

    请问一个结构如何全部定义到 __attribute__ 区域? 例如我这里涉及到一些高速计算的缓存,计划将缓存数据存储到 __attribute__ 区域。 三个结构
    发表于 01-16 07:29

    为什么我定义结构不能用-->来调用结构的元素?

    结构代码部分 typedef unsigned int uint_32t; typedef unsigned short uint_16t; typedef struct { uint_32t
    发表于 11-11 19:06

    求助,结构变量定义引用问题求解

    |= mask; } 如以上语句,GPIO_Type是个结构定义定义了一个*base变量,在引用其中的成员时,是base->IMR的方式。这怎么理解; 如果是
    发表于 10-27 06:06

    FAQ0066结构成员未完全初始化导致程序异常的解决方法

    使用非官方程序,由于某些外设驱动在配置结构时,未完全初始化所有成员,导致程序运行异常。以 FSMC 为例,FSMC_NORSRAMInitStructure 结构共有 15 个成员
    发表于 10-20 06:59

    如何在DEBUG的时候实时观察SYSTICK结构的数据?

    在DEBUG这个delay函数的时候,想要观察SysTick指向的结构数据变化,但是添加了SysTick到Watch1中,观察不了。 目前是定义了一个u32 temp采用了将SysTick中
    发表于 10-18 06:29

    为什么ST库函数结构没加对齐地址是连续的?

    为什么ST库函数结构没加对齐,地址是连续的
    发表于 10-15 08:11

    结构在FLASH的存放中,数据地址是连续的吗?

    结构在FLASH的存放中,数据地址是连续的吗
    发表于 10-12 06:06

    结构struct和联合体union的区别?

    结构struct和联合体union的区别?
    发表于 10-11 08:21

    结构为什么有的时候用点,有的时候用箭头?

    结构为什么有的时候用点,有的时候用箭头
    发表于 10-10 07:18

    keil MDK中程序读写结构成员进入HARDFAUL HANDLE RET为什么无法读写?

    大家好,请教一个问题,因需要我现在讲程序从IAR转入到keil之中,但是碰到一个奇怪的问题,是这样,我声明了一个结构,如下: #pragma pack(push) //保存对齐状态 #pragma
    发表于 08-25 07:58

    关于农林气象站的基本介绍

    关于农林气象站的基本介绍
    的头像 发表于 08-23 16:58 255次阅读

    关于G031 ADC结构设置的几个问题

    本人在使用ADC时想使用多通道模式,所以便在CUBEMX上将十九个通道全部打开(包括三个内部通道),生成代码以后详细看了一下结构的配置发现有几个疑惑, 1.ADC通道分为规则通道和注入通道,那么
    发表于 08-04 06:01

    IAR开发M453时出现定义结构错误的原因?

    在使用IAR开发M453时出现了一个问题,定义一个空结构就会报错,但是在结构中添加成员编译正常; 首先我想是不是对
    发表于 06-25 07:35