STC32G12K128如何控制堆栈大小
在汇编程序里可以直接指定堆栈地址, 我之前用AVR芯片,堆栈底默认是SRAM的最高地址向下生长。 在STC32G12K128里堆栈是在edata, 指定堆栈的语句是什么?是不是可用用 int edata SPX _at_0x0c00 指定1K的堆栈
内部又研究了下,给出如下看法:
对于Ai8051U-32位的C语言程序,如无特殊需求,堆栈是不用用户设置的。
首先,编译器会将堆栈的起始地址设置在用户代码中实际使用的edata结束的位置
比如:用户代码中实际使用了1K字节的edata,则编译器会将堆栈指针SPX设置为0x3FF
Ai8051U-32的内部有2K的edata,从0x400~0x7FF的edata全部都是堆栈,
虽然编译器默认只保留了256字节,但实际程序运行是超过了256,也不会有任何问题
除非程序中有使用绝对地址访问edata,否则用户代码使用的edata和堆栈不会有任何冲突
总结:
程序中如果需要定义比较大的数组,建议单独使用xdata关键字将数组分配到xdata区域,
比如:int xdata buffer;
memory model还是尽量使用官方建议的XSmall模式
说一不二 发表于 2026-4-6 11:26
是不是可用用 int edata SPX _at_0x0c00 指定1K的堆栈
手册里汇编例程直接用MOV SPX, #0100H , 可是STC32G.h 里找不到SPX,只有sfr SP = 0x81 绝对地址访问影响编译器管理内存
使用直接汇编操作要求高
需熟悉底层 说一不二 发表于 2026-4-6 11:26
是不是可用用 int edata SPX _at_0x0c00 指定1K的堆栈
STC32G12K128的堆栈指针一般不需要软件设置
Keil编译器会将空闲edata的最低地址设置为堆栈指针初始值
注意:8051和32位8051的堆栈初始值都是设置最低地址,然后向上生长
如果一定要软件设置STC32G12k128的堆栈指针初始值
需要分别将初始值的低8位赋值到SP,然后将高8位赋值到SPH
C语言代码如下:
SP = (STACK_START) & 0xff);
SPH = (STACK_START >> 8) & 0xff);
如果是汇编语言则可以使用如下代码:
MOV DR60,#STACK_START ;DR60就是SPX,DR60的低16位映射到{SPH,SP}
zhp 发表于 2026-4-6 13:27
STC32G12K128的堆栈指针一般不需要软件设置
Keil编译器会将空闲edata的最低地址设置为堆栈指针初始值
edata 有4K,程序较大,不分配堆栈恐怕会出现不可预见结果 神农鼎 发表于 2026-4-6 11:31
对于Ai8051U-32位的C语言程序,如无特殊需求,堆栈是不用用户设置的。------这样不是很危险,首先要对使用的变量数仔细计数,程序很小时无所谓,大点的程序很可能就堆栈溢出,或死机或跑飞了 狂热主宰 发表于 2026-4-6 12:17
绝对地址访问影响编译器管理内存
使用直接汇编操作要求高
需熟悉底层
早期51芯片SRAM很小, 堆栈都是精打细算,算了又算的啊 zhp 发表于 2026-4-6 13:27
STC32G12K128的堆栈指针一般不需要软件设置
Keil编译器会将空闲edata的最低地址设置为堆栈指针初始值
#STACK_START 具体是什么值?
页:
[1]
2