前言

上一篇中,通过一个LED灯的闪烁来捋了下OpenHarmony的代码运行以及编译流程,此篇结合多任务的创建来浅浅分析一下OpenHarmony的系统框架及CMSIS-RTOS2接口。

OpenHarmony多线程创建

多线程业务代码新建

参考上一篇点亮LED灯的工程创建方式,首先需要新建一个多任务的“工程”。具体步骤如下:
1.在 applications/sample下新建一个A1_kernal_thread文件夹;
2.在A1_kernal_thread下新建 thread_example.c文件
3.在A1_kernal_thread下新建 BUILD.gn文件
在这里插入图片描述
然后分别编写多任务的业务代码以及配置,编译下载即可实现效果。

对比FreeRTOS

观察代码可以发现,这个多线程的创建与单片机中使用的FreeRTOS、RTX等操作系统有着异曲同工之处,任务创建的过程基本是一致的。
在这里插入图片描述
诶~~~,到这笔者有个疑问,鸿蒙使用的是LiteOS,而下面的代码中STM32是使用的FreeRTOS,按理来说是两种OS理应存在差异才对,而且二者的硬件底层架构也不同,STM32是ARM的架构,而hi3861貌似是RISC-V的架构(笔者在一篇文章上看见的,芯片手册上并没有说是啥架构)为什么从代码来看操作过程如此相似,难道是传说中的“套壳”?
Hi3861的模组功能示意:
在这里插入图片描述
STM32系统结构:
请添加图片描述
emmmm,在听了小熊派的讲解后,融合了一下元气派的讲解,笔者弄清楚了这个疑问,答案显然不是套壳。

KAL内核抽象

不知道大家还有映像没,在笔者第一篇鸿蒙介绍中,提到过一嘴KAL这个内核抽象层,鸿蒙是有多内核组成的,可能会有多个内核同时具有实现一个类似功能的能力,但是接口函数会存在差异,为了能够将接口进行统一鸿蒙在内核层进行了抽象,把线程管理、内存管理、文件系统、网络管理和外设管理的接口函数进行了统一。
在这里插入图片描述
如上图中KAL模块就有一个CMSIS的接口规范,说到CMSIS大家应该都有印象,在学习STM32新建工程的时候就一定会涉及到这个CMSIS的,那么CMSIS到底是什么呢,两个OS的任务创建如此相像又与他有何关系呢?继续扒一扒。

CMSIS简介

这里借用原子的描述:
经常有人问到 STM32 和 ARM 以及 ARM7是什么关系这样的问题,其实 ARM 是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而 TI,ST 这样的公司,他们并不做标准,他们是芯片公司,他们是根据 ARM 公司提供的
芯片内核标准设计自己的芯片。所以,任何一个做 Cortex-M3 芯片,他们的内核结构都是一样的,不同的是他们的存储器容量,片上外设,IO 以及其他模块的区别。所以你会发现,不同公司设计的 Cortex-M3 芯片他们的端口数量,串口数量,控制方法这些都是有区别的,这些资源他们可以根据自己的需求理念来设计。同一家公司设计的多种 Cortex-m3 内核芯片的片上外设也会有很大的区别。下图就是各个厂商基于 Cortex-m内核的微处理器产品。
请添加图片描述
正是因为这么多的厂商,这么多种类的微处理器,如果没有统一的标准来定义接口,大家都按照自己的意愿去编写代码,这将严重影响位处理器的生态;为了使大家都有一个统一的标准,CMSIS诞生了。
在这里插入图片描述
有关CMSIS的详细介绍参考此文,写的很通透——CMSIS到底是个什么东西
笔者的理解:CMSIS定义了统一的接口函数,这样使得用户在编写应用程序代码时可以不用去管底层,可以直接调用标准接口即可实现相应功能。
在这里插入图片描述
而在CMSIS的标准中,又分了几个成员,

  1. CMSIS-DSP,这个是数字信号处理器的接口定义,M4才有。
  2. CMSIS-RTOS,是一个通用的API,它与底层的RTOS内核无关,写应用程序的程序员在用户代码中调用CMSISRTOS2 API函数,可以更方便地将应用程序从一个RTOS到另一个RTOS,使用CMSIS-RTOS2 API的中间件也可以
    避免很多不必要的移植工作。
  3. CMSIS-SVD。
  4. CMSIS-DAP:通用的调试接口。在这里插入图片描述
    而OpenHarmony也是使用了CMSIS-RTOS2来统一接口,这也就是为什么两个OS如此相似的原因。聊聊CMSIS-RTOS是什么东东
    在这里插入图片描述
    更多有关CMSIS-RTOS2的介绍大家可以去ARM官网查看。

OpenHarmony移植到STM32

看到这,之前的疑问解决了,另外一个想法油然而生,既然OpenHarmony支持CMSIS的接口,只是不是意味着,可以反向操作,将OpenHarmony移植到我们常用的STM32、GD32或者其他架构的芯片呢,答案是必然的,刚好昨晚看了连志安老师移植到STM32F407的教程,笔者还没实操,等后面有时间一定会加以尝试。把链接共享给大家,想要操作的可以试试水——openharmony移植示例

总结

正是由于OpenHarmony使用了CMSIS-RTOS2的统一标准接口,这就使得我们在使用Hi3861进行多线程开发的时候可以借用FreeRTOS的开发经验,这可以大大降低我们使用Hi3861开发的难度。有关OpenHarmony的CMSIS-RTOS2接口简介及多线程就记录到此,文中如有错误之处欢迎大佬批评指出。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