指令集和mcu厂商
目前常见的指令集有x86、arm、mips、risc-v等,虽然存在多种cpu指令集架构和各自的mcu产品,但市场上基本都是基于arm cortex-m的产品,其历史悠久、产品成熟、生态丰富。
arm向mcu厂商提供cpu内核IP,后者在此基础上整合各种外设电路最终形成soc,其中内核也许仅占soc面积的10%左右。
程序开发现状
裸机编程
在最开始,mcu的编程都要从汇编开始,即使现在,也是首先通过先执行汇编代码进行基本的硬件初始化,然后跳到c程序的main函数。理论上,结合arm和芯片厂商提供的文档,全部用汇编编程是可能的。
arm和mcu厂商在更容易开发的和推广自己产品的驱动下,前者定义了内核软件的标准接口Cortex Microcontroller Software Inter-face Standard (CMSIS),后者在此标准基础上开发了mcu的驱动程序库。当然不同厂商、各厂商不同阶段所提供的库的使用方式和易用性也会有所差异,比如stm32最初提供的标准库开发方式,目前转向STM32Cube HAL库,提供了更好的硬件抽象层和封装进和移植性,另外还提供了STM32CubeMX图形工具用来生成项目代码。
不同的编程方式需要对mcu各硬件部分的理解程度不同,汇编方式需要对cortex-m内核和片上外设工作原理、各部分寄存器非常熟悉才行,目前这种方式通常仅用于厂商来提供进入c代码的初始化工作;还有一个应用场景是操作系统开发者,操作系统开发者需要根据不同的指令集、内核架构移植平台相关的代码,有的可能利用厂商提供的汇编代码,有的就需要自己参考arm和厂商文档,写出更适合自己操作系统的代码。
stm32的标准库开发方式相比后来提供的hal库方式需要对硬件了解的更多,相比后者需要更多的经验,但也让开发者对于硬件的工作原理也更熟悉,虽然hal库提供的更好的封装性,但有时候如果不了解某部分硬件的工作原理也很难上手。
基于操作系统
随着软件功能越来越复杂和对于多任务的需求,上述纯基于厂商库的开发方式已经不能满足需要,这时候需要使用操作系统来做一部分抽象工作,当然主要目的还是为了实现多任务。
在物联网发展的早期,多数的操作系统仅为具有基本操作系统功能的内核代码,比如实现了多任务调度、任务之间的同步和通信等,一般不包括目前物联网操作系统所需要的各种协议栈和组件库,比如Free RTOS等。
随着所需要的功能越来越多和现有的操作系统内核缺陷,有些企业和组织便开始了新一代的嵌入式实时操作系统也就是物联网系统的开发。物联网操作系统相对于以前的操作系统内核,提供了更多的通讯协议栈、硬件驱动接口和第三方组件支持,这样的系统才能算是一个真正的操作系统而不是内核。
目前,提供物联网操作系统的厂商有几家,有的具有雄厚的实力支持,功能不断更新迭代,有的投入有限,仅仅吹嘘下而已(特别是国内)。目前arm平台建议使用arm官方提供的mbed,跨平台系统建议考虑有Linux成员主导的zephyr OS。后者目前相对于前者,缺少必要的工具和生态支持。