目录
- 一、ResourceM模块的作用以及原理
- 1.ResourceM模块的作用
- 2.单核系统运行原理
- a.上电复位
- b.启动代码执行
- c.应用程序加载
- d.应用程序执行
- 3.代码执行过程
- 4.内存分配
- a.地址空间划分
- b.具体地址分配
- c.示例说明
- 4.多核系统运行原理
- a.MCU架构
- 二、EB配置介绍
- 三、总结
一、ResourceM模块的作用以及原理
1.ResourceM模块的作用
- 硬件平台设置:ResourceM模块允许用户设置硬件平台,通常在下拉框中选择与创建EB工程时选择的硬件平台相关的选项。
- 多核资源分配:在支持多核的系统中,ResourceM模块负责将不同的硬件资源分配给不同的核心(Core)。例如,可以将ADC(模数转换器)等硬件资源分配给特定的从核,以减轻主核的负载或平衡资源分配。
- 主核设置:在多核系统中,ResourceM模块还允许用户设置主核,通常是Core0。
2.单核系统运行原理
a.上电复位
- 当MCU接入电源后,电源电路开始提供稳定的电压。
- 电源稳定后,MCU内部的复位电路会被触发,确保MCU从一个已知的初始状态开始启动。
- 所有的CPU寄存器、状态标志和特殊功能寄存器被重置为默认值,例如,通用寄存器被清零,程序计数器(PC)被设置为启动代码的起始地址。
b.启动代码执行
- 默认堆栈指针:MCU的硬件设计确保在复位后,第一个执行的指令位于固定的内存地址,通常是内部ROM或闪存的开始位置。
- 系统初始化:启动代码首先执行硬件级别的初始化,包括设置CPU时钟源、时钟分频器、系统总线时序等。
- 内存检测(可选步骤):启动代码可能会执行内存自检(如RAM测试),确保内存模块正常工作。
- 外设初始化:启动代码继续配置和启用MCU的外设,如串行接口、定时器、ADC、PWM等。
- 中断向量表配置:中断向量表被设置,中断优先级可能被配置。
- 系统参数设置:根据需要,启动代码会配置系统参数,如设置操作系统的堆栈大小、初始化通信接口等。
- RTOS准备(如果适用):如果系统使用实时操作系统(RTOS),启动代码会初始化RTOS所需的资源和数据结构。
c.应用程序加载
- 启动代码定位应用程序代码,这通常存储在非易失性存储器(如闪存)中。
- 校验和验证:启动代码可能执行校验和核对或数字签名验证,以确保应用程序的完整性和安全性。
- 应用程序代码被复制到RAM中,以便快速执行
d.应用程序执行
- 启动代码通过跳转到应用程序的入口点(通常是主函数或其他启动例程)来开始执行应用程序代码。
- 应用程序开始运行,执行用户定义的任务和操作。
3.代码执行过程
- 取指令:
根据程序计数器(PC)中的值从程序存储器读出现行指令,送到指令寄存器。 - 分析指令:
将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。
如指令要求操作数,则寻找操作数地址。 - 执行指令:
根据指令的功能和操作数执行相应的操作。
更新程序计数器(PC)的值,以便取下一条指令。
4.内存分配
a.地址空间划分
STM32F103的内存地址空间被划分为多个区域,每个区域都有特定的用途和属性。这些区域包括:
- **代码区:**通常位于内存的低地址段,用于存储程序代码。这个区域可能包括ROM(如果MCU包含内置的ROM)或FLASH(如果MCU使用外部或内置的FLASH存储器来存储程序)。
- **数据区:**位于代码区之后,用于存储程序运行时需要访问的数据。这个区域通常包括RAM(随机存取存储器)和可能的其他类型的数据存储器。
- **外设区:**用于映射MCU的外设寄存器。这些寄存器允许软件通过内存访问来控制MCU的外设。
b.具体地址分配
在STM32F103中,具体的地址分配可能因型号和配置而异,但通常遵循以下原则:
- FLASH地址:
STM32F103的FLASH存储器通常位于内存的较低地址段,例如从0x08000000开始。
FLASH存储器用于存储程序代码、常量数据和可能的其他固定数据。
在MCU复位后,程序计数器(PC)通常从FLASH存储器的起始地址开始读取指令。 - SRAM地址:
SRAM(静态随机存取存储器)通常位于FLASH存储器之后,例如从0x20000000开始。
SRAM用于存储程序运行时需要动态访问的数据,如变量、栈和堆等。
SRAM的读写速度较快,因此适合用于需要频繁访问的数据。 - 外设寄存器地址:
外设寄存器通常映射到特定的内存地址段,这些地址段与SRAM和FLASH地址段是分开的。
通过访问这些寄存器地址,软件可以控制MCU的外设,如GPIO(通用输入输出)、UART(通用异步收发传输器)、SPI(串行外设接口)等。
c.示例说明
假设我们有一个基于STM32F103的嵌入式系统,其中包含一个LED闪烁程序。这个程序存储在FLASH存储器中,并在MCU复位后由程序计数器开始执行。程序执行过程中,它可能会访问SRAM中的变量来存储LED的状态或计时信息。
- **FLASH地址:**程序代码存储在FLASH存储器的某个地址段中,例如从0x08000000开始的区域。当MCU复位时,程序计数器从这个地址开始读取指令并执行。
- **SRAM地址:**程序在运行时需要访问的变量存储在SRAM中,例如从0x20000000开始的某个地址段。这些变量可能包括用于控制LED状态的标志位、用于计时的计数器等。
- **外设寄存器地址:**当程序需要控制LED时,它会访问与GPIO相关的外设寄存器。这些寄存器映射到特定的内存地址段,例如某个位于0x40021000附近的地址。通过写入这个地址的值,程序可以控制GPIO的输出状态,从而控制LED的亮灭。
4.多核系统运行原理
a.MCU架构
- 以下分别为英飞凌TC33X与TC39xMCU架构,可见多核MCU与单核MCU区别可以简单理解为CPU数量的区别(多核仲裁机制暂不深究)。大部分MCU架构总的来说可以分为三大部分储存器、CPU、片内总线
- 在MCU中所有的储存器都会被设定特定的地址段以便访问,包括CPU内部的缓存区域
- 在多核系统中尽管变量是定义在flash中的,但不同核提高运行速率会将Flash中的数据拷贝至Cache中进行更新以及读取,并且TC3xx系列不会自动写回(将Cache中数据写回至Flash中),因此同一个数据在不同核读取出得值将会不一样,因此在多核系统中对数据的分核也需要注意
- 多核共享外设寄存器
- 除了CPU数量不同外以及上述说的问题点外,多核系统与单核系统运行方式并无其他不同,且每个CPU相对独立,因此多核系统为真并行系统
二、EB配置介绍
- 这里将会列出对应MCU支持的所有Core
- EB只负责生成对应外设初始化配置,这里分核的意义在于将不同外设放在不同进行初始化,后续操作核也尽可能保持一致。部分外设既需要在设定核初始化也需要在主核初始化,例如TC3xx的adc外设,取决于MCAL SDK包设定。
- TC3xx EB存在BUG,PWM模块必须分配一个资源在Core0,否则将不生成Config结构体
三、总结
本文为博主个人理解总结记录,如有不正,欢迎指正