神农鼎 发表于 2024-2-14 08:52:00

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

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


xinzui 发表于 2024-2-15 05:42:31

学习了,以前老是想着快,使用频繁,用户变量直接放在Data区

21cnsound 发表于 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

神农鼎 发表于 2024-2-15 08:54:26

xinzui 发表于 2024-2-15 05:42
学习了,以前老是想着快,使用频繁,用户变量直接放在Data区
STC8系列,速度够快了,xdata 也不慢,
养成良好的编程习惯,避免潜在的 堆栈不够大的错误

xinzui 发表于 2024-2-15 08:57:10

受教了,多谢指点

神农鼎 发表于 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, 哪天哪个版本的编译器给你编译错了,就麻烦了
页: [1]
查看完整版本: STC8 系列的堆栈指针:SP,上电复位后 为 07H !将 idata, 尽量全部留给堆栈