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

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

[复制链接]

该用户从未签到

8

主题

26

回帖

142

积分

注册会员

积分
142
发表于 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都是什么?应该存放在芯片的什么位置呢?有大佬能指点一二吗?



回复 送花

使用道具 举报

  • TA的每日心情
    开心
    昨天 08:16
  • 签到天数: 96 天

    [LV.6]常住居民II

    40

    主题

    1002

    回帖

    6920

    积分

    荣誉版主

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

    积分
    6920
    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

    主题

    31

    回帖

    132

    积分

    注册会员

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

    点评

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:16
  • 签到天数: 158 天

    [LV.7]常住居民III

    9

    主题

    307

    回帖

    3759

    积分

    荣誉版主

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

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

    使用道具 举报

    该用户从未签到

    1

    主题

    33

    回帖

    113

    积分

    注册会员

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-12 18:44 , Processed in 0.062061 second(s), 49 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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