搜索
bottom↓
回复: 30

关于LGT的栈指针初始化问题

[复制链接]

出0入618汤圆

发表于 2012-5-16 17:13:12 | 显示全部楼层 |阅读模式
LGT8F08A的数据地址空间从0~0x03FF,其中内部SRAM空间从0x0100~0x03FF,按道理初始栈指针应该指向0x03FF,但是SPH:SPL却只有9位,初始值指向0x01FF处?求解释。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-16 17:24:41 | 显示全部楼层
看来又有笔误了, 512 应该是100~2ff。
然后SP实际map是map到100~2ff

出0入0汤圆

发表于 2012-5-16 21:13:35 | 显示全部楼层
是10bit的。Datasheet有误。

出0入0汤圆

发表于 2012-5-17 10:30:31 | 显示全部楼层
不对啊,512+256=768,应该是0-0x2ff才对吧

出0入0汤圆

发表于 2012-5-17 10:41:08 | 显示全部楼层
SP 不用指到 0~0x100这段空间吧,因此SP访问的空间只有SRAM那段,就是512字节1ff 不是正好是9bit么? 当然如果SP能访问到0~0x100那段9bit就不够了。

出0入618汤圆

 楼主| 发表于 2012-5-17 11:08:21 | 显示全部楼层
bozai 发表于 2012-5-17 10:41
SP 不用指到 0~0x100这段空间吧,因此SP访问的空间只有SRAM那段,就是512字节1ff 不是正好是9bit么? 当然 ...

AVR的寄存器和SRAM是统一编址的,SP是统一编址的指针,不是单独按SRAM地址算的,我想LGT也一样。
我是写汇编要直接操作栈指针时发现手册这个问题的。

出0入618汤圆

 楼主| 发表于 2012-5-17 11:13:37 | 显示全部楼层
mowin 发表于 2012-5-17 10:30
不对啊,512+256=768,应该是0-0x2ff才对吧

所以手册应该有两个错误:SRAM地址空间0x1ff/0x2ff,对应SP寄存器位宽9/10位。

出0入0汤圆

发表于 2012-5-17 11:36:07 | 显示全部楼层
gzhuli 发表于 2012-5-17 11:08
AVR的寄存器和SRAM是统一编址的,SP是统一编址的指针,不是单独按SRAM地址算的,我想LGT也一样。
我是写 ...

的确如此, AVR手册隐含这个意思。 LGT既然用同一个编译器,那就是一样的了。

WINAVR编译选atmega164p 编译出来的list文件有这么一段

     652:        cf ef               ldi        r28, 0xFF        ; 255
     654:        d4 e0               ldi        r29, 0x04        ; 4
     656:        de bf               out        0x3e, r29        ; 62
     658:        cd bf               out        0x3d, r28        ; 61


完了, 岂不是这样只用了256B 的SRAM了,另外256浪费了。

出0入618汤圆

 楼主| 发表于 2012-5-17 11:42:34 | 显示全部楼层
本帖最后由 gzhuli 于 2012-5-17 11:46 编辑
bozai 发表于 2012-5-17 11:36
的确如此, AVR手册隐含这个意思。 LGT既然用同一个编译器,那就是一样的了。

WINAVR编译选atmega164p  ...


呵呵,我就觉得奇怪为啥1k SRAM的164编译出来的程序能放到512B SRAM的片子上正常跑,还以为C编译器不会去初始化SP指针直接用了复位值,原来SP指针真的给初始化错了。
怪不得前几天有人跑TCP/IP会出现莫名其妙的问题。

出0入618汤圆

 楼主| 发表于 2012-5-17 14:42:40 | 显示全部楼层
bozai 发表于 2012-5-17 11:36
的确如此, AVR手册隐含这个意思。 LGT既然用同一个编译器,那就是一样的了。

WINAVR编译选atmega164p  ...

又有点不解了,看这个代码,LGT的SP寄存器应该被初始化成SPH = 0, SPL = 0xff(多余位被忽略),这样栈底岂不是指向了扩展IO空间?这样程序应该没办法跑起来的吧?

出0入0汤圆

发表于 2012-5-17 14:58:38 | 显示全部楼层
gzhuli 发表于 2012-5-17 14:42
又有点不解了,看这个代码,LGT的SP寄存器应该被初始化成SPH = 0, SPL = 0xff(多余位被忽略),这样栈底 ...

是啊,我也纳闷呢。 难道是SPH没有写进去?

出0入0汤圆

发表于 2012-5-17 15:14:28 | 显示全部楼层
本帖最后由 logicgreen 于 2012-5-17 15:15 编辑

SP指针应该初始化在 $2FF。

SRAM 的地址范围:$100~$2FF。

出0入618汤圆

 楼主| 发表于 2012-5-17 15:18:10 | 显示全部楼层
logicgreen 发表于 2012-5-17 15:14
SP指针应该初始化在 $2FF。

SRAM 的地址范围:$100~$2FF。


但是M164P有1KB内存,所以8楼编译器生成的代码是SPH = 0x04, SPL = 0xff,这样LGT只有低2位有效的SPH会被初始化成0了吧?

出0入0汤圆

发表于 2012-5-17 15:42:37 | 显示全部楼层
gzhuli 发表于 2012-5-17 15:18
但是M164P有1KB内存,所以8楼编译器生成的代码是SPH = 0x04, SPL = 0xff,这样LGT只有低2位有效的SPH会被 ...

