查看: 1861|回复: 0

[分享] ARM Cortex-M底层技术-KEIL MDK 分散加载-堆栈与预处理器

[复制链接]
  • TA的每日心情
    开心
    2023-2-28 15:37
  • 签到天数: 42 天

    [LV.5]常住居民I

    42

    主题

    500

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1369

    热心会员

    最后登录
    2024-2-23
    发表于 2020-4-14 12:56:21 | 显示全部楼层 |阅读模式
    分散加载-堆栈与预处理器

    在分散加载中处理堆栈:


        分散加载机制提供了一种方法,用于指定如何在映像中放置代码和静态分配数据。 应用程序的堆栈和堆是在 C 库初始化过程中设置的。 通过使用特别命名的ARM_LIB_HEAP、ARM_LIB_STACK 或 ARM_LIB_STACKHEAP 执行区,可以调整堆栈和堆的放置。 此外,如果不使用分散加载描述文件,则可以重新实现__user_initial_stackheap() 函数。


        堆栈在分散加载中这样配置:


    LOAD_FLASH    起始地址    加载域大小
    {
        ...
        ARM_LIB_STACK     起始地址     EMPTY    -栈大小{ }
        ARM_LIB_HEAP    起始地址    EMPTY     堆大小{ }
        ...


    }


        我们知道在Cortex-M体系下栈是满递减堆栈(如下图所示),栈的方向是向下生长的,所以要在栈大小的前面加一个减号(注意那个减号);属性是EMPTY。
    1.png
    在分散加载中使用预处理器:


    在分散加载的第一行顶格编写以下语句即可调用预处理器:


    “#! armcc -E”


    调用预处理器就是说可以再分散加载中使用一些预处理器语句,比如:


    #define等


    #define m_interrupts_start                 0x00000000
    #define m_interrupts_size                  0x00000400
    #define m_text_start                           0x00000400


    #define m_text_size                            0x0007FC00


    然后在分散加载中使用m_interrupts_start或者m_interrupts_size来代替具体的地址,如下:
    1. <font size="3" face="微软雅黑">LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_start {
    2.   VECTOR_ROM m_interrupts_start m_interrupts_size {
    3.     * (RESET,+FIRST)
    4.   }
    5.   ER_m_text m_text_start FIXED m_text_size {
    6.     * (InRoot$Sections)
    7.     .ANY (+RO)

    8.   }

    9. }
    10. </font>
    复制代码
    那么下面我贴出官方的一个工程上的分散加载,大家一起参考下,根据我们之前讲过的分散加载的文档,分析下这个实际中使用的分散加载:
    1. <font size="3" face="微软雅黑">#! armcc -E

    2. #if (defined(__ram_vector_table__))
    3.   #define __ram_vector_table_size__    0x00000400
    4. #else
    5.   #define __ram_vector_table_size__    0x00000000
    6. #endif


    7. #define m_interrupts_start             0x00000000
    8. #define m_interrupts_size              0x00000400


    9. #define m_text_start                   0x00000400
    10. #define m_text_size                    0x0007FC00


    11. #define m_interrupts_ram_start         0x20000000
    12. #define m_interrupts_ram_size          __ram_vector_table_size__


    13. #define m_data_start                   (m_interrupts_ram_start + m_interrupts_ram_size)
    14. #define m_data_size                    (0x00028000 - m_interrupts_ram_size)


    15. #define m_usb_sram_start               0x40100000
    16. #define m_usb_sram_size                0x00002000


    17. /* USB BDT size */
    18. #define usb_bdt_size                   0x0
    19. /* Sizes */
    20. #if (defined(__stack_size__))
    21.   #define Stack_Size                   __stack_size__
    22. #else
    23.   #define Stack_Size                   0x0400
    24. #endif


    25. #if (defined(__heap_size__))
    26.   #define Heap_Size                    __heap_size__
    27. #else
    28.   #define Heap_Size                    0x0400
    29. #endif


    30. LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_start { ; load region size_region
    31.   VECTOR_ROM m_interrupts_start m_interrupts_size { ; load address = execution address
    32.     * (RESET,+FIRST)
    33.   }
    34.   ER_m_text m_text_start FIXED m_text_size { ; load address = execution address
    35.     * (InRoot$Sections)
    36.     .ANY (+RO)
    37.   }


    38. #if (defined(__ram_vector_table__))
    39.   VECTOR_RAM m_interrupts_ram_start EMPTY m_interrupts_ram_size {
    40.   }
    41. #else
    42.   VECTOR_RAM m_interrupts_start EMPTY 0 {
    43.   }
    44. #endif
    45.   RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
    46.     .ANY (+RW +ZI)
    47.   }
    48.   ARM_LIB_HEAP +0 EMPTY Heap_Size {    ; Heap region growing up
    49.   }
    50.   ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
    51.   }
    52. }


    53. LR_m_usb_bdt m_usb_sram_start usb_bdt_size {
    54.   ER_m_usb_bdt m_usb_sram_start UNINIT usb_bdt_size {
    55.     * (m_usb_bdt)
    56.   }
    57. }


    58. LR_m_usb_ram (m_usb_sram_start + usb_bdt_size) (m_usb_sram_size - usb_bdt_size) {
    59.   ER_m_usb_ram (m_usb_sram_start + usb_bdt_size) UNINIT (m_usb_sram_size - usb_bdt_size) {
    60.     * (m_usb_global)
    61.   }
    62. }

    63. </font>
    复制代码


    文章出处:点击

    签到签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-25 03:59 , Processed in 0.123553 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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