linux和RTOS架构区别
一、应用场景不同
现阶段单片机的内核有cortex-M3或者cortex-A7等,一般M3内核主要用来移植一些轻量级操作系统,例如FreeRTOS,rtthread等,但是A7内核一般会用来移植linux操作系统,问题来了,我该怎么知道我要用什么系统了。
linux:
- Cortex-A7:是为计算而生的平台,追求吞吐量,为运行大型操作系统和复杂应用提供基础。平均速度快,但最坏情况下的延迟很高且不可预测。
- 比喻:一个城市的管理员,它的目标是让整个城市繁荣稳定,能同时处理无数任务,保证每个任务最终都能得到处理,但不保证某个紧急任务一定能被立即处理(内核的“不可抢占性” )。
RTOS:
- Cortex-M3:是为控制而生的大脑,追求实时、高效、低成本地控制硬件。访问内存的速度是固定且可预测的。
- 比喻:一个精确的自动驾驶仪。它的目标单一而极端:保证某个特定任务必须在绝对确定的时间点内完成,毫秒不差。
二、读写指令架构不同
传统单片机(如Cortex-M系列,无DDR,只有SRAM和Flash)
PC指针指向Flash中的指令i++(假设i是全局变量)。
CPU从Flash中取出指令并解码,发现需要操作变量i。
访问SRAM:
- 读取阶段:CPU直接访问SRAM中i的地址,将当前值(例如5)加载到寄存器(如R0)。
- 计算阶段:CPU在寄存器中执行R0 = R0 + 1(现在R0=6)。
- 写入阶段:CPU将R0的值写回SRAM中i的地址。
应用处理器(如Cortex-A7,带DDR和缓存)
PC指针指向DDR中的指令i++(指令可能已被缓存到L1指令缓存)。
CPU解码指令,发现需要操作变量i。
访问数据:
- 缓存查找:CPU首先检查L1数据缓存(SRAM)中是否有i的值:
缓存未命中:触发“缓存行填充”,从DDR中加载i所在的内存块(如64字节)到L1缓存,再读取i的值(较慢)。
缓存命中:直接从L1缓存读取i的值到寄存器(最快)。
计算阶段:CPU在寄存器中完成i+1的计算。
写回数据:
新值先写回L1缓存(SRAM),此时DDR中的i可能还未更新。
根据缓存策略(写透/写回),数据可能同步或异步更新到DDR。
总结:
linux系统中平均运行指令的速度肯定比RTOS快,原因就在于从flash取指令是一个特别耗时的过程,虽然linux会将DDR的部分代码段拷贝到SRAM中耗时,但是后续直接在SRAM处理是特别快的。
RTOS中的SRAM :用于存储堆,栈,全局和静态变量区的数据。
Linux中的SRAM:作为CPU和DDR之间的高速缓冲,用于存储部分代码段和部分数据,目标是减少访问DDR的次数。
DDR:作为主内存,存储所有数据和代码,但CPU不直接访问它,而是通过缓存间接访问。
为什么linux不采用flash作为主存,而采用DDR?
我们在低端芯片中,程序都是存放在flash中的,它的特性是掉电不丢失,但是在高端芯片里面,flash的读写速度已经无法满足现代高性能处理器(如Cortex-A7)对代码执行速度的苛刻要求,因此需要放在一个运行速度更快的存储设备DDR中,它掉电不保存,这也就意味着,我们需要先把程序存储在一个掉电保存的存储介质中,然后在将其加载到DDR中。
三、吞吐速率不同
通过网线传递大量数据,两者的处理方式完全不同
传统单片机(如Cortex-M系列)
1、物理层PHY芯片接收数据
2、MAC层处理与DMA请求,将数据直接从MAC的FIFO中写入到SRAM中
3、当DMA完成一帧数据的传输后,或者当MAC的接收FIFO达到一定水位时,中断控制器会产生一个中断信号,通知CPU处理数据
4、CPU保存当前执行现场的上下文,跳转到预先设置好的中断服务程序,拷贝数据,开始处理
应用处理器(如Cortex-A7)
过程其实和上述大致一样,我主要讲解一下区别
传统方式:每个数据包到达都触发一个中断,CPU马上处理。Linux NAPI:第一个包到来触发中断。在中断处理程序上半部中,屏蔽进一步的中断,并轮询(Poll)网卡一段时间,一次性收取多个数据包,然后再打开中断。它通过牺牲单次处理的实时性,换取了处理海量数据时的整体效率。
支撑linux一次性读取多个数据包的硬件条件是DDR,SRAM的容量小(几KB到几MB),当网络数据洪峰到来时,它的缓冲区一下子就被填满,但是DDR的容量大(几百MB到几GB),所以可以很轻松开辟一个大缓冲区接收数据
四、核心数量不同
Cortex-A7:支持 1 到 4 个核心。它的设计初衷就是支持多核配置,以实现更强的并行处理能力。
Cortex-M3:只有 1 个核心。它的设计目标是单核的实时控制和低功耗处理。
五、时钟频率不同
Cortex-M3:几十MHz ~ 几百MHz
Cortex-A7:几百MHz ~ 多核GHz
时钟频率:CPU执行操作的基本节拍
指令周期:CPU从取出一条指令到执行完这条指令所需要的全部时间。(Cortex-M3 没有“指令周期”概念,大多数指令执行只需 1 时钟周期(如
ADD
,MOV
,LDR
,STR
))机器周期:CPU完成一个最基本总线操作(如一次内存读)所需的时间。(Cortex-M3没有“机器周期”概念,现代CPU的SRAM与CPU同频工作,内存访问无需等待,因此“总线操作时间”直接等于时钟周期。所有操作直接用时钟周期计量,无需“机器周期”作为中间层)
在 Cortex-M3 中,时钟周期 ≈ 机器周期 ≈ 指令周期,因为“机器周期和指令周期已淘汰,所有时间直接以时钟周期计算”。
例如:
i++;是一条代码,编译器会将i++编译成下述指令
LDR R0, =0x20000100 ; 将i的地址加载到R0(一个时钟周期,可能被优化掉)
LDR R1, [R0] ; 从内存加载i的值到R1(一个时钟周期)
ADDS R1, R1, #1 ; R1 = R1 + 1(一个时钟周期)
STR R1, [R0] ; 将R1的值存回内存(一个时钟周期)
六、专业名词讲解
(1)SRAM Static Random-Access Memory,中文是静态随机存取存储器。静态”:指的是只要保持通电,它里面存储的数据就能一直“稳定地”保存着,“随机存取”:指的是它可以随时读取或写入任何地址的数据,
(2)DRAM的全称是 Dynamic Random-Access Memory,中文是动态随机存取存储器,动态”详解数据被写入后,就像用铅笔写在文件架上的便签,即使不停电,字迹也会慢慢变淡直至消失(电容电荷泄漏)。因此,必须有一位助理定期地、一遍遍地把所有便签重新描一遍(刷新),才能保住数据。计算机的主内存(我们常说的8GB、16GB内存就是它)。
(3)DDR 的全称是 Double Data Rate Synchronous Dynamic Random-Access Memory。 中文翻译为:双倍数据速率同步动态随机存取存储器,它指的是在每个时钟周期(Clock Cycle)的 上升沿(Rising Edge) 和 下降沿(Falling Edge) 各可以传输一次数据,本质上还是DRAM,只是速度是他的两倍。