在MDK环境下使用分散加载描述文件

 
  • 发现出错了……编译通过仿真没问题,但运行不了,估计还是没设置好。等待改进!调研中……委屈

     

    为免我把这两天的学习成果忘了,还是在这里做个备忘吧,同时也希望对正在迷茫的同道中人有所帮忙。

      

    环境:

    IDE环境:RealView MDK 4.0

    芯片:STM32F103x-HD系列

    涉及的文件:

    myProj.sct (分散加载描述文件)

    Startup.s   (初始化文件)

    备忘:

    (1)LR_IROM1 / ER_IROM1 :此类命名自拟

     

    (2)加载文件格式:

    加载区名称    加载区起始地址    加载区大小

    {

    <执行区1名称>    <执行区起始地址>    <执行区大小>

    {

    <执行区描述>

    }

    <执行区2名称>    <执行区起始地址>    <执行区大小>

    {

    <执行区描述>

    }

    …….

    }

     

    (3)使用“分散加载描述文件”,需要定义__user_initial_stackheap(),并在描述文件中定义“ARM_LIB_HEAP”及“ARM_LIB_STACK”

      ARM_LIB_HEAP <起始地址> EMPTY <起始大小> - <递增大小> {}

      ARM_LIB_STACK <起始地址> EMPTY <起始大小> - <递增大小> {}

     

    例子:

    // 堆:起始地址 0x20008000;起始大小 1KB;每次递增 1KB

    ARM_LIB_HEAP 0x20008000 EMPTY 0x400-0x0400 {}

    // 栈:起始地址 0x20008800;起始大小 1KB;每次递增 1KB

    // 以 “堆” 结束后 第一个地址 作为 “栈” 的起始地址

    ARM_LIB_STACK 0x20008800 EMPTY 0x400-0x0400 {}

     

    myProj.sct文件内容:

    ; *************************************************************

    ; *** Scatter-Loading Description File generated by uVision ***

    ; *************************************************************

     

    LR_IROM1 0x08000000 0x00080000     ;size:0x00080000

    {    ; load region size_region

     

      ER_IROM1 0x08000000 0x08060000

      {  ; load address = execution address

       *.o (RESET, +First)

       *(InRoot$$Sections)

       .ANY (+RO)

      }

     

      ER_IROM2 0x08060000 0x00020000

      {  ; load address = execution address 200K

       mydata.o (+RO-DATA)        ; mydat 内所有const变量放在此区

      }

     

      RW_IRAM1 0x20000000 0x00008000 ;size:32K

      {  ; RW data

       .ANY (+RW +ZI)

      }

     

      ;; The following declarations select the "two region model" ;

      ;; A default __user_initial_stackheap() will be used        ;

      ARM_LIB_HEAP 0x20008000 EMPTY 0x400-0x0400 {}        ; start size 1KB

                                                              ; grows downwards for 1KB

      ARM_LIB_STACK 0x20008800 EMPTY 0x400-0x0400 {}; start size 1KB

                                                              ; grows downwards for 1KB

     

    }

     

                                                      

    (4)修改 startup.s 文件中 __user_initial_stackheap 内容,重新定义堆栈起始地址及大小 。注意:需要指定存储器模式为双段模式__use_two_region_memory(单段模式只定义ARM_LIB_STACKHEAP))

     

    Startup.s 内部分程序:

    ; Import stack limit from scatter-loading file

    IMPORT __use_two_region_memory

    IMPORT ||Image$$ARM_LIB_STACK$$ZI$$Limit||

    EXPORT  __user_initial_stackheap

     

    __user_initial_stackheap

     

    ldr                r1, =||Image$$ARM_LIB_STACK$$ZI$$Limit||

    mrs                r0,cpsr                ; Original PSR value

    bic                r0,r0,#MODE_BITS        ; Clear the mode bits

    orr                r0,r0,#IRQ_MODE        ; Set IRQ mode bits

    msr                cpsr_c,r0                ; Change the mode

    mov                sp, r1                        

    sub                r1, r1, #IRQ_STK_SIZE

     

    参考资料:

    《ARM开发工具MDK用户指南》(中文版)(armtools.chm)

    参考章节:《 使用分散加载描述文件》

    《关于__user_initial_stackheap( )--machunshui的笔记》

    网址:http://blog.21ic.com/user1/5759/archives/2009/62869.html

    《启动代码中__use_two_region_memory解析》

    网址:http://www.embedinfo.com/faq/FAQanswer.asp?id=171

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值