说明:

  • 以下介绍示例的MCU地址空间如下:

            ROM空间为:0x0000 0000 – 0x0000 8000   

            RAM空间为:0x2000 0000 – 0x2000 2000   

            MCU初始化流程——从上电到main()之间 

  • 堆栈(SP)生长方向为 递减;
  • 小端模式  
  • Cortex-M0内核

正文:

一、MCU上电后,硬件设计保证,自动从地址0x00开始取数据

        初始化文件中代码设置 如下:

      MCU初始化流程——从上电到main()之间

     第一个数据用于初始化SP指针,其次为复位中断向量

     生成结果请看:ROM中数据如下左,对应汇编指令如下右:

    MCU初始化流程——从上电到main()之间  MCU初始化流程——从上电到main()之间

    上电后,运行指令前状态:

    MCU初始化流程——从上电到main()之间

二、在地址Reset_Handler / 0x0000 0194处存放着“复位中断处理函数”

    代码设计:

      MCU初始化流程——从上电到main()之间

    汇编指令为:

MCU初始化流程——从上电到main()之间 MCU初始化流程——从上电到main()之间

  其中rom地址0x0000 01B0处,存放着 函数__main的地址0x0000 00C0

  运行后,跳转至__main函数,开始运行:

MCU初始化流程——从上电到main()之间

三、在__main中,主要做两个函数:

0x000000C0 F000F802  BL.W     __scatterload (0x000000C8)

0x000000C4 F000F830  BL.W     __rt_entry (0x00000128)

此部分网上也有不错的介绍文章,

__main函数的作用:  (https://blog.csdn.net/wheat_in_winner/article/details/53583462)

    1.完成全局/静态变量的初始化工作

    2.初始化堆栈

    3.库函数的初始化

    4.程序的跳转,进入main()函数。

MDK __main()代码执行过程分析  (https://blog.csdn.net/wangfoquan/article/details/7650988)

    __scatterload():负责把RW/RO输出段从装载域地址复制到运行域地址,并完成了ZI运行域的初始化工作。

    __rt_entry():负责初始化堆栈,完成库函数的初始化,最后自动跳转向main()函数。

 

此处汇编指令过长,不细展开:

 查看.map文件数据:MCU初始化流程——从上电到main()之间

MCU初始化流程——从上电到main()之间

汇编指令:

MCU初始化流程——从上电到main()之间

 

MCU初始化流程——从上电到main()之间

  细究应该还有image结构的内容,(在MDK的help文档中有相关内容)

MCU初始化流程——从上电到main()之间

 

四、 进入C语言的世界 main()

MCU初始化流程——从上电到main()之间

MCU初始化流程——从上电到main()之间

 

 

 

 

 

相关文章: