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, 哪天哪个版本的编译器给你编译错了,就麻烦了
学习了,以前老是想着快,使用频繁,用户变量直接放在Data区 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 xinzui 发表于 2024-2-15 05:42
学习了,以前老是想着快,使用频繁,用户变量直接放在Data区
STC8系列,速度够快了,xdata 也不慢,
养成良好的编程习惯,避免潜在的 堆栈不够大的错误
受教了,多谢指点 STC32的堆栈是 edata, 理论深度是 64K, 基本够了
===如不使用 RTOS,我估计堆栈 1K 大部分普通应用足够了:
建议用户频繁使用的变量放在 edata 中,
xdata 给 DMA-缓冲区 使用,
【edata-size - 1K】 还不够时,才将部分变量放在 xdata
unsigned char edata k = 0;
unsigned char xdata k = 0;
忘掉无聊的 pdata, 哪天哪个版本的编译器给你编译错了,就麻烦了
页:
[1]