[经验分享] C51的内存分配与优化

[复制链接]
6827|73
deliahouse887 发表于 2024-8-19 17:15 | 显示全部楼层
根据函数参数的实际使用情况,优化参数传递方式,如使用值传递或引用传递。
macpherson 发表于 2024-8-20 09:15 | 显示全部楼层
全局变量占用Data区,尽量使用局部变量并通过参数传递来减少内存占用。
adolphcocker 发表于 2024-8-20 12:17 | 显示全部楼层
尽量使用局部变量而不是全局变量,因为局部变量占用的内存可以在函数返回后被重用。
rosemoore 发表于 2024-8-20 17:11 | 显示全部楼层
使用#pragma指令:可以使用#pragma指令来指定变量的存储类型,例如#pragma ioport用于I/O端口,#pragma small用于指定变量为small模式等。
wengh2016 发表于 2024-8-20 17:51 | 显示全部楼层
利用编译器的优化选项,如Keil C51提供的不同级别的优化(如-O1, -O2, -O3),可以自动进行一些优化。
51xlf 发表于 2024-8-20 19:52 | 显示全部楼层
8051单片机的内存分为几个不同的区域:

Code (程序存储区):用于存储程序代码。
Data (内部数据存储区):分为直接寻址区和间接寻址区,用于存储全局变量和静态变量。
IData (内部间接寻址区):用于存储通过间接寻址访问的变量,速度快但容量有限。
XData (外部数据存储区):用于存储大量的数据,但访问速度较慢。
PData (分页外部数据存储区):介于IData和XData之间,用于存储中等大小的数据。
yangxiaor520 发表于 2024-8-20 19:54 来自手机 | 显示全部楼层
8051内核的RAM只有10多KB吧
jtracy3 发表于 2024-8-20 20:32 | 显示全部楼层
在不同的操作系统或开发环境下,C51的内存分配和优化策略可能有所不同,需要根据实际情况调整。
lihuami 发表于 2024-8-20 22:31 | 显示全部楼层
对于布尔类型或单个位的状态,使用位变量(使用bit关键字),可以节省空间。
uiint 发表于 2024-8-21 11:56 | 显示全部楼层
程序存储器(ROM/Flash)‌:用于存储程序代码和常量数据。这部分内存通常是只读的,用于存放编译后的机器码和常量数据。
pixhw 发表于 2024-8-21 12:54 | 显示全部楼层
避免在循环中声明不必要的变量,减少内存的额外占用。
lihuami 发表于 2024-8-21 13:15 | 显示全部楼层
尽量使用寄存器变量(使用register关键字),因为它们存放在内部RAM中,访问速度最快。
uptown 发表于 2024-8-21 15:54 | 显示全部楼层
尽管高128字节的地址与SFR相同,但由于采用不同的寻址方式,这些地址仍可以用于存储变量。
hudi008 发表于 2024-8-21 18:10 | 显示全部楼层
过多的全局变量会消耗大量内存,尽量将变量的作用域限制在必要的范围内。
kkzz 发表于 2024-8-21 22:26 | 显示全部楼层
SMALL模式:适用于小体积的程序,变量存储在直接寻址的内部RAM,即低128字节内。
COMPACT模式:当变量大小超过128字节而不超过256字节时使用。
LARGE模式:适用于大体积程序,变量被存放在外部存储器或者使用间接寻址的内部RAM。
vivilyly 发表于 2024-8-22 08:01 | 显示全部楼层
合理安排程序的结构,使得相关的操作集中在相同的内存页,减少页面切换的时间损耗。
fengm 发表于 2024-8-22 10:43 | 显示全部楼层
根据程序需求合理划分内存分区,如代码区、数据区和堆栈区等,以确保各部分之间的内存不会相互干扰。
vivilyly 发表于 2024-8-22 11:08 | 显示全部楼层
将经常使用的常量定义为宏或常量,避免重复声明。
qiufengsd 发表于 2024-8-22 11:37 | 显示全部楼层
通过修改链接器的脚本文件来优化输出的内存布局,减少内存的碎片化。
benjaminka 发表于 2024-8-22 12:07 | 显示全部楼层
使用最小的数据类型来满足需求,例如使用char代替int。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部