找回密码
 立即注册
查看: 2358|回复: 5

讨论C251编译器的堆栈大小设置问题|START251.A51启动文件的设置

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:747
  • 最近打卡:2026-07-22 07:47:21
已绑定手机
已实名认证

139

主题

3695

回帖

9515

积分

超级版主

积分
9515
发表于 2025-3-11 19:55:24 | 显示全部楼层 |阅读模式
通过查询keil的帮助,可以得知默认堆栈设置为100H(256byte大小)
截图202503111955374040.jpg

这部分也可以通过默认工程的map文件查看得到
截图202503111955502346.jpg
所以,可以通过Keil安装目录下的C251/LIB/START251.A51文件修改后来设置堆栈大小
(注意,不要直接修改,需要拷贝一个副本到所需工程下,再修改,不同的单片机edata和xdata不同,所设置的也不同)
只有将START251.A51加入工程后才会生效这些设置

ai8051u的edata为2K(800H),这里同时保留edata一部分空间,设置堆栈最大为700H

相比原来扩大了7倍
这里给出修改后的START251.A51文件,只需要在Keil中,通过双击Source Group1添加START251.A51文件即可
截图202503111956038355.jpg
如果名字不一样,可以随便找个最后一级的文件夹添加A51启动文件即可,编译时会自动添加的
需要注意START251.A51文件需要保存到工程目录下,最好跟main文件放在同一个目录下
以下是修改后的START251.A51文件,同时增加了XDATA部分的自动清零(默认情况XDATA上电没有清零是随机数据的)
START251.A51 (7.44 KB, 下载次数: 173)


这里测试一下,导入START251.A51文件
截图202503111956216042.jpg
按下F7编译,output部分输出如下信息
截图202503111956382668.jpg
然后再查看.map 文件,可以看到堆栈区域大小已经被拓展到了700H
截图202503111956432618.jpg
当然这个时候我的edata使用和堆栈就互相冲突了,怎么解决呢?
截图202503111956575502.jpg
点击这个小魔术棒,打开工程的配置
截图202503111957082385.jpg
将内存模式改为Large(默认保存变量在xdata,不与堆栈抢edata)
再次编译
截图202503111957169091.jpg ]
可以看到,实际使用的200byte左右变量都在xdata中了,此时edata被堆栈空间所占用了700H(1792byte)
这样就可以拓展堆栈空间了

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2026-07-21 09:31:46

851

主题

1万

回帖

2万

积分

管理员

积分
24394
发表于 2025-3-12 11:25:10 | 显示全部楼层
内部又研究了下,给出如下看法:
对于Ai8051U-32位的C语言程序,如无特殊需求,堆栈是不用用户设置的
首先,编译器会将堆栈的起始地址设置在用户代码中实际使用的edata结束的位置
比如:用户代码中实际使用了1K字节的edata,则编译器会将堆栈指针SPX设置为0x3FF
Ai8051U-32的内部有2K的edata,从0x400~0x7FF的edata全部都是堆栈,
虽然编译器默认只保留了256字节,但实际程序运行是超过了256,也不会有任何问题
除非程序中有使用绝对地址访问edata,否则用户代码使用的edata和堆栈不会有任何冲突

总结:

程序中如果需要定义比较大的数组,建议单独使用xdata关键字将数组分配到xdata区域,
比如:int xdata buffer[256];
memory model还是尽量使用官方建议的XSmall模式


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-03-03 11:10:19
已绑定手机

2

主题

16

回帖

60

积分

注册会员

积分
60
发表于 2025-6-5 21:20:23 | 显示全部楼层
你好,我去 keil 的安装目录下,找到了 START251.A51 ,如图,把剪头处的值修改,图中的值是已经修改后的,不知道是否正确?其它的没有修改。

我的目的就是要:每次上电,或者复位,全部(全局变量、static修饰的局部)变量,都要自动的清零。
微信图片_20250605212002.png

点评

没错的  详情 回复 发表于 2025-6-6 08:10
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-03-03 11:10:19
已绑定手机

2

主题

16

回帖

60

积分

注册会员

积分
60
发表于 2025-6-5 21:23:40 | 显示全部楼层
回复错帖子了,不过也请大家帮我看看,这个修改是否正确,芯片是 STC32G8K64
微信截图_20250605212237.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:747
  • 最近打卡:2026-07-22 07:47:21
已绑定手机
已实名认证

139

主题

3695

回帖

9515

积分

超级版主

积分
9515
发表于 2025-6-6 08:10:00 | 显示全部楼层
panxi*** 发表于 2025-6-5 21:20
你好,我去 keil 的安装目录下,找到了 START251.A51 ,如图,把剪头处的值修改,图中的值是已经修改后的, ...

没错的
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-10-14 09:38:06
已绑定手机

13

主题

43

回帖

197

积分

注册会员

积分
197
发表于 2025-9-22 14:39:36 | 显示全部楼层
我加到工程里了,但不参加编译
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-22 09:31 , Processed in 0.073732 second(s), 70 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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