硬汉嵌入式论坛

 找回密码
 立即注册
查看: 788|回复: 14
收起左侧

[MDK] 怎么通过条件编译代码,更改起始ROM地址?

[复制链接]

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
发表于 2023-3-30 13:30:53 | 显示全部楼层 |阅读模式
比如我们需要把一个程序做成app时,需要把默认的起始flash地址更改为0x08010000,一般都是更改mdk的设置选项。

能不能,通过#ifdefine之类的代码来实现这个功能?
Snipaste_2023-03-30_13-28-12.png
回复

使用道具 举报

2

主题

13

回帖

24

积分

新手上路

积分
24
发表于 2023-3-30 14:08:10 | 显示全部楼层
可以用scf文件来定义,如果要涉及到宏的话,需要再scf文件中增加#! armcc -E

给一个例子,可以参考一下。
#! armcc -E

#if (defined(__ram_vector_table__))
  #define __ram_vector_table_size__    0x00000400
#else
  #define __ram_vector_table_size__    0x00000000
#endif

#define m_interrupts_start             0x00000000
#define m_interrupts_size              0x00000400

#define m_flash_config_start           0x00000400
#define m_flash_config_size            0x00000010

#define m_text_start                   0x00000410
#define m_text_size                    0x0003FBF0

#define m_interrupts_ram_start         0x1FFFC000
#define m_interrupts_ram_size          __ram_vector_table_size__

#define m_data_start                   (m_interrupts_ram_start + m_interrupts_ram_size)
#define m_data_size                    (0x00004000 - m_interrupts_ram_size)

#define m_data_2_start                 0x20000000
#define m_data_2_size                  0x0000C000

/* Sizes */
#if (defined(__stack_size__))
  #define Stack_Size                   __stack_size__
#else
  #define Stack_Size                   0x0400
#endif

#if (defined(__heap_size__))
  #define Heap_Size                    __heap_size__
#else
  #define Heap_Size                    0x0400
#endif

LR_m_text m_text_start m_text_size {   ; load region size_region
  ER_m_text m_text_start m_text_size { ; load address = execution address
    * (InRoot$$Sections)
    .ANY (+RO)
  }
  RW_m_data m_data_start m_data_size { ; RW data
    .ANY (+RW +ZI)
  }
  RW_m_data_2 m_data_2_start m_data_2_size-Stack_Size-Heap_Size { ; RW data
    .ANY (+RW +ZI)
  }
  ARM_LIB_HEAP ((ImageLimit(RW_m_data_2) == m_data_2_start) ? ImageLimit(RW_m_data) : +0) EMPTY Heap_Size { ; Heap region growing up
  }
  ARM_LIB_STACK m_data_2_start+m_data_2_size EMPTY -Stack_Size { ; Stack region growing down
  }
}

LR_m_interrupts m_interrupts_start m_interrupts_size {
#if (!defined(__ram_vector_table__))
  VECTOR_RAM m_interrupts_start EMPTY 0 {
  }
#endif
  VECTOR_ROM m_interrupts_start m_interrupts_size { ; load address = execution address
    * (RESET,+FIRST)
  }
}

LR_m_flash_config m_flash_config_start m_flash_config_size {
  ER_m_flash_config m_flash_config_start m_flash_config_size { ; load address = execution address
    * (FlashConfig)
  }
}

#if (defined(__ram_vector_table__))
LR_m_interrupts_ram m_interrupts_ram_start m_interrupts_ram_size {
  VECTOR_RAM m_interrupts_ram_start EMPTY m_interrupts_ram_size {
  }
}
#endif

回复

使用道具 举报

19

主题

371

回帖

428

积分

高级会员

积分
428
发表于 2023-3-30 14:21:19 | 显示全部楼层
应该不可以,这个是生成加载文件用(类似IAR的icf)
回复

使用道具 举报

19

主题

371

回帖

428

积分

高级会员

积分
428
发表于 2023-3-30 14:22:21 | 显示全部楼层
用于链接阶段的
回复

使用道具 举报

39

主题

199

回帖

326

积分

高级会员

积分
326
发表于 2023-3-30 14:46:32 | 显示全部楼层
新建一个工程即可。

下载.png

两个工程的配置可以完全不同。

下载+(1).png



