硬汉嵌入式论坛

 找回密码
 立即注册
搜索
查看: 428|回复: 12
收起左侧

[IAR] 如何在IAR种定义一段数组在中间某个位置呢?

[复制链接]

1

主题

17

回帖

20

积分

新手上路

积分
20
发表于 2026-9-26 10:25:45 | 显示全部楼层 |阅读模式
开发APP+IAP的时候为了使两部分的比如版本信息使双方都能读取到,分别固定在某一个位置定义了对应的版本等信息,在使用MDK时是可以的,但是由于某些原因只能使用IAR进行开发,在使用IAR的时候则在定义的数组前到起始中断向量那部分空间全部为空,导致了大面积的空间浪费,不知道有没有哪位了解这个怎么解决好呢?大家有没有相同的情况
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124240
QQ
发表于 2026-9-26 15:11:10 | 显示全部楼层
测试了下,没问题

234.png

点评

版主你的图看不到 我需要把内容放置在比如0x2000的位置,用MDK就没问题,IAR前面就空着的,  详情 回复 发表于 2026-9-27 21:59
回复

使用道具 举报

2

主题

46

回帖

52

积分

初级会员

积分
52
发表于 2026-9-26 15:53:33 | 显示全部楼层
不需要处理,程序小的话空出来没影响,程序大的话IAR会把这块分配上的
可以把版本信息的变量地址放到flash的最后一个扇区, IAR能够正常链接生成bin文件

点评

我有个应用场景是把版本信息放置在固定的一个位置,这样BOOT能读取APP的版本,而APP也能读取到BOOT的版本,如果放在后面就没法统一了,  详情 回复 发表于 2026-9-27 22:00
回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2026-9-27 21:59:07 | 显示全部楼层
eric2013 发表于 2026-9-26 15:11
测试了下,没问题

版主你的图看不到

我需要把内容放置在比如0x2000的位置,用MDK就没问题,IAR前面就空着的,

回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2026-9-27 22:00:42 | 显示全部楼层
Dravince 发表于 2026-9-26 15:53
不需要处理,程序小的话空出来没影响,程序大的话IAR会把这块分配上的
可以把版本信息的变量地址放到flash ...

我有个应用场景是把版本信息放置在固定的一个位置,这样BOOT能读取APP的版本,而APP也能读取到BOOT的版本,如果放在后面就没法统一了,

点评

我举的例子是解释向量表到版本信息变量之间有一大片地址空间空白浪费掉了的问题 你的需求就BOOT版本定义到A地址,APP版本信息定义到B地址,APP里面读取A地址就能获取BOOT的版本信息 上面的前提是两个地址都是预先  详情 回复 发表于 2026-9-28 01:13
回复

使用道具 举报

2

主题

46

回帖

52

积分

初级会员

积分
52
发表于 2026-9-28 01:13:15 | 显示全部楼层
huxiaoping 发表于 2026-9-27 22:00
我有个应用场景是把版本信息放置在固定的一个位置,这样BOOT能读取APP的版本,而APP也能读取到BOOT的版本 ...

我举的例子是解释向量表到版本信息变量之间有一大片地址空间空白浪费掉了的问题
你的需求就BOOT版本定义到A地址,APP版本信息定义到B地址,APP里面读取A地址就能获取BOOT的版本信息
上面的前提是两个地址都是预先定义好的固定地址,如果变量地址不固定,那就把读取的函数做成函数指针结构体,把结构体放到固定位置,总之要有一组固定地址才行
我是把各自的版本信息放到固定位置

点评

如果放置到后面确实是可以的,程序代码已经小于那个位置本身就没问题,但是我的MCU有的有的大,有的小,想把所有的都定义在比如0X1000的位置,这样的好处是方便统一管理以及可以做别的用,所以想定义到前面一些,但  详情 回复 发表于 昨天 13:28
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
发表于 2026-9-28 09:51:31 | 显示全部楼层
先自定义 section,再修改 .icf文件应该可以
回复

使用道具 举报

8

主题

30

回帖

54

积分

初级会员

积分
54
发表于 2026-9-28 22:29:07 | 显示全部楼层
IAR8.x+ 和 MDK通用

#ifndef __ROOT
#if defined __CC_ARM
#define __ROOT
#elif defined __ICCARM__
#define __ROOT __root
#endif
#endif


/*------ 私有变量  ------------------------------------------------------------*/

//文件:wx_bootloader.bin,bootloader引导文件
__ROOT static unsigned char const _acwx_bootloader[3368] __attribute__((section(".ARM.__at_0x08000000"))) =
{
}

点评

尝试了很多定义的方法,基本都是这样的效果  详情 回复 发表于 昨天 13:30
回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 昨天 13:28 | 显示全部楼层
Dravince 发表于 2026-9-28 01:13
我举的例子是解释向量表到版本信息变量之间有一大片地址空间空白浪费掉了的问题
你的需求就BOOT版本定义 ...

如果放置到后面确实是可以的,程序代码已经小于那个位置本身就没问题,但是我的MCU有的有的大,有的小,想把所有的都定义在比如0X1000的位置,这样的好处是方便统一管理以及可以做别的用,所以想定义到前面一些,但是始终好像无法解决这个位置空置的问题
回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 昨天 13:30 | 显示全部楼层
dwj00 发表于 2026-9-28 22:29
IAR8.x+ 和 MDK通用

#ifndef __ROOT

尝试了很多定义的方法,基本都是这样的效果

尝试了很多定义的方法,基本都是这样

尝试了很多定义的方法,基本都是这样
回复

使用道具 举报

2

主题

46

回帖

52

积分

初级会员

积分
52
发表于 昨天 17:30 | 显示全部楼层
huxiaoping 发表于 2026-10-8 13:28
如果放置到后面确实是可以的,程序代码已经小于那个位置本身就没问题,但是我的MCU有的有的大,有的小, ...

你没明白我的意思,你现在空出来了1KB的空间,当你的代码足够大的时候,编译器会把这一块用起来的,不会浪费

点评

我有几十K的也还是空着的,你的意思是这个需要满的情况才会被使用吗?  详情 回复 发表于 3 小时前
回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 3 小时前 | 显示全部楼层
Dravince 发表于 2026-10-8 17:30
你没明白我的意思,你现在空出来了1KB的空间,当你的代码足够大的时候,编译器会把这一块用起来的,不会 ...

我有几十K的也还是空着的,你的意思是这个需要满的情况才会被使用吗?
回复

使用道具 举报

8

主题

27

回帖

51

积分

初级会员

积分
51
发表于 2 小时前 | 显示全部楼层
之前在flash紧张的时候,研究过,现在忘了。网站下载的有早些资料,我记得整个。c,编译成。O文件,可以在icf文件里排放,变量,函数可以在文件里用指定写法添加。提供一些附件,可能比较旧,参考。

在特定部分中放置一组函数或变量 _内审.pdf

248.59 KB, 下载次数: 0

将一组函数或变量放在特定部分 _ IAR系统.pdf

348.53 KB, 下载次数: 0

在 RAM 中放置一个库 _ IAR系统.pdf

258.94 KB, 下载次数: 0

回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-10-9 18:01 , Processed in 0.221587 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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