没错,那样就会影响程序的执行。

出0入618汤圆

 楼主| 发表于 2012-5-17 15:50:58 | 显示全部楼层
logicgreen 发表于 2012-5-17 15:42
没错,那样就会影响程序的执行。

但现在的不是建议选mega164p来编译的吗?

出0入0汤圆

发表于 2012-5-17 15:52:56 | 显示全部楼层
gzhuli 发表于 2012-5-17 15:50
但现在的不是建议选mega164p来编译的吗?

即使选M164P也可以指定SP的值。
头像被屏蔽

出0入0汤圆

发表于 2012-5-17 15:55:34 | 显示全部楼层
关注。

出0入618汤圆

 楼主| 发表于 2012-5-17 16:29:51 | 显示全部楼层
本帖最后由 gzhuli 于 2012-5-17 17:30 编辑
logicgreen 发表于 2012-5-17 15:52
即使选M164P也可以指定SP的值。


问题是教程里没有这一步哦,大家的代码都是怎么跑起来的呢?我觉得很好奇。

补充:根据AVR GCC文档最后一段的说明,工程中设置的stack地址需要加0x800000连接器才能识别为SRAM段,所以重新上传了图片以免误导。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
头像被屏蔽

出0入0汤圆

发表于 2012-5-17 16:32:40 | 显示全部楼层
gzhuli 发表于 2012-5-17 16:29
问题是教程里没有这一步哦,大家的代码都是怎么跑起来的呢?我觉得很好奇。   ...

教程是我写的。 真的不需要这一步,就能运行起来。

出0入0汤圆

发表于 2012-5-17 16:33:59 | 显示全部楼层
目前还没发现这个问题。强烈建议LGT改头换面,脱离AVR的限制

出0入0汤圆

发表于 2012-5-17 16:53:28 | 显示全部楼层
gzhuli 发表于 2012-5-17 16:29
问题是教程里没有这一步哦,大家的代码都是怎么跑起来的呢?我觉得很好奇。   ...

SPH,SPL是两个寄存器,程序给他们赋值就行,不要编译器自动指定。

出0入618汤圆

 楼主| 发表于 2012-5-17 17:06:17 | 显示全部楼层
本帖最后由 gzhuli 于 2012-5-17 17:27 编辑
logicgreen 发表于 2012-5-17 16:53
SPH,SPL是两个寄存器,程序给他们赋值就行,不要编译器自动指定。


嗯,总结一下:

出0入0汤圆

发表于 2012-5-17 17:10:29 | 显示全部楼层
IAR不用担心。

因为IAR的SP初始值是由连接器决定的。
只要连接脚本正确就行。

用WinAVR就要小心堆栈问题了。

出0入0汤圆

发表于 2012-5-17 17:12:49 | 显示全部楼层
gzhuli 发表于 2012-5-17 17:06
嗯,总结一下:
  • 对于LGT8F08A,SRAM地址空间为0x100~0x3ff,SPH:SPL总共是10位,其中SPH只有低2位有 ...

  • 嗯,非常对。

    感谢gzhuli!

    出0入0汤圆

    发表于 2012-5-17 17:19:12 | 显示全部楼层
    0x2ff-0x3ff这一段空间也可以用吗?

    出0入618汤圆

     楼主| 发表于 2012-5-17 17:28:40 | 显示全部楼层
    mowin 发表于 2012-5-17 17:19
    0x2ff-0x3ff这一段空间也可以用吗?

    晕倒,是0x100~0x2ff,改过来了。

    出30入25汤圆

    发表于 2012-5-17 23:59:42 | 显示全部楼层
    我猜测是芯片会在SPH和SPL越界时将其约束到最大值

    AVRStudio5的工程属性里,设置方法如下:

    比较设置前后产生的汇编代码,写到SPH,SPL的值确实是从0x04FF变成了0x02FF。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册

    x

    出0入0汤圆

    发表于 2012-5-21 21:42:19 | 显示全部楼层
    gzhuli 发表于 2012-5-17 11:42
    呵呵,我就觉得奇怪为啥1k SRAM的164编译出来的程序能放到512B SRAM的片子上正常跑,还以为C编译器不会去 ...

    就是啊,我跑tcp web协议时总是莫名奇妙的复位或重启,串口打印出莫名其妙的信息。

    出0入0汤圆

    发表于 2012-5-21 21:53:44 | 显示全部楼层
    gzhuli 发表于 2012-5-17 16:29
    问题是教程里没有这一步哦,大家的代码都是怎么跑起来的呢?我觉得很好奇。  

    补充:根据AVR ...


    我在移植rem_dev_tcp-2.4到LGT上时发现内存可能不够的问题,也在specify Initial stack ad 改过内存最高地址为栈地址,但是还是没用,没想到是要加上0x800000啊,明天试试看。

    出100入143汤圆

    发表于 2012-5-22 08:27:25 | 显示全部楼层
    佩服啊,非深钻研的人和牛叉的才能提出这样的问题

    出0入0汤圆

    发表于 2012-9-9 16:45:21 | 显示全部楼层
    mark...............
    回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

    GMT+8, 2024-4-20 10:28

    © Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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