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

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

[复制链接]

该用户从未签到

550

主题

9343

回帖

1万

积分

管理员

积分
13890
发表于 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, 哪天哪个版本的编译器给你编译错了,就麻烦了



回复 送花

使用道具 举报

  • TA的每日心情
    开心
    昨天 02:52
  • 签到天数: 137 天

    [LV.7]常住居民III

    6

    主题

    33

    回帖

    344

    积分

    中级会员

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

    点评

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:25
  • 签到天数: 99 天

    [LV.6]常住居民II

    9

    主题

    557

    回帖

    827

    积分

    高级会员

    积分
    827
    发表于 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
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9343

    回帖

    1万

    积分

    管理员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:52
  • 签到天数: 137 天

    [LV.7]常住居民III

    6

    主题

    33

    回帖

    344

    积分

    中级会员

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

    使用道具 举报

    该用户从未签到

    550

    主题

    9343

    回帖

    1万

    积分

    管理员

    积分
    13890
     楼主| 发表于 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, 2024-5-7 07:02 , Processed in 0.060732 second(s), 50 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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