一般而言,常见(某宝上容易买到的)的单片机及其开发板,两百元以下,主要有STC、Arduino、STM32、TI、NXP、Nutiny几大系列。
由于Arduino易于上手,看起来似乎ATmega328P作为8位单片机也自然该以库函数的方式写代码,这样的感觉很容易导致初学者在想要写更多代码、使用更多片上资源的时候,极为自然的转移到STM32(另一个将库函数封装得很易于上手的阵营),Arduino和STM32在调用库函数进行开发方面确实极为相似,STM32的官方推荐IDE(SW4STM32、TrueSTUDIO)似乎好像就是Arduino IDE的高级版本,而且也有一些优秀的项目成功将STM32移植到Arduino平台,一切看起就那么完美无缺。
然而还是有很多问题:
1、为何Arduino IDE中明明可以调用freeRTOS库,却只能在ATmege系列单片机上运行?
2、为何STM32的官方库有如此多功能支持,而STC几乎没有官方库?
3、为何同样是RTOS移植,从STM32F4上移植到tiva C很容易,从arduino上移植到STC很难(如果不考虑RTOS的资源消耗)?
这实际上涉及到单片机内核的差异,可以大致按位数划分。
8位单片机有STC、Arduino---在实际工程项目中,Arduino实际上并不常用,ATmege系列单片机本身的成本还是挺高的,而国产的8位单片机可以做到最低0.2元/片的价格,这些国产8位单片机反而更类似于STC,特点是片上资源稀缺、寄存器操作较为简单,故实际写代码的时候,如果不用汇编而用C语言,则给人感觉是把C语言当作汇编在使用;另一方面,由于8位单片机都是采用CISC(复杂指令集计算机)架构,因此对I2C这种不依赖于特定时钟的位操作通信,一般不太容易出错。
16位单片机有TI的MSP430,同样的也还有DSPIC30等,不过常见的就MSP430,而MSP430的最大特点莫过于低功耗,但由于采用RISC(精简指令集计算机)架构,以至于其他方面似乎有些高不成低不就,了解不多。
32位单片机,差不多可以分为两大阵营,ARM内核和非ARM内核,无论是STM32、Nutiny,还是TI Tiva C系列,都是采用ARM内核,而ARM内核在单片机上主要就区分Cortex-M0、Cortex-M0+、Cortex-M3、Cortex-M4、Cortex-M7,内核部分包含了指令集、存储器(总线)、中断等内容,恰好是RTOS的核心内容,因此在RTOS移植方面,只要是ARM内核,RTOS核心部分几乎可以原封不动,只需要修改地址和容量(总线部分)的参数即可;至于如esp8266等非ARM内核的单片机,由于内核的差异,因此开发时关于库的移植应当尤其注意。
知晓上述关于内核的差异(实际上我们并不关心内核的实现细节)之后,关于前面提到的3个问题似乎就有了顺利成章的答案,开发时应当尤其注意内核差别带来的一系列问题,万事不可想当然。