本篇文章主要是介绍FSP在e2studio下生成的启动文件的代码说明,让用户对瑞萨RA MCU的启动过程有个初步了解。
![wKgaomaCaumAB97XAAAGsLfviRI327.png](https://file1.elecfans.com/web2/M00/F7/83/wKgaomaCaumAB97XAAAGsLfviRI327.png)
瑞萨灵活软件包(FSP)是一个灵活配置的软件包,旨在提供易于使用、可扩展、高质量的嵌入式系统设计软件。它适用于RA系列的MCU,提供了统一直观的API,并有详细的解释和例程应用,可以按照客户不同的需求自动生成相应驱动程序。
![wKgaomaCavGAKkayAAAJQSBHiuQ788.png](https://file1.elecfans.com/web2/M00/F7/83/wKgaomaCavGAKkayAAAJQSBHiuQ788.png)
启动文件是程序上电复位后执行的第一个程序。它一般包括如下几个:
1.初始化堆栈
2.使能FPU
3.定位中断向量表
4.配置系统时钟
5.启用CORTEX-M33栈监视器
6.初始化C语言运行环境
7.初始化变量SystemCoreClock,这个变量存放的是处理器时钟的频率
8.初始化用于触发NVIC中断的ELC(事件链接控制)
9.BSP初始化
![wKgZomaCavyAKZ3PAAAJmU2UgZU585.png](https://file1.elecfans.com/web2/M00/F6/97/wKgZomaCavyAKZ3PAAAJmU2UgZU585.png)
3.1 栈区(Stack)
一种顺序数据结构,满足后进先出原则。由编译器自动分配释放,存放函数的参数值,局部变量的值等。栈特别方便用来保存/恢复调用现场。在函数被调用时,其参数也会被压入发起调用的进程栈中,并待到调用结束后,函数的返回值也会被存放回栈中。如果函数调用时,如果函数参数和局部变量较多,寄存器放不下,则需要适当增加栈区的大小。
3.2 堆区(heap)
通常由程序员手动分配,使用malloc和free进行分配和释放。注意,使用完需及时释放(free),否则容易造成内存泄漏。
3.3 e2Studio中堆栈的设置
宏“BSP_CFG_STACK_MAIN_BYTES”可以在FSP Configuration的“BSP”属性栏中的“RA Common”中通过修改“Main stack size”设置,默认为1KB(0x400 Byte)。
宏“BSP_CFG_HEAP_BYTES”可以在FSP Configuration的“BSP”属性栏中的“RA Common”中通过修改“Heap size”设置,默认为1KB(0x400 Byte)。如图3-3-1所示。
![wKgZomaCbAqAYHczAAGe7HULgnM715.png](https://file1.elecfans.com/web2/M00/F6/98/wKgZomaCbAqAYHczAAGe7HULgnM715.png)
图3-3-1 堆栈区的大小设置
g_main_stack和g_heap分别代表主栈和堆区的数组,后面还有属性修饰。
“BSP_PLACE_IN_SECTION(BSP_SECTION_STACK)”,宏展开后为“__attribute__((section( “.stack”))) __attribute__((__used__))”
“BSP_PLACE_IN_SECTION(BSP_SECTION_HEAP)”,宏展开后为“__attribute__((section( “.heap”))) __attribute__((__used__))”
其修饰属性解释如下:
__attribute__((section( “参数名”))):可以将变量定义到指定的输入段“参数名”中。
__attribute__((__used__)):参数“__used__”告诉编译器,这个变量会被使用,即使在编译器优化时没有被显式地调用。这个属性可以防止编译器将未使用的函数或变量优化掉,确保它们在程序中存在。
![wKgZomaCbAqARZWtAAK0GC6JoWo499.png](https://file1.elecfans.com/web2/M00/F6/98/wKgZomaCbAqARZWtAAK0GC6JoWo499.png)
图3-3-2 堆栈区数组属性修饰
代码中的“BSP_ALIGN_VARIABLE(BSP_STACK_ALIGNMENT)” ,宏展开后为“__attribute__((aligned(8)))”,代表堆栈区在分配时,会按照8字节对齐方式进行。
__attribute__((weak)):用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行_weak 声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数。该函数不能在同一个.C文件中。
![wKgaomaCbAuAIYouAASjGNj-xFI215.png](https://file1.elecfans.com/web2/M00/F7/84/wKgaomaCbAuAIYouAASjGNj-xFI215.png)
图3-3-2 函数属性宏定义
![wKgaomaCa1qATWKsAAAJt8pY29I852.png](https://file1.elecfans.com/web2/M00/F7/83/wKgaomaCa1qATWKsAAAJt8pY29I852.png)
定义一个中断向量指针数组__Vectors[16],将此表放入到“.fixed_vectors”的输入段中。
![wKgaomaCbAuAZ05YAANzBbFcnkk875.png](https://file1.elecfans.com/web2/M00/F7/84/wKgaomaCbAuAZ05YAANzBbFcnkk875.png)
图4-1 中断向量表定义
![wKgZomaCa2qAZKVFAAAI12LoT6c554.png](https://file1.elecfans.com/web2/M00/F6/98/wKgZomaCa2qAZKVFAAAI12LoT6c554.png)
系统上电或复位后直接执行入口函数Reset_Handler(),包括两个函数:SystemInit()和main()。SystemInit()主要是用BSP对系统进行初始化,随后通过main函数进入用户代码。BSP负责使MCU从复位状态进入到用户的应用程序。在到达用户的应用程序之前,BSP设置堆栈、时钟、中断、C语言运行环境和堆栈监视器。
![wKgZomaCbAuARAyRAABe-XT-KJI507.png](https://file1.elecfans.com/web2/M00/F6/98/wKgZomaCbAuARAyRAABe-XT-KJI507.png)
图5-1 入口函数调用
![wKgaomaCa5GAGEIsAAAKxuapKCU544.png](https://file1.elecfans.com/web2/M00/F7/84/wKgaomaCa5GAGEIsAAAKxuapKCU544.png)
![wKgaomaCbA2AAbikAAKFHD8lmnc428.png](https://file1.elecfans.com/web2/M00/F7/84/wKgaomaCbA2AAbikAAKFHD8lmnc428.png)
![wKgZomaCbA2ASD7bAAJozQoy11I775.png](https://file1.elecfans.com/web2/M00/F6/98/wKgZomaCbA2ASD7bAAJozQoy11I775.png)
![wKgaomaCbA2ABTxyAAE-SnN1akg588.png](https://file1.elecfans.com/web2/M00/F7/84/wKgaomaCbA2ABTxyAAE-SnN1akg588.png)
![wKgaomaCbA2AFhS8AALOO1fmSpw202.png](https://file1.elecfans.com/web2/M00/F7/84/wKgaomaCbA2AFhS8AALOO1fmSpw202.png)
![wKgZomaCbA2AdimsAAEYCmc88so078.png](https://file1.elecfans.com/web2/M00/F6/98/wKgZomaCbA2AdimsAAEYCmc88so078.png)
![wKgaomaCbA2AMV_0AAJdn2FlG-Q480.png](https://file1.elecfans.com/web2/M00/F7/84/wKgaomaCbA2AMV_0AAJdn2FlG-Q480.png)
图6-1 系统函数初始化
![wKgaomaCa6aARDQrAAAMTowHwYg098.png](https://file1.elecfans.com/web2/M00/F7/84/wKgaomaCa6aARDQrAAAMTowHwYg098.png)
通过e2studio打开Memory Usage,可以看到各段的定义名称,起止地址,占用容量大小、对齐方式等。也可以通过打开工程文件夹下\e2studio\Debug\*.map文件。
![wKgaomaCa7eAP1x1AACYwKZuilI568.png](https://file1.elecfans.com/web2/M00/F7/84/wKgaomaCa7eAP1x1AACYwKZuilI568.png)
![wKgZomaCbA6AcrfBAARZIddYBJY254.png](https://file1.elecfans.com/web2/M00/F6/98/wKgZomaCbA6AcrfBAARZIddYBJY254.png)
图7-1 内存函数分配
![wKgaomaCa9WAawsYAAAmsw8zSpE244.png](https://file1.elecfans.com/web2/M00/F7/84/wKgaomaCa9WAawsYAAAmsw8zSpE244.png)
-
mcu
+关注
关注
146文章
16254浏览量
345674 -
代码
+关注
关注
30文章
4603浏览量
67390 -
FSP
+关注
关注
0文章
32浏览量
7046
发布评论请先 登录
相关推荐
用于Atom Denverton的英特尔FSP
STM32学习记录——固件库目录及文件介绍
![STM32学习记录——固件<b class='flag-5'>库</b>目录及<b class='flag-5'>文件</b>介绍](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32 之 标准外设版USB驱动库详解(架构+文件+函数+使用说明+示例程序)
![STM32 之 标准外设版USB驱动<b class='flag-5'>库</b>详解(架构+<b class='flag-5'>文件</b>+函数+使用<b class='flag-5'>说明</b>+示例程序)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32启动库文件学习笔记
![STM32<b class='flag-5'>启动</b><b class='flag-5'>库</b><b class='flag-5'>文件</b>学习笔记](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
FSP库启动文件详解
![<b class='flag-5'>FSP</b><b class='flag-5'>库</b><b class='flag-5'>启动</b><b class='flag-5'>文件</b>详解](https://file.elecfans.com/web2/M00/91/86/pYYBAGPsjbmAc-xLAADM8vDftoE161.png)
MongoDB数据库文件损坏的数据恢复案例
![MongoDB数据<b class='flag-5'>库文件</b>损坏的数据恢复案例](https://file.elecfans.com/web2/M00/9F/F3/poYBAGQ-Pg6AWHFxAAJ9VHkTNrk678.png)
评论