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

STC8 系列的堆栈指针:SP,上电复位后 为 07H !将 idata, 尽量全部留给堆栈

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2024-2-14 08:52:00 | 显示全部楼层 |阅读模式
STC8 系列的堆栈指针:SP,  堆栈指针,上电复位后 为 07H !
xdata, STC8系列, 最少的 xdata 都是 1024字节的 xdata
将 idata, 尽量全部留给堆栈使用 !

===这是 STC8系列为啥 最简单的 8-Pin 也放 1024字节 xdata 的设计思想

SP,  堆栈指针,上电复位后 为 07H !
===你可以用 SP 上电复位后的默认初始化 07H
===你可以将 SP 初始化为 07H
===你可以将 SP 初始化为 07H/2FH/7FH等 07H或以后的任何一个值
        但对SP设置的值要尽量小,这样堆栈才大 = 256 - 【SP+1】

SP,  堆栈指针,上电复位后 为 07H !
用前,系统 【SP + 1】,避开了0组的【R0 ~ R7】;
你不强制指定用 1组/2组/3组的【R0 ~ R7】, Keil 不会去主动用 这些 !
建议 STC8系列,不要去动他,用户 变量,强制指定到 xdata !
如下声明变量到 xdata, 将 idata 尽量全部留给堆栈使用:
unsigned char xdata k = 0;

忘掉无聊的 pdata, 哪天哪个版本的编译器给你编译错了,就麻烦了



回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:451
  • 最近打卡:2025-05-01 23:07:16
已绑定手机

6

主题

40

回帖

259

积分

中级会员

积分
259
发表于 2024-2-15 05:42:31 来自手机 | 显示全部楼层
学习了,以前老是想着快,使用频繁,用户变量直接放在Data区

点评

STC8系列,速度够快了,xdata 也不慢,养成良好的编程习惯,避免潜在的 堆栈不够大的错误  详情 回复 发表于 2024-2-15 08:54
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:454
  • 最近打卡:2025-05-03 00:18:42
已绑定手机

13

主题

1257

回帖

2979

积分

金牌会员

积分
2979
发表于 2024-2-15 08:34:21 | 显示全部楼层
c51中,如果代码量/变量不太多,用户变量可以设置在data或idata,编译时会自动调整SP,一般不用动。
如果代码量很大(一般DIY用户应该很难到这个数量级)堆栈不够用或紧张时,可以按神农鼎的方式规划RAM。


在编译后的xxx.MAP中可以查看ROM/RAM的规划使用情况,下面是RAM的占用情况:
* * * * * * * * * * *   D A T A   M E M O R Y   * * * * * * * * * * * * *
000000H   000007H   000008H   ---    AT..     DATA           "REG BANK 0"
000008H   00000DH   000006H   BYTE   UNIT     DATA           _DATA_GROUP_
00000EH   000011H   000004H   BYTE   UNIT     DATA           ?DT?MAIN
000012H.0 00001FH.7 00000EH.0 ---    ---      **GAP**
000020H.0 000020H.0 000000H.1 BIT    UNIT     BIT            ?BI?MAIN
000020H.1 000020H   000000H.7 ---    ---      **GAP**
000021H   000021H   000001H   BYTE   UNIT     IDATA          ?STACK
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2024-2-15 08:54:26 | 显示全部楼层
xin*** 发表于 2024-2-15 05:42
学习了,以前老是想着快,使用频繁,用户变量直接放在Data区

STC8系列,速度够快了,xdata 也不慢,
养成良好的编程习惯,避免潜在的 堆栈不够大的错误
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:451
  • 最近打卡:2025-05-01 23:07:16
已绑定手机

6

主题

40

回帖

259

积分

中级会员

积分
259
发表于 2024-2-15 08:57:10 来自手机 | 显示全部楼层
受教了,多谢指点
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2024-2-15 09:00:53 | 显示全部楼层
STC32的堆栈是 edata, 理论深度是 64K, 基本够了
===如不使用 RTOS,我估计堆栈 1K 大部分普通应用足够了:
        建议用户频繁使用的变量放在 edata 中,
        xdata 给 DMA-缓冲区 使用,
        【edata-size - 1K】 还不够时,才将部分变量放在 xdata


unsigned char edata k = 0;

unsigned char xdata k = 0;


忘掉无聊的 pdata, 哪天哪个版本的编译器给你编译错了,就麻烦了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 15:07 , Processed in 0.116022 second(s), 77 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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