
大家好,我是良许。
在嵌入式开发的这些年里,我接触过各种各样的处理器架构,从最早做单片机时用的51内核,到后来做汽车电子时用的ARM Cortex-A系列,再到现在项目中偶尔会碰到的RISC-V架构。
每次换一个新架构,都需要重新熟悉它的特性和开发方式。
今天就和大家聊聊嵌入式处理器架构这个话题,帮助大家建立一个系统的认知框架。
处理器架构,简单来说就是处理器的设计蓝图和规范。
它定义了处理器如何执行指令、如何管理内存、如何与外设交互等一系列核心问题。
就像盖房子需要先有建筑设计图纸一样,处理器的制造也需要先有架构设计。
从技术角度来看,处理器架构主要包含以下几个方面:
1.1 指令集架构(ISA)
指令集架构是处理器架构的核心,它定义了处理器能够识别和执行的所有指令。
比如ARM架构有自己的指令集,x86架构也有自己的指令集,它们是完全不同的。
这就像不同的语言一样,说中文的人听不懂英文,反之亦然。
在我刚开始做嵌入式开发的时候,用的是51单片机,它的指令集非常简单,只有几十条指令。
后来转到ARM平台,发现ARM的指令集要复杂得多,但也更加强大和灵活。
1.2 寄存器组织
寄存器是处理器内部用于临时存储数据的高速存储单元。
不同的架构有不同数量和类型的寄存器。
比如ARM Cortex-M系列有16个通用寄存器,而x86架构的寄存器组织方式就完全不同。
1.3 内存管理
处理器如何访问和管理内存也是架构的重要组成部分。
有些架构支持虚拟内存管理单元(MMU),有些只支持内存保护单元(MPU),还有些什么都不支持。
这直接影响到系统能否运行复杂的操作系统。
1.4 流水线和执行单元
现代处理器通常采用流水线技术来提高执行效率。
不同架构的流水线级数、执行单元数量和组织方式都不相同,这直接影响到处理器的性能表现。
ARM架构可以说是嵌入式领域的绝对霸主,市场占有率超过90%。
我在外企做汽车电子的时候,用的就是ARM Cortex-A系列处理器。
ARM架构的成功主要得益于其低功耗、高性能和良好的生态系统。
ARM架构主要分为以下几个系列:
2.1.1 ARM Cortex-M系列
这是专门为微控制器(MCU)设计的系列,主打低功耗和实时性。
我们常用的STM32就是基于Cortex-M内核的。
比如STM32F103使用的是Cortex-M3内核,STM32F407使用的是Cortex-M4内核(带DSP指令和浮点运算单元)。
下面是一个简单的STM32 HAL库示例,展示如何初始化GPIO:
#include "stm32f4xx_hal.h"
void GPIO_Init_Example(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 使能GPIOA时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/* 配置PA5引脚为输出模式 */
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 点亮LED */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
}2.1.2 ARM Cortex-A系列
这是为应用处理器设计的系列,性能强大,支持运行Linux等复杂操作系统。
我在外企做的汽车娱乐系统就是基于Cortex-A9的处理器,运行的是定制版的Linux系统。
这类处理器通常主频在几百MHz到几GHz之间,支持MMU、多核心等高级特性。
2.1.3 ARM Cortex-R系列
这是为实时系统设计的系列,介于M系列和A系列之间。
主要用于对实时性要求极高的场合,比如汽车的安全系统、工业控制等。
x86架构主要由Intel和AMD主导,在PC和服务器领域占据统治地位。
虽然在传统嵌入式领域应用不多,但在工业PC、边缘计算等场景中也有一定的应用。
x86架构的特点是性能强大、生态成熟,但功耗相对较高。
Intel推出的Atom系列处理器就是专门针对嵌入式和移动设备的低功耗版本。
我见过一些工业控制系统使用x86架构的嵌入式主板,主要是因为需要运行一些只有x86版本的专业软件。
RISC-V是近年来异军突起的开源指令集架构,由加州大学伯克利分校开发。
它最大的特点就是完全开源,任何人都可以免费使用,不需要支付授权费用。
RISC-V采用模块化设计,基础指令集非常精简,只有40多条指令,然后可以根据需要添加各种扩展模块。
这种设计理念非常适合定制化需求强烈的嵌入式应用。
虽然RISC-V目前的生态还不如ARM成熟,但发展势头非常迅猛。
国内很多芯片厂商都在积极布局RISC-V,比如平头哥、芯来科技等。
我最近也在关注RISC-V的发展,考虑在一些新项目中尝试使用。
MIPS架构曾经在嵌入式领域占有一席之地,特别是在网络设备和消费电子产品中。
但近年来市场份额逐渐被ARM蚕食。
MIPS的特点是指令集简洁、流水线效率高,但生态系统相对薄弱。
除了上述主流架构,还有一些专用或小众架构,比如:
处理器架构从指令集设计理念上可以分为RISC(精简指令集)和CISC(复杂指令集)两大类。
RISC架构的特点是指令数量少、指令格式统一、每条指令执行时间固定。
ARM、RISC-V、MIPS都属于RISC架构。
RISC架构的优势是设计简单、功耗低、容易实现流水线,非常适合嵌入式应用。
CISC架构的特点是指令数量多、指令功能复杂、指令长度可变。
x86就是典型的CISC架构。
CISC架构的优势是代码密度高、功能强大,但设计复杂、功耗较高。
在实际开发中,我发现RISC架构的处理器通常更容易上手,汇编代码也更容易理解。
比如ARM的汇编代码就比x86的汇编代码简洁很多。
处理器的位宽指的是处理器一次能处理的数据位数。
常见的有8位、16位、32位和64位。
位宽越大,处理器能够直接处理的数据范围就越大,寻址空间也越大。
但位宽增加也会带来功耗和成本的增加。
在实际项目中,需要根据应用需求选择合适的位宽。
我在做单片机项目的时候,发现32位处理器已经成为主流选择。
即使是一些简单的应用,也倾向于使用32位MCU,因为价格已经降到了可以接受的范围,而且开发效率更高。
处理器的主频(时钟频率)是衡量性能的重要指标之一,但不是唯一指标。
同样主频的不同架构处理器,性能可能相差很大。
在嵌入式系统中,我们通常使用DMIPS(Dhrystone MIPS)或CoreMark来衡量处理器的实际性能。
比如ARM Cortex-M4在100MHz主频下,性能大约是125 DMIPS。
下面是一个简单的性能测试代码示例:
#include "stm32f4xx_hal.h"
#include <stdio.h>
#define TEST_ITERATIONS 1000000
void Performance_Test(void)
{
uint32_t start_tick, end_tick;
volatile uint32_t result = 0;
/* 记录开始时间 */
start_tick = HAL_GetTick();
/* 执行测试循环 */
for(uint32_t i = 0; i < TEST_ITERATIONS; i++)
{
result += i * 2;
result -= i / 2;
}
/* 记录结束时间 */
end_tick = HAL_GetTick();
/* 计算执行时间 */
uint32_t elapsed_time = end_tick - start_tick;
printf("Test completed in %lu ms\n", elapsed_time);
printf("Result: %lu\n", result);
}功耗是嵌入式系统设计中非常重要的考虑因素,特别是对于电池供电的设备。
不同架构的处理器在功耗方面差异很大。
ARM Cortex-M系列在低功耗方面做得非常出色,支持多种低功耗模式:
下面是一个进入低功耗模式的示例:
#include "stm32f4xx_hal.h"
void Enter_Sleep_Mode(void)
{
/* 挂起SysTick中断 */
HAL_SuspendTick();
/* 进入Sleep模式 */
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
/* 从Sleep模式唤醒后恢复SysTick */
HAL_ResumeTick();
}
void Enter_Stop_Mode(void)
{
/* 使能PWR时钟 */
__HAL_RCC_PWR_CLK_ENABLE();
/* 挂起SysTick中断 */
HAL_SuspendTick();
/* 进入Stop模式 */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/* 从Stop模式唤醒后重新配置系统时钟 */
SystemClock_Config();
/* 恢复SysTick */
HAL_ResumeTick();
}中断系统是嵌入式处理器的重要组成部分。
不同架构的中断系统设计差异很大。
ARM Cortex-M系列使用NVIC(嵌套向量中断控制器),支持多达240个中断源,每个中断可以配置16个优先级。
这种设计非常灵活,能够满足复杂应用的需求。
在实际开发中,合理配置中断优先级非常重要。
我的经验是:
#include "stm32f4xx_hal.h"
void NVIC_Config_Example(void)
{
/* 配置USART1中断优先级 */
HAL_NVIC_SetPriority(USART1_IRQn, 1, 0); // 抢占优先级1,子优先级0
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* 配置TIM2中断优先级 */
HAL_NVIC_SetPriority(TIM2_IRQn, 2, 0); // 抢占优先级2,子优先级0
HAL_NVIC_EnableIRQ(TIM2_IRQn);
/* 配置外部中断优先级 */
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); // 抢占优先级0(最高),子优先级0
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}在实际项目中,选择合适的处理器架构需要综合考虑多个因素:
4.1 应用需求
首先要明确应用的具体需求。
如果只是简单的控制任务,8位或16位MCU就足够了。
如果需要运行复杂的算法或操作系统,就需要32位甚至64位的处理器。
我在做汽车电子项目的时候,因为需要运行Linux系统并处理大量的多媒体数据,所以选择了ARM Cortex-A系列的处理器。
而在做一些简单的传感器节点时,使用STM32F103这样的Cortex-M3就完全够用。
4.2 性能要求
要根据实际的计算量来选择处理器性能。
过高的性能会造成成本和功耗的浪费,过低的性能又无法满足需求。
一个实用的方法是:先估算应用的计算量,然后选择性能略高于需求的处理器,留出一定的余量。
我的经验是留出30%左右的性能余量比较合适。
4.3 功耗限制
对于电池供电的设备,功耗是首要考虑因素。
需要选择支持低功耗模式的处理器,并在软件设计时充分利用这些特性。
4.4 开发生态
开发工具链、软件库、技术支持等生态因素也很重要。
ARM架构在这方面具有明显优势,有大量的开发工具和参考资料可用。
4.5 成本因素
处理器的成本包括芯片价格、开发成本、授权费用等。对于大批量产品,即使每颗芯片节省几毛钱,总体也能节省很大一笔费用。
4.6 长期供货
嵌入式产品的生命周期通常很长,需要考虑处理器的长期供货能力。
一些老牌厂商如ST、NXP通常能保证10年以上的供货周期。
现代嵌入式处理器越来越多地采用异构多核设计,即在一颗芯片上集成不同类型的处理器核心。
比如ARM的big.LITTLE架构,同时包含高性能核心和低功耗核心,根据负载动态切换。
在汽车电子领域,我见过一些芯片同时集成Cortex-A核心(运行Linux)、Cortex-R核心(处理实时任务)和Cortex-M核心(控制外设),这种设计能够很好地平衡性能、实时性和功耗。
随着边缘AI的兴起,越来越多的嵌入式处理器开始集成AI加速单元,如NPU(神经网络处理单元)。
这些专用硬件能够大幅提升神经网络推理的效率。
安全性在嵌入式系统中越来越重要。
现代处理器普遍集成了硬件安全模块,如TrustZone、安全启动、加密引擎等。
RISC-V等开源架构的兴起,为嵌入式处理器市场带来了新的活力。
开源架构的优势在于灵活性和可定制性,能够满足特定应用的需求。
嵌入式处理器架构是一个博大精深的领域,涉及硬件设计、指令集、编译器、操作系统等多个层面。
作为嵌入式开发者,我们不需要成为架构设计专家,但需要对常见架构有基本的了解,这样才能在项目中做出正确的技术选择。
在我的职业生涯中,从51单片机到ARM,从简单的裸机程序到复杂的Linux系统,每一次架构的转变都是一次技术能力的提升。
我的建议是:先深入掌握一种主流架构(比如ARM),然后再去了解其他架构,这样能够建立起系统的知识体系。
随着技术的发展,新的处理器架构不断涌现,但核心的设计理念是相通的。
只要掌握了基本原理,学习新架构就会变得容易很多。
希望这篇文章能够帮助大家建立起对嵌入式处理器架构的整体认识,在实际项目中能够做出更好的技术决策。
更多编程学习资源
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。