Hyowinner的MBD技术论坛

 找回密码
 立即注册
搜索
查看: 171|回复: 2

生成代码数组大小问题

[复制链接]

3

主题

5

帖子

35

积分

MBD实习生

Rank: 1

积分
35
发表于 2026-5-15 10:51:38 | 显示全部楼层 |阅读模式
本帖最后由 .... 于 2026-5-15 10:53 编辑

定义了一个DataStoreMomery的数组,生成代码中该数组的大小直接就是定义数组大小的变量(该变量已经是define)初始值。如何将生成代码的数组大小变成一个宏而不是一个默认值
回复

使用道具 举报

79

主题

158

帖子

2554

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2554
发表于 2026-5-15 18:39:17 | 显示全部楼层
用一个数据对象定义数组维度变量,如
ARRAY_SIZE = Simulink.Parameter(10);
ARRAY_SIZE.CoderInfo.StorageClass = 'Define';
ARRAY_SIZE.CoderInfo.Identifier = 'ARRAY_SIZE';

将ARRAY_SIZE作为维度写入到DataStoreMemory模块里的Dimension。
回复

使用道具 举报

108

主题

281

帖子

4507

积分

管理员

校长

Rank: 9Rank: 9Rank: 9

积分
4507
QQ
发表于 2026-6-3 22:27:48 | 显示全部楼层
这个现象是正常的:Data Store Memory 的数组维度在模型编译/代码生成阶段必须先解析成确定数值,生成器默认会做常量求值,所以即使维度来自一个宏或参数,数组声明处也经常会被折叠成类似 `[64]` 这样的数字。

如果目标是让生成代码里保留宏名,可以按两个方向处理:

1. 如果只是希望维度符号尽量保留:
把数组长度做成 `Simulink.Parameter`,维度处直接填写这个参数名,并给这个参数配置合适的存储类,例如 `Define` / 自定义宏类 / imported define 一类的方式。不同 MATLAB 版本配置项名称略有差异,重点是让代码生成器知道这个量是代码级常量,而不是普通 MATLAB 变量。

2. 如果是工程集成场景,更推荐外部定义数组:
不要让 Simulink 生成这个数组定义,而是在自定义头文件和 C 文件里定义。

```c
/* my_mem.h */
#define MY_BUF_LEN 128
extern uint8_T MyBuf[MY_BUF_LEN];
```

```c
/* my_mem.c */
#include "my_mem.h"
uint8_T MyBuf[MY_BUF_LEN];
```

然后在 Simulink 里把对应 Data Store Memory / 数据对象配置成 `ImportedExtern`,让生成代码只引用这个外部变量。这样数组长度由你的宏控制,和底层 BSW、驱动或手写代码集成会更稳定。

简单说:如果仍由 Simulink 自动分配 DSM 内存,生成器倾向于输出固定数字;如果你必须在数组声明里保留宏名,最好把这块内存改成外部导入,由自己的头文件负责宏和数组声明。

-- HyowinnerBot 自动回复
持续学习 未来有你
基于场景 解决问题
项目合作联系微信:Hyowinners
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|MBD全栈技术学校|苏ICP备2025212294号-1|Hyowinner校长B站首页|手机版|小黑屋|Hyowinner的MBD技术论坛

GMT+8, 2026-6-25 05:13 , Processed in 0.099228 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表