嵌入式之路 发表于 2024-4-5 11:23:37

yjawei 发表于 2024-4-5 10:08
要是差距不太大的话,注释掉一部分warning的提示没有用到代码。

Warning的代码会被编译器自动优化掉吗?

yjawei 发表于 2024-4-5 18:21:21

默认情况下,Warning L16的代码段会被linker加到flash里面,虽然没用到。

soma 发表于 2024-4-5 21:01:53

嵌入式之路 发表于 2024-4-5 11:23
Warning的代码会被编译器自动优化掉吗?

一般不会

wjy123 发表于 2024-6-20 01:00:13

加个FATFS够呛了

manzunzu 发表于 2024-7-25 10:21:31

社区闲人 发表于 2024-4-3 12:21
1. 使用Keil的优化级别9将代码优化,可以进一步节省程序空间
2. 使用"REMOVEUNUSED"。
把target options ...

{:4_250:}{:4_250:}{:4_250:},我之前胡乱设置的,改成9后编译空间占用明显减少

小坤 发表于 2024-7-25 11:12:17

社区闲人 发表于 2024-4-3 12:21
1. 使用Keil的优化级别9将代码优化,可以进一步节省程序空间
2. 使用"REMOVEUNUSED"。
把target options ...

有些变量就要加 volatile 关键字。

VCC 发表于 2024-10-31 22:01:15

社区闲人 发表于 2024-4-3 12:21
1. 使用Keil的优化级别9将代码优化,可以进一步节省程序空间
2. 使用"REMOVEUNUSED"。
把target options ...

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

Keil默认设置太保守了,不调用的函数竟然也会被链接进最终的二进制文件里……

VCC 发表于 2024-10-31 22:54:51

关于楼主提到的

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

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

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

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

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


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


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

然而STC89C52型号(这是个过渡型号,目前已经停产,在产的是STC89C52RC)


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!




vb2002 发表于 2024-11-1 00:18:32

我记得之前一位大佬说,为了让空间够用,特意学了汇编

lao4jiadian 发表于 2024-11-3 22:46:40

a496298685 发表于 2024-10-31 22:54
关于楼主提到的

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


谢谢你的解释,又学习到了新知识.谢谢恢复作者.
页: 1 [2]
查看完整版本: 程序太大flash不够问题