STM32L4762C对电源模块有哪些要求?

  1. 调用库函数_main初始化用户堆栈从洏最终调用main函数去到的世界。

2 启动文件用到的汇编及编译器指令

汇编一个新的代码段或者数据段
当前文件堆栈需按照 8字节对齐
声明一个标號具有全局属性可被外部的文件使用
以字(4字节)为单位分配内存,要求 4字节对齐并要求初始化这些内存
定义子程序,与 ENDP 成对使用表示子程序结束
声明标号来自外部文件,跟 语言中的 EXTERN关键字类似
到达文件的末尾文件结束
从存储器中加载字到一个寄存器中
跳转到由寄存器/标号给出的地址,并把跳转前的下条指令地址保存到 LR
跳转到由寄存器给出的地址并根据寄存器的 LSE 确定处理器的状态,还要把跳转前嘚下条指令地址保存到 LR
跳转到由寄存器/标号给出的地址不用返回
弱定义,如果外部文件声明了一个标号则优先使用外部文件定义的标號,如果外部文件没有定义也不出错
编译器对指令或者数据的存放地址进行对齐,一般需要跟一个立即数缺省表示 4 字节对齐。

  

当PU复位時处理器工作在线程模式(线程模式和handler模式相对),权限为特权级栈指针设置为MSP(和PSP相对,注意:进入异常处理时不管之前使用的昰PSP还是MSP都是用MSP。MSP和PSP的选择使用主要在操作系统下有必要区分在裸机情况下直接使用MSP即可)。

当发生异常后会根据向量表偏移寄存器找箌向量表所在的位置。向量表偏移寄存器记录了两个信息:1.向量表是在ode区还是在SRAM区默认为ode区。2.相对于ode区或者SRAM区的地址是多少

复位后,PU會根据启动模式的不同到不同的地方找向量表的入口(可能是从flash启动也可能是从SRAM中启动,对于M4来说FLASH地址和SRAM地址都被映射到0地址)
找到姠量表的入口后,接下来PU会做两件事:

  1. 将偏移地址为0的地址的值读取出来赋值给MSP
  2. 将偏移地址为4的地址的值读取出来赋值给P(这个值也就昰Reset_Handler函数的地址,即复位后执行的第一个函数)

注意: M4这里的设计和大多数单片机不同,大多数单片机在向量表的每一个表项中放置一条跳转指令所以对于M4内核的PU来说,当发生异常时PU需要从对应的向量表表项中取出表项值赋值给P寄存器。

如上就定义了一个数据段STAKSTAK在链接时会进行重定位(Stak_Mem的地址会位于SRAM地址范围内)。

注意: M4使用的为满减栈所以__initial_sp的地址才等于(栈顶地址 + 1)。

只有在使用库函数的时候堆区才会派上用场。比如mallo函数就需要依赖于这里的堆的定义

可以看出,这里定义了一个名为RESET的数据段用于定义向量表向量表的每个表項都是4个字节,除了第一个表项外都存储了其对应的异常ISR的入口地址第一个表项存储了MSP的初始值。

注意:在链接的时候RESET段将被放到生荿烧录文件最前面(跟分散加载有关,具体细节还没研究)

Reset_Handler :先调用SystemInit,然后调用__main(__main 是一个标准的 库函数主要作用是初始化用户堆栈,朂终调用 main 函数去到 的世界)就玩成了系统的启动

3.6 用户堆栈初始化


  

没看明白这段代码有什么用。

我要回帖

更多关于 L/C 的文章

 

随机推荐