目录
三、如果我的文章能帮助到你,请点个赞鼓励一下吧ヽ(✿゚▽゚)ノ
前言:
学习嵌入式就必须要知道ARM,ARM是一家处理器内核设计公司,这个公司只负责设计内核方案,然后将内核方案(IP)授权给其他公司,其他公司再根据ARM内核来二次开发自己的MCU或CPU等处理器。ARM旗下的产品分为A系列(Advanced)、R系列(RealTime)和M系列(MicroController),合起来恰好就是ARM公司的名称(实际上ARM是Advanced RISC Machines的缩写),很有记忆点,接下来的介绍中我们会大量使用ARM的内核作为参考。
|----------------------|---------------|---------------|
| 内核类别 | 特点 | 用途 |
| A系列(Advanced) | 性能强劲 | 手机电脑等高端电子产品 |
| R系列(RealTime) | 高实时性和可靠性 | 军事、航天、工业控制等领域 |
| M系列(MicroController) | 主打性价比,性能<A系列 | 中低端电子产品 |
一、嵌入式细分领域介绍
嵌入式有很多细分领域,从操作对象上看可以大致分为三类:
1、单片机裸机开发:
以ARM内核为例,一般使用ARM-M系列内核设计的中低端MCU(如STM32G0x)进行开发,硬件资源十分有限,开发过程直接通过寄存器或HAL库操作MCU的外设(GPIO、TIM、ADC等),实现特定的功能;
2、实时操作系统开发:
以ARM内核为例,一般使用ARM-M或R系列内核设计的高性能MCU(如STM32F4x)进行开发,当然也有非ARM内核的,如乐鑫基于Xtensa LX6双核架构开发的ESP32系列MCU,性能同属一个级别,硬件资源中等,通过在MCU上部署实时操作系统,例如FreeRTOS操作系统,来进行更高级更复杂的嵌入式应用开发;
3、系统级开发
以ARM内核为例,一般使用ARM-A系列内核设计的高性能MPU,硬件资源丰富,通过在MPU(如Cortex-A系列)上部署操作系统,例如Linux操作系统,来进行系统级的嵌入式开发,例如我们所使用的手机就是基于ARM-A内核开发的嵌入式产品;
二、嵌入式不同领域常用的网络通信方法介绍
首先需要明确一点,不管是什么方法,要实现互联网网络通信,都绕不开一个基本盘------TCP/IP协议,这是实现网络通信的基础(在另一篇博文中我会详细介绍这个协议)
针对这三种不同的细分领域,要实现网络通信的方法也不尽相同。接下来我会把它们串联在一起,进行一个简单的介绍:
1、嵌入式单片机裸机开发领域:
在资源紧张的嵌入式设备上进行联网开发时,首先考虑集成好的网络通信模块,例如使用现成的WIFI模块(ESP8266)、4G联网模块(MN316)或者以太网联网模块(W5500)等,通过UART/SPI/IIC连接外挂在MCU上实现网络通信。
ESP8266-WIFI模块
MN316-2G/3G/4G/5G通信模块
W5500-以太网通信模块
以通过串口连接的WIFI模块为例,完成硬件连接后,MCU只需要往串口发送AT指令,就可以实现网络数据收发的操作,对于开发者而言,只需要将命令和数据通过串口发送到WIFI模块,这些数据会自动被封装,一层层包装校验位、IP地址、TCP帧、传输数据等信息,最后通过工作在2.4GHz/5GHz频段的WIFI模块将数据自动发送到AP通信接入点,传输到互联网。而WIFI模块接收到网络数据后,会自动解析网络传输数据,并将解析出的结构化数据包通过串口发送给MCU,对于开发者而言,可以直接读取外挂WIFI模块传输来的结构化数据。
如此一来,开发者无需关注TCP/IP实现网络编程的具体细节,这些细节在WIFI模块都已经实现并且封装,外挂模块网络通信的具体实现一般是通过对lwIP协议栈的二次封装实现的(除了以太网模块),lwIP通过一个"网络接口"抽象层与底层硬件驱动对接,模块厂商所做的工作,就是实现这个底层驱动,将无线电或PHY芯片的"裸数据"组装成lwIP能处理的"IP数据包",再交给lwIP的上层处理。
这里简单介绍一下lwIP协议栈,lwIP协议栈是专为嵌入式系统开发的一个轻量级网络通信协议栈,其内部实现了完整的TCP/IP协议,体积非常小,可以很方便的移植到嵌入式系统中。但是有一点,lwIP聚焦于TCP/IP协议的传输层及以上功能层的实现,只负责处理IP数据包,而对于你怎么把网络上接收的数据解析为IP数据包,lwIP协议栈是不关心的,而这一部分对应的正是物理链路层和物理层,如果使用WIFI或4G通信,那这部分就是无线电接收发送调制解调之类的内容,如果是以太网通信,那这部分就是电信号到IP数据包的解析,大多数网络通信模块都是在lwIP协议栈的基础上进行的二次封装开发,例如大家所熟知的ESP32物联网芯片。
2、嵌入式实时操作系统开发领域:
对于实时操作系统来说,主控芯片大部分使用的是MCU,仍然可以通过外挂模块的方案来实现网络通信,还有另一种方法,直接采用集成了WIFI/蓝牙模块的MCU进行嵌入式开发,就像大家所熟知的ESP32一样,直接将WIFI、蓝牙和MCU再进行一次封装,内置经过优化的lwIP和FreeRTOS操作系统,在VsCode上使用其配套的ESP-IDF环境可以直接进行实时操作系统级的嵌入式开发,但是VsCode这个软件需要配置环境,并且调试起来不太方便,不如Keil来的直接。
3、嵌入式系统开发领域:
成熟的操作系统已经将很多底层驱动封装成了许多API接口,以Linux操作系统为例,Linux内核完整实现了TCP/IP协议栈,并通过 Socket(套接字) 这个核心抽象,向应用程序提供统一的网络编程API接口。
Socket的设计完美遵循了Unix/Linux"一切皆文件"的哲学。当你调用 socket() 创建一个套接字后,会得到一个文件描述符,之后就可以像操作文件一样,使用 read()、write()(或更专用的 send()、recv())等标准IO函数进行网络数据传输。开发者如果想进行网络编程,只需要调用其中的Socket库中的函数即可,就像文件IO操作一样,而完全无需关心数据包是如何封装、路由、校验的。协议栈的所有细节,包括三次握手、流量控制、重传机制等,都由内核协议栈可靠、高效地处理。