评分

参与人数 1金币 +50 收起 理由
caicaptain2 + 50 很给力!

查看全部评分

回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
 楼主| 发表于 2023-3-30 15:31:52 | 显示全部楼层
yinjinzhong 发表于 2023-3-30 14:08
可以用scf文件来定义,如果要涉及到宏的话,需要再scf文件中增加#! armcc -E

给一个例子,可以参考一下 ...

sct文件里面也可以使用预编译的#xxx 语法吗?

这个似乎是需要手动更换分散加载文件sct来实现?
那么还是需要操作mdk的项目配置对话框啊。
回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
 楼主| 发表于 2023-3-30 15:39:05 | 显示全部楼层

这个可行性比较好。同一个项目的2个版本可以使用不同的项目配置对话框。
但是这2个版本必须共享代码段。那么这个VECT_TAB_OFFSET地方的差异没有办法使用宏定义开关切换啊?
Snipaste_2023-03-30_15-37-15.png
回复

使用道具 举报

39

主题

199

回帖

326

积分

高级会员

积分
326
发表于 2023-3-30 15:58:03 | 显示全部楼层
caicaptain2 发表于 2023-3-30 15:39
这个可行性比较好。同一个项目的2个版本可以使用不同的项目配置对话框。
但是这2个版本必须共享代码段。 ...

把你的宏定义,写到这里即可。

回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
 楼主| 发表于 2023-3-30 16:00:21 | 显示全部楼层
caicaptain2 发表于 2023-3-30 15:39
这个可行性比较好。同一个项目的2个版本可以使用不同的项目配置对话框。
但是这2个版本必须共享代码段。 ...

想到一个办法了。

利用项目配置对话框里面的定义选项:
Snipaste_2023-03-30_15-49-23.png

然后在代码中使用预编译宏定义:
Snipaste_2023-03-30_15-58-35.png

然后搞定。
工具栏上面切换项目配置即可。
回复

使用道具 举报

19

主题

371

回帖

428

积分

高级会员

积分
428
发表于 2023-3-30 16:59:54 | 显示全部楼层
相当于传入C编译器的宏了
回复

使用道具 举报

1

主题

109

回帖

112

积分

初级会员

固件開發工程師

积分
112
QQ
发表于 2023-3-30 17:03:33 | 显示全部楼层
yinjinzhong 发表于 2023-3-30 06:08
可以用scf文件来定义,如果要涉及到宏的话,需要再scf文件中增加#! armcc -E

给一个例子,可以参考一下 ...
正解!
确实是要自己写Scatter了,我来补充一个armclang的写法,这个当年也花了不少时间Study
[C] 纯文本查看 复制代码
#! armclang --target=arm-arm-none-eabi -mcpu=cortex-m4 -E -x c

;Reference:
;[url]http://www.keil.com/support/man/docs/armclang_intro/armclang_intro_pge1362066010024.htm[/url]

#include "..\..\platform\inc\mem_config.h"



回复

使用道具 举报

19

主题

371

回帖

428

积分

高级会员

积分
428
发表于 2023-3-30 17:59:28 | 显示全部楼层
----- 发表于 2023-3-30 17:03
正解!
确实是要自己写Scatter了,我来补充一个armclang的写法,这个当年也花了不少时间Study
[mw_sh ...

有标准模板吗?实际工作还是很有用的
回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
 楼主| 发表于 2023-3-31 14:20:44 | 显示全部楼层
caicaptain2 发表于 2023-3-30 16:00
想到一个办法了。

利用项目配置对话框里面的定义选项:

今日发现自己踩坑了。。。
在工具栏切换了项目配置(从app切换到常规)后,下载程序成功,执行失败。 按F7(build),下载成功,执行失败。
原因,需要选择“Rebuild all”,再下载,才能正常运行。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2023-3-31 15:51:57 | 显示全部楼层
caicaptain2 发表于 2023-3-31 14:20
今日发现自己踩坑了。。。
在工具栏切换了项目配置(从app切换到常规)后,下载程序成功,执行失败。 按F7 ...

MDK的老毛病了。
回复

使用道具 举报

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 2023-3-31 16:46:06 | 显示全部楼层
子工程方式就够用了,挺简单的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 00:24 , Processed in 0.431043 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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