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

说明:

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

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

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

             

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

正文:

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

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

      

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

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

      

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

    

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

    代码设计:

      

    汇编指令为:

 

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

  运行后,跳转至__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文件数据:

汇编指令:

 

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

 

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

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章