找回密码
 立即注册
查看: 1961|回复: 4

向各位大佬请教一个有关 data edata hdata const cod的问题

[复制链接]

8

主题

26

回帖

144

积分

注册会员

积分
144
发表于 2023-5-10 17:15:33 | 显示全部楼层 |阅读模式

在STM32中编译之后会出现:Program Size: Code=16788 RO-data=400 RW-data=56 ZI-data=7408  
向各位大佬请教一个有关 data edata hdata const  cod的问题-1.png 向各位大佬请教一个有关 data edata hdata const  cod的问题-2.png

Code:        用户写的代码所占用的空间,本质上就是一大堆ARM指令                                      --------- 内部Flash
RO-data:     只读常量大小(const常量,#define宏常量。)                                            --------- 内部Flash
RW-data:    读写数据段,存放初始化为非0值的全局变量                                             --------- 内部Flash
ZI-data:       零数据段,存放未初始化的全局变量,以及初始化为0的变量。                --------- 内部Flash

RO Size   = (Code-Data+RO-data)            表明程序占用Flash空间的大小
RW Size   = (RW-data+ZI-data)               表示运行时占用的RAM的大小

ROW Size = ( Code +RO-data+RW-data)     表示烧写程序所占用的Flash空间的大小


程序运行之前,需要有文件实体被烧录到 STM32 的 Flash 中,一般是 bin 或者 hex 文件,该被烧录文件称为可执行映像文件。

也就是说Flash的占用量就是ROM Size ----- ARM指令代码+只读数据+非0初始化变量的初值

系统上电之后,默认从Flash启动。启动之后会将RW(RW-data+ZI-data)中的RW-data搬运到RAM中(RAM就是内存(运存),ROM就是Flash(硬盘))

也就是说RAM的占用量就是RW Size ---- 非0初始化变量、0初始化RAM(又分为0初始化静态变量区+堆区+栈区)


使用STC32G12K128在keil里面编译之后会出现:Program Size: data=9.4 edata+hdata=480 xdata=192 const=136 code=7566这样的输出

向各位大佬请教一个有关 data edata hdata const  cod的问题-3.png

向各位大佬请教一个有关 data edata hdata const  cod的问题-4.png

STC32G12K128芯片,是有4K的内部RAM(edata)8K的内部扩展RAM(xdata)以及128K的FLASH

向各位大佬请教一个有关 data edata hdata const  cod的问题-5.png

在8M可寻址的程序空间中,STC32G12K128只用到了FF:FFFF --  FE:0000总共128K,其中FF:FFFF -- FF:0000(64K)为Code区域与传统的8051兼容,其中FE:FFFF -- FE:0000(64K)为ecode区域

向各位大佬请教一个有关 data edata hdata const  cod的问题-6.png

在8M可寻址的数据空间中,STC32G12K128只使用了00:0000 -- 00:0FFF总共4K的edata和01:0000 -- 01:1FFF总共8K的xdata


回到我们最初的问题中 Program Size: data=9.4 edata+hdata=480 xdata=192 const=136 code=7566 都是什么?
code:应该是我们编写的代码
const:是不是就是只读常量
那xdata、data、edata、hdata都是什么?应该存放在芯片的什么位置呢?有大佬能指点一二吗?



回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-5-10 17:29:56 | 显示全部楼层
算好存储大小不超的情况下直接关键词指定区域,例如:


u8 xdata reg_value[256];


u8 data reg_num;
要想简单的话这样子直接用就好了,高端的玩法的话直接指定地址,例如
const unsigned char PLC_ROM[0x8000] _at_ 0xfe0000 = {0};

回复 支持 反对

使用道具 举报 送花

7

主题

26

回帖

132

积分

注册会员

积分
132
发表于 2023-6-30 12:24:28 | 显示全部楼层
为啥LEIL251xdata关键字变红Edata不变红。唉,各种不确定的事。

点评

可以在配置中自行添加edata字段  详情 回复 发表于 2023-6-30 13:53
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

积分
4501
发表于 2023-6-30 13:53:12 | 显示全部楼层
伽*** 发表于 2023-6-30 12:24
为啥LEIL251xdata关键字变红Edata不变红。唉,各种不确定的事。

可以在配置中自行添加edata字段
回复 支持 反对

使用道具 举报 送花

1

主题

33

回帖

115

积分

注册会员

积分
115
发表于 2023-10-9 15:34:27 | 显示全部楼层
之前比赛的时候发现edata段好像掉电不消失,一直没搞懂为什么原因
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:25 , Processed in 0.266988 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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