zoukankan      html  css  js  c++  java
  • 2.STM32启动文件

    一、概念声明

        中断向量:由硬件产生的中断标识码,一般用于存放中断服务程序的跳转指令。根据硬件产生的中断号查找中断向量表来确定对应的中断向量。CM3内核有15个异常
      和240个中断源。
     
      程序的内存分配:(更多内容: http://blog.csdn.net/c12345423/article/details/53004747 )
          栈(stack) :由编译器自动进行分配和释放,一般用于存放函数的参数和局部变量的值。操作方式类似于数据结构中的栈。
             特性:由于栈的操作顺序是先进后出,因此用栈顶指针(top)来进行操作占空间。在STM32中,此段空间在启动文件(汇编文件)中被分配,相当于在OS中给任务分配
           的栈空间。
                 栈的生长方式为由下至上,在STM32的map文件得知,栈顶地址为 0x2001ab8.大小为1024Bytes.
           
             Stack_Size      EQU     0x00000400
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3
              Stack_Mem       SPACE   Stack_Size
              __initial_sp         
            
            堆(heap) :由程序员进行分配和释放,若程序员没有进行释放,最后由OS进行释放。
            全局区(静态区):初始化的全局变量及静态变量被放置在一起,而未初始化的全局变量和静态变量存放在另一块区域。
            文字常量区:字符串存放的位置。
            程序代码区:存放函数体的二进制文件。
      异常(中断)发生时的内核操作:
            ①、保护现场(压栈操作)。处理器通过硬件将相关的寄存器xPSR、PC、LR R12及R0-R3保存到当前使用的堆栈中。
            ②、取向量 CM3内核内部有 数据总线(Dbus)和指令总线(Ibus)。在Dbus保存处理器状态的同时,Ibus将从向量表取出异常向量,并获取ISR函数的地址,
          保护现场和取向量是同时进行的。
            ③、更新寄存器(恢复现场)。
            
        
    二、启动文件与内核架构的说明
        
        1.不同的CPU需要的启动文件不同,定义的硬件资源如 定时器、串口等不同。
        
        2.复位后的执行过程:
             相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后,
         CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断
         向量表的位置并不是固定的。而Cortex-M3内核则正好相反,有3种情况:
        (1) 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处;
        (2) 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处;
        (3) 通过boot引脚设置可以将中断向量表定位于内置Bootloader区,本文不对这种情况做论述;
        
        而Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的
    下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。对比ARM7/ARM9内核,Cortex-M3内核则是固定了中断向量表的位置而起始地址是可变化的。


    三、启动文件的内容说明

         1.开辟一定大小的堆栈空间,设置SP、PC指针。
         2.在代码的起始位置建立中断向量表,第一个表项是栈顶指针(从Flash启动,为0x8000000),第二个表项是复位中断服务程序入口地址。
         3.在复位中断服务程序中设置系统初始时钟 、实现由__main跳转到C语言 main函数。
              __main不是C语言中mian的入口。__main标号表示C/C++标准实时库函数里的一个初始化子程序__main的入口地址。该程序的一个主要作用是初始化堆栈
           (对于程序清单一来说则是跳转__user_initial_stackheap标号进行初始化堆栈的),并初始化映像文件,最后跳转C程序中的main函数。这就解释了为何
           所有的C程序必须有一个main函数作为程序的起点——因为这是由C/C++标准实时库所规定的——并且不能更改,因为C/C++标准实时库并不对外界开放源代码。
           因此,实际上在用户可见的前提下,程序在第204行后就跳转至.c文件中的main函数,开始执行C程序了。

  • 相关阅读:
    每周进度条(第九周)
    团队项目最后更改版
    项目需求分析与建议 NABCD模型
    课堂练习找水王
    问题账户需求分析
    2016年秋季个人阅读计划
    学习进度条
    用户体验
    程序员修炼之道——从小工到专家阅读笔记03
    程序员修炼之道——从小工到专家阅读笔记02
  • 原文地址:https://www.cnblogs.com/nyqm/p/7954747.html
Copyright © 2011-2022 走看看