梦回青春 发表于 2026-5-12 00:24:22

关于STC8H1K16内存使用情况

编译结果:Program Size: data=100.7 xdata=591 const=235 code=14490


新手请教各位老师:
1、单片机程序内存16k,现在使用14k多了。需不需要换个芯片多留点余量。
2、data区最多是不是只能使用128字节?为了减少data区的占用,局部变量能不能用xdata修饰,有没有什么隐患?
3、最搞不懂的就是堆栈。变量怎么定义才能减少对堆栈空间的占用。有时候代码会出现异常,代码又看不出什么问题。不知道是否和堆栈的使用有关。
   从哪里能看出堆栈是否溢出?



_奶咖君_ 发表于 2026-5-12 16:26:50

1. 单片机永远都是秉承着够用就行。除非你不在乎成本。
2.2 变量定义在xdata区,访问的速度比data区慢。如果你不在乎运行效率,那没有什么隐患。我内存模式直接选择的large模式

xiangzichen 发表于 2026-5-12 16:33:23

data都100了,这个看了感觉难受,直接和楼上说的,内存模式large,然后所有变量不加任何修饰,编译器自动完成,有些函数内部参与复杂运算的变量,可以酌情增加data修饰.

梦回青春 发表于 2026-5-12 21:19:27

_奶咖君_ 发表于 2026-5-12 16:26
1. 单片机永远都是秉承着够用就行。除非你不在乎成本。
2.2 变量定义在xdata区,访问的速度比data区慢。如 ...

那堆栈的使用空间是哪部分呢?怎么知道堆栈内存是否够用!

梦回青春 发表于 2026-5-12 22:51:18

xiangzichen 发表于 2026-5-12 16:33
data都100了,这个看了感觉难受,直接和楼上说的,内存模式large,然后所有变量不加任何修饰,编译器自动完成,有 ...

改成large模式编译:
Program Size: data=15.7 xdata=670 const=235 code=15283

ercircle 发表于 2026-5-12 22:53:30

梦回青春 发表于 2026-5-12 21:19
那堆栈的使用空间是哪部分呢?怎么知道堆栈内存是否够用!
没使用动态分配不牵扯堆。
栈可以检测SP寄存器值。

梦回青春 发表于 2026-5-12 23:45:09

ercircle 发表于 2026-5-12 22:53
没使用动态分配不牵扯堆。
栈可以检测SP寄存器值。

那0x7F减去SP地址是不是堆栈可用空间?

梦回青春 发表于 2026-5-13 23:53:01

ercircle 发表于 2026-5-12 22:53
没使用动态分配不牵扯堆。
栈可以检测SP寄存器值。

map文件内容

默认的small模式:

* * * * * * * * * * *   D A T A   M E M O R Y   * * * * * * * * * * * * *
000000H   000007H   000008H   ---    AT..   DATA         "REG BANK 0"
000008H   000018H   000011H   BYTE   UNIT   DATA         ?DT?ACTION
000019H   00001DH   000005H   BYTE   UNIT   DATA         ?DT?TM1638
00001EH   00001FH   000002H   BYTE   UNIT   DATA         ?DT?EEPROM
000020H.0 000021H.0 000001H.1 BIT    UNIT   BIT            _BIT_GROUP_
000021H.1 000021H.4 000000H.4 BIT    UNIT   BIT            ?BI?MAIN
000021H.5 000021H.6 000000H.2 BIT    UNIT   BIT            ?BI?BEEP
000021H.7 000021H   000000H.1 ---    ---      **GAP**
000022H   00003EH   00001DH   BYTE   UNIT   DATA         _DATA_GROUP_
00003FH   00005AH   00001CH   BYTE   UNIT   DATA         ?DT?MAIN
00005BH   00005DH   000003H   BYTE   UNIT   DATA         ?DT?HEAT
00005EH   000060H   000003H   BYTE   UNIT   DATA         ?DT?NTC
000061H   000062H   000002H   BYTE   UNIT   DATA         ?DT?PIDOUT
000063H   000063H   000001H   BYTE   UNIT   DATA         ?DT?BEEP
000064H   000064H   000001H   BYTE   UNIT   IDATA          ?STACK




改成large模式后:

* * * * * * * * * * *   D A T A   M E M O R Y   * * * * * * * * * * * * *
000000H   000007H   000008H   ---    AT..   DATA         "REG BANK 0"
000008H.0 00001FH.7 000018H.0 ---    ---      **GAP**
000020H.0 000020H.3 000000H.4 BIT    UNIT   BIT            ?BI?MAIN
000020H.4 000020H.5 000000H.2 BIT    UNIT   BIT            ?BI?BEEP
000020H.6 000020H   000000H.2 ---    ---      **GAP**
000021H   000021H   000001H   BYTE   UNIT   IDATA          ?STACK


页: [1]
查看完整版本: 关于STC8H1K16内存使用情况