知识锦囊

系统架构介绍

OneOS 总体架构采用分层设计,主体由内核层、组件层、接口层以及安全框架组成,另外还有硬件层和应用层,但不属于 OneOS 操作系统的范畴。同时,采用一个轻量级内核加多个系统组件的模式,并采用统一的接口层,使物联网操作系统具备极高的可伸缩性和可移植性。操作系统整体架构如下图:
第13课 OneOS系统(二) - 图1
下面对总体架构的各层做一个简要描述。

硬件层

OneOS操作系统运行时所依赖的硬件环境,目前支持ARM Cortex-M、MIPS和RISC-V等主流芯片架构。随着OneOS操作系统的演进,会支持越来越多的芯片架构。

内核层

极简的硬实时内核,支持多任务管理调度、工作队列、任务间同步(信号量、互斥量、事件集、完成量)、任务间通信(消息队列、邮箱、数据队列)以及内存管理等。

组件层

包括网络协议、OneNET接入、远程升级、虚拟文件系统、SHELL命令行工具、日志系统、测试框架等。采用模块化设计,使各个组件的功能独立,易于灵活裁剪。

接口层

提供统一的抽象接口层,方便业务代码在多个操作系统间移植。在此接口层,主要适配如下的常用接口:

  • 标准C接口
  • Posix接口
  • CMSIS接口
  • RT-Thread接口
  • FreeRTOS接口

    应用层

    应用层是基于OneOS操作系统开发的应用程序,通常为某产品的业务代码。应用层可以基于抽象层开发,便于移植;也可基于内核层或组件层提供的接口开发,可以降低对硬件资源的使用(主要的是RAM和ROM)。

实践操作

在OneOS的内核层中有一些特色功能,接下来我们将通过2个任务一起来了解一下。

任务一:信号量

简介

信号量是一种解决同步问题的机制,可以实现对资源的有序访问,即一个任务完成了某个动作后,别的任务接下来才可以做其它事情。信号量的申请者和释放者可以不是同一个任务。
当信号量的取值只有0和1(即为二值信号量)时,如果参考互斥锁的使用方式,也可以用于对资源的互斥访问,不过采用这种用法时不能解决可能存在的优先级反转问题。

示例代码

路径:“OneOS_Wio_LTE\projects\Seeed_atsamd21g18a\application”中的“sem_test.c”代码。
image.png
观察代码我们可以发现:该程序创建了两个任务,在一个任务中申请信号量,在另外一个任务中释放信号量,只有当信号量被释放后,申请信号量的任务才能拿到信号量并往下执行。
image.png
接下来参考第12课的教学内容先对OneOS系统进行编译和上传,在使用USB转串口模块连接到电脑。然后同样使用MobaXterm连接到串口,在命令行界面中输入“dynamic_sem”来运行代码。
image.png然后在命令行中观察任务运行中的变化。

如果你想要将“信号量”应用在自己的项目上,那么你可以参考以下页面:
https://os.iot.10086.cn/doc/api_refer/kernel/sem.html

任务二:事件

简介

事件是任务间同步的一种机制。表示多个事件可以通过一个32个无符号数据删除,其中每一个位代表一个事件,通过“逻辑或”或者“逻辑与”将多个位事件关联起来,形成集合,等待事件集合满足之后,就会被唤醒。 “逻辑或”指任务集合中的某个时间一个事件发生,而“逻辑与”需要等待集合中的所有事件才会发生被唤醒。
用比特表示,仅用于同步,无法传输数据;如果向多个任务发送同一事件,且任务还没有来得及读取该事件,则该事件将被当成一次处理。

示例代码

路径:“OneOS_Wio_LTE\projects\Seeed_atsamd21g18a\application”中的“event_test.c”代码。
image.png
观察代码我们可以发现:该程序用动态的方式创建并初始化了一个事件,接收事件的任务采用“逻辑与”的方式接收事件,在多个事件都接收到之后,被唤醒。
image.png
接下来参考第12课的教学内容先对OneOS系统进行编译和上传,在使用USB转串口模块连接到电脑。然后同样使用MobaXterm连接到串口,在命令行界面中输入“dynamic_event”来运行代码。
image.png然后在命令行中观察任务运行中的变化。

如果你想要将“事件”应用在自己的项目上,那么你可以参考以下页面:
https://os.iot.10086.cn/doc/api_refer/kernel/event.html