找回密码
 立即注册
楼主: 一笔长空

程序太大flash不够问题

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:466
  • 最近打卡:2025-06-16 09:07:17

17

主题

533

回帖

1398

积分

金牌会员

积分
1398
发表于 2024-4-5 11:23:37 | 显示全部楼层
yja*** 发表于 2024-4-5 10:08
要是差距不太大的话,注释掉一部分warning的提示没有用到代码。

Warning的代码会被编译器自动优化掉吗?
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:448
  • 最近打卡:2025-06-17 09:05:03

0

主题

170

回帖

1301

积分

金牌会员

积分
1301
发表于 2024-4-5 18:21:21 | 显示全部楼层
默认情况下,Warning L16的代码段会被linker加到flash里面,虽然没用到。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-17 06:26:47
已绑定手机

19

主题

3231

回帖

5285

积分

论坛元老

积分
5285
发表于 2024-4-5 21:01:53 | 显示全部楼层
嵌入*** 发表于 2024-4-5 11:23
Warning的代码会被编译器自动优化掉吗?

一般不会
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-03-28 23:40:34

0

主题

36

回帖

268

积分

中级会员

积分
268
发表于 2024-6-20 01:00:13 来自手机 | 显示全部楼层
加个FATFS够呛了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:437
  • 最近打卡:2025-06-17 09:05:06

8

主题

106

回帖

331

积分

中级会员

积分
331
发表于 2024-7-25 10:21:31 | 显示全部楼层
社区*** 发表于 2024-4-3 12:21
1. 使用Keil的优化级别9将代码优化,可以进一步节省程序空间
2. 使用"REMOVEUNUSED"。
  把target options ...

,我之前胡乱设置的,改成9后编译空间占用明显减少
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:392
  • 最近打卡:2025-06-13 09:05:42
已绑定手机

29

主题

306

回帖

670

积分

高级会员

积分
670
发表于 2024-7-25 11:12:17 | 显示全部楼层
社区*** 发表于 2024-4-3 12:21
1. 使用Keil的优化级别9将代码优化,可以进一步节省程序空间
2. 使用"REMOVEUNUSED"。
  把target options ...

有些变量就要加 volatile 关键字。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:125
  • 最近打卡:2025-06-04 21:38:29
已绑定手机

60

主题

782

回帖

4027

积分

论坛元老

自定义头衔

积分
4027
发表于 2024-10-31 22:01:15 | 显示全部楼层
社区*** 发表于 2024-4-3 12:21
1. 使用Keil的优化级别9将代码优化,可以进一步节省程序空间
2. 使用"REMOVEUNUSED"。
  把target options ...

我今天才学会这一招,赞一个!

Keil默认设置太保守了,不调用的函数竟然也会被链接进最终的二进制文件里……
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:125
  • 最近打卡:2025-06-04 21:38:29
已绑定手机

60

主题

782

回帖

4027

积分

论坛元老

自定义头衔

积分
4027
发表于 2024-10-31 22:54:51 | 显示全部楼层
关于楼主提到的

【文件大小超出程序区范围,超出部分已被自动移到EEPROM区】

“提示将程序放到了eeprom里,这样程序能正常运行吗?”

答案是:
大部分STC51单片机都是能正常运行的!但是STC89C52等型号不行

以STC89C52RC为例,标称8KB flash,6KB eeprom

flash和eeporm均位于8051处理器的CODE地址空间中,该空间为16位空间,最大支持64KB寻址。8051处理器的程序代码必须放在CODE区里运行
截图202410312241367770.jpg

flash的地址为CODE空间的 0x0000~0x1FFF


eeprom的地址为CODE空间的 0x2000~0x37FF (以6KB版本为例)
这两段地址是完全连续的。所以如果8KB不够,那么多余的代码自动分割至eeprom区,也是完全可以正常运行的!

然而STC89C52型号(这是个过渡型号,目前已经停产,在产的是STC89C52RC
截图202410312252187092.jpg

flash的地址为CODE空间的 0x0000~0x1FFF(但是最后7字节是芯片ID)


eeprom的地址为CODE空间的 0x2000~0x37FF (以6KB版本为例)

所以可用的空间是0x0000~0x1FF8和0x2000~0x37FF,中间有7个字节是断开的,不能连续访问!!!所以不能简单做分割处理:【超出部分自动移到EEPROM区】

另外需要明确一个概念。STC单片机内的所谓的EEPROM,和24c02这种真正的EEPROM器件具有如下异同:

相同点:
可以用单片机程序控制擦写
断电不丢失


不同点:
STC单片机内的EEPROM实际是一段flash区,只是通过特殊的设计,使其可以通过程序控制擦写。其中,擦除需要以页为单位(512字节必须同时全部被擦),写以字节为单位(1字节)
24c02采用了真正的EEPROM器件架构,允许单字节独立改写
值得注意的是:IAP的STC单片机,全部flash区都允许通过程序控制擦写!实现了所有flash区,既是flash,又是eeprom

截图202410312239062396.jpg


联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:396
  • 最近打卡:2025-06-17 00:04:36
已绑定手机

142

主题

1688

回帖

2563

积分

金牌会员

积分
2563
发表于 2024-11-1 00:18:32 来自手机 | 显示全部楼层
我记得之前一位大佬说,为了让空间够用,特意学了汇编
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:204
  • 最近打卡:2025-06-12 08:24:22
已绑定手机

36

主题

175

回帖

1363

积分

金牌会员

积分
1363
发表于 2024-11-3 22:46:40 | 显示全部楼层
a496298685 发表于 2024-10-31 22:54
关于楼主提到的

【文件大小超出程序区范围,超出部分已被自动移到EEPROM区】

谢谢你的解释,又学习到了新知识.谢谢恢复作者.
8位程序---换个STC32G.h头文件,换个C251编译器就直接到STC32的高度了;
          想回到8位机,则换个STC8H.h头文件,换个C51编译器就回到8位机了.
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 09:47 , Processed in 0.178298 second(s), 121 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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