查看: 5702|回复: 7

[其他] C语言中 stack操作

[复制链接]

该用户从未签到

20

主题

61

帖子

0

中级会员

Rank: 3Rank: 3

积分
203
最后登录
2020-11-18
发表于 2012-3-6 13:41:52 | 显示全部楼层 |阅读模式
STACKSIZE 0x80            
.stack                           128   R/W      0x128      0x1A7   RAM        
1、如果单片机RAM空间是0x40--0x43f  ,那么是否可以在程序开头直接把SP指向0x43f ,这样做是否可靠。
   LDHX #$0440 
    TXS

2、如果按照上述方法做的话,C语言编译环境里.map文件中的 stack 地址段还是没有变化 ,仍然为
               .stack                           128   R/W      0x128      0x1A7   RAM  
     虽然已经成功的把SP指向43f。
 
3、如果已经成功修改SP值,那么 0x128      0x1A7   空间是否可以正常使用?
我知道答案 目前已有6人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2018-9-14 09:26
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    70

    主题

    329

    帖子

    0

    高级会员

    Rank: 4

    积分
    952
    最后登录
    2021-1-4
    发表于 2012-3-6 15:00:48 | 显示全部楼层

    回复:C语言中 stack操作

    我在刚好在写一段C code, 帮你看看这个问题
    你应该是没有在 .prm文件进行设置
    NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */
    SEGMENTS /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
        Z_RAM                    =  READ_WRITE   0x0040 TO 0x00FF;
        RAM                      =  READ_WRITE   0x0100 TO 0x02FF;
        USER_STACK               =  READ_WRITE   0x0300 TO 0x043F; //healy----1
        
        ROM                      =  READ_ONLY    0xC000 TO 0xFFAD;
        ROM1                     =  READ_ONLY    0xFFC0 TO 0xFFCF;
     /* INTVECTS                 =  READ_ONLY    0xFFD0 TO 0xFFFF; Reserved for Interrupt Vectors */
    END
    PLACEMENT /* Here all predefined and user segments are placed into the SEGMENTS defined above. */
        DEFAULT_RAM,                        /* non-zero page variables */
                                            INTO  RAM;
        _PRESTART,                          /* startup code */
        STARTUP,                            /* startup data structures */
        ROM_VAR,                            /* constant variables */
        STRINGS,                            /* string literals */
        VIRTUAL_TABLE_SEGMENT,              /* C++ virtual table segment */
        DEFAULT_ROM,
        COPY                                /* copy down information: how to initialize variables */
                                            INTO  ROM; /* ,ROM1: To use "ROM1" as well, pass the option -OnB=b to the compiler */
        _DATA_ZEROPAGE,                     /* zero page variables */
        MY_ZEROPAGE                         INTO  Z_RAM;
        SSTACK                              INTO  USER_STACK; //healy----2
    END
    STACKSIZE 0x140     //healy---3
    其中1、2是我加的,3是我改的,本来是0x60
    MAP文件的输出结果是
    *********************************************************************************************
    SECTION-ALLOCATION SECTION
    Section Name                    Size  Type     From       To       Segment
    ---------------------------------------------------------------------------------------------
    .init                            132     R     0xC000     0xC083   ROM
    .startData                        14     R     0xC084     0xC091   ROM
    .text                            125     R     0xC092     0xC10E   ROM
    .copy                              2     R     0xC10F     0xC110   ROM
    .stack                           320   R/W      0x300      0x43F   USER_STACK

    你可按照我的设置改一下你的
     
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-14 09:26
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    70

    主题

    329

    帖子

    0

    高级会员

    Rank: 4

    积分
    952
    最后登录
    2021-1-4
    发表于 2012-3-6 15:17:45 | 显示全部楼层

    回复:C语言中 stack操作

    RAM                      =  READ_WRITE   0x0100 TO 0x02FF;
     
    这行也改过 原来是RAM地址的最后
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    61

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    203
    最后登录
    2020-11-18
     楼主| 发表于 2012-3-6 16:00:31 | 显示全部楼层

    RE:C语言中 stack操作

    谢谢 按照你的修改 果然可以了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    61

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    203
    最后登录
    2020-11-18
     楼主| 发表于 2012-3-6 16:19:02 | 显示全部楼层

    RE:C语言中 stack操作

    一般你们写程序的时候是否初始化把SP置RAM顶端?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-3-7 09:57:02 | 显示全部楼层

    RE:C语言中 stack操作

    一半是默认的,如果空间不够用,就需要修改这些了。或者有特殊要求的工程。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-14 09:26
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    70

    主题

    329

    帖子

    0

    高级会员

    Rank: 4

    积分
    952
    最后登录
    2021-1-4
    发表于 2012-3-7 13:42:20 | 显示全部楼层

    RE:C语言中 stack操作

    把SP设置在RAM的顶端,是和MCU堆栈的生长方向、编译器相关的。
    不能生硬的设置。
    初学者可以使用编译器的默认设置。但是最好自己可以设置堆栈的深度,因为应用不同,所要求的堆栈的深度就不同。堆栈设的不好,那是致命的问题,而且在调试阶段不一定能够发现。
    正规的软件公司在做测试的时候,是必须要分析函数的调用深度的。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    61

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    203
    最后登录
    2020-11-18
     楼主| 发表于 2012-3-7 15:51:59 | 显示全部楼层

    RE:C语言中 stack操作

    哦  谢谢啊  那如果在RAM允许的情况下 尽量设置的大点
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-12 17:11 , Processed in 0.104269 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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