OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12936|回复: 5

MDK下的STM32启动程序相关:SP指到哪了?

[复制链接]

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2011-11-29
在线时间
0 小时
发表于 2012-1-20 16:05:12 | 显示全部楼层 |阅读模式

原子的开发板,原子的例程序“ALIENTEK MINISTM32 实验1 跑马灯”
是用SWD调试时发现R13也就是SP的值为 0x20000208,觉得奇怪不?stack的定位一般应该是RAM空间的最高位,因为STM32使用的是向下生长的满栈,所以根据RAM = 20KB SP可以定在0x20005000上。这样做的好处先不提,先看看MDK是怎样算出0x20000208的。
在启动程序里跟SP有关的当然就是__initial_sp这个标号了,也不知道内容是什么?反正进到__main里面就自动将SP改成0x20000208了,查找了下MDK的帮助文档,隐约有提到initial_sp的值是根据ZI的地址算出来的,ZI是什么我就不解释了,(RO,RW,ZI嘛),再来通过看编译后的程序确定下好了,详细信息都在.map文件里,这里面有IMAGE文件的详细说明。

XXX.map 文件里的一部分如下,XXX.map文件在工程文件夹里有的。 因为是复制粘贴过来的 所以要上下对齐了看。
====================================================================

Image component sizes


      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name

       160          8          0          4              0          0           delay.o
       128         18          0          0              0          0           led.o
        28          4        240          0            512          0           stm32f10x.o
       778         72          0          0              0          0           sys.o
        88         10          0          0              0          0           test.o

    ----------------------------------------------------------------------
      1184        112        272          4           516          0   Object Totals
         0          0         32          0              0          0   (incl. Generated)
         2          0          0          0              4          0   (incl. Padding)

    ----------------------------------------------------------------------

      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Library Member Name

         0          0          0          0          0          0   entry.o
         8          4          0          0          0          0   entry2.o
         4          0          0          0          0          0   entry5.o
         8          4          0          0          0          0   entry7.o
        30          0          0          0          0          0   handlers.o
        36          8          0          0          0          0   init.o

    ----------------------------------------------------------------------
        88         16          0          0          0          0   Library Totals
         2          0          0          0          0          0   (incl. Padding)

    ----------------------------------------------------------------------

      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Library Name

        86         16          0          0          0         68   mc_w.l

    ----------------------------------------------------------------------
        88         16          0          0          0          0   Library Totals

    ----------------------------------------------------------------------

================================================================


      Code (inc. data)   RO Data    RW Data    ZI Data      Debug  

      1272        128        272          4        516       7504   Grand Totals
      1272        128        272          4        516       7504   ELF Image Totals
      1272        128        272          4          0          0   ROM Totals

===============================================================

    Total RO  Size (Code + RO Data)                 1544 (   1.51kB)
    Total RW  Size (RW Data + ZI Data)               520 (   0.51kB)
    Total ROM Size (Code + RO Data + RW Data)       1548 (   1.51kB)

================================================================

注意到红线的地方,可以看到程序用到多少RW 和 ZI,启动stm32f10x.s里竟然有512个字节的ZI,这个不奇怪,就是因为
Stack_Size      EQU     0x00000200 的设定
所以再加上Padding的4个字节,ZI区共516个字节,看黄线部分,padding是干啥的我也不清楚,貌似是为了对齐用了添加的多余字节。
那么再加上RW区的4个字节,总共RW + ZI = 520个字节,所以SP就定在了 0x20000208 (0x208 = 520),那么现在真相看到了吧。

结论&吐槽:MDK能不用这么坑爹的设定么?把stack放到RW+ZI区的结束位置?并且Stack_Size      EQU     0x00000200 这个空间也算ZI?stack需要ZI?费力不讨好吧,你定个Stack_Size      EQU     0x00000200 有什么用呢?能防止程序深度调用时stack溢出?还要在创建ZI时多初始化512个字节,把stack定到RAM最高地址不好么?把RW+ZI区结束位置留给heap不好么?看着不爽吧,还不让人改,一个__main都搞完了,还直接跳到我的main,我只能干瞪眼。试过保留向量表,其他部分自己用汇编写吧,各种报错,各种库函数什么的找不到,我不用你的初始化库还不行吗?还真不行,不知道该哪的设置,搞了一晚上头都大了。

好吧我屈服了

在向量表的末尾加上红线部分
                .......
                DCD     EXTI15_10_IRQHandler      ; EXTI Line 15..10
                DCD     RTCAlarm_IRQHandler       ; RTC Alarm through EXTI Line
                DCD     USBWakeUp_IRQHandler      ; USB Wakeup from suspend
SP_ADDR   DCD  0X20005000
    EXPORT SP_ADDR

                AREA    |.text|, CODE, READONLY
                .......
然后在主程序里 加上红线部分 嵌入一个汇编函数来修改SP

__asm void set_sp(void)
{
 IMPORT SP_ADDR
 LDR  R13, SP_ADDR
 BX  LR // 返回主程序(不可省略)
 ALIGN
}

int main(void)
{
 set_sp();               //终于我的SP是自己定义的了
  Stm32_Clock_Init(9); //系统时钟设置
 delay_init(72);      //延时初始化
    LED_Init();      //初始化与LED连接的硬件接口
 while(1)
 {
  LED0=0;
  LED1=1;
  delay_ms(300);
  LED0=1;
  LED1=0;
  delay_ms(300);
 } 
}

记得最后改 Stack_Size      EQU     0x00000000
这样就没了那512个字节的冤大头。

哎,这就是跟编译器卯了一晚上,得到的结果。



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2012-1-20 18:38:48 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2011-11-29
在线时间
0 小时
 楼主| 发表于 2012-1-21 13:16:36 | 显示全部楼层
一个顶字让我情何以堪,来点心得分享下呗
回复 支持 反对

使用道具 举报

2

主题

1443

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2234
金钱
2234
注册时间
2010-12-16
在线时间
197 小时
发表于 2012-1-21 14:53:31 | 显示全部楼层
还需要修改溢出检查吧,不然出问题了还真不清楚,毕竟编译器自带的东西是自成一套体系的,改了这个要把其他的一套都要改了才好用,特别是它的RTX,没研究过会不会也有关系。
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2011-11-29
在线时间
0 小时
 楼主| 发表于 2012-1-26 17:15:46 | 显示全部楼层
哎 过年玩了几天 今天来关注下

楼上的说溢出检查?我在MDK里没发现这个设置,话说堆栈这东西因为有中断程序的介入,调用深度是不可以预知的,所以编译器应该也没办法检查吧,只有在运行起来自己写程序检查SP是否溢出
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-12-25
在线时间
20 小时
发表于 2017-9-4 17:24:53 | 显示全部楼层
楼主这么用了吗,长期使用下来有没有发现什么问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 21:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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