Zephyr RTOS -- 学习笔记总述

文章目录

    • 摘要
    • 1. 开发基础部分
      • 1.1 开发环境的搭建
      • 1.2 新工程的创建与编译
      • 1.3 软硬件的配置过程
      • 1.4 编译过程简介
      • 1.5 小结
    • 2. 内核服务入门
      • 2.1 调度、中断与同步
      • 2.2 数据传递

本笔记基于 Zephyr 版本 2.6.0-rc2

 

摘要

1. 开发基础部分

1.1 开发环境的搭建

在任何系统进行开发都少不了开发环境的搭建这一步,开发环境没搭好,就无法进行下一步,也就没办法进行后续开发。所以开发环境的搭建是基础,是万里长征的第一步。那么 Zephyr 怎么进行开发环境的搭建呢?

具体的步骤请参照 开发环境的搭建 一文,这篇文章主要介绍的是在 Windows 环境下的搭建步骤。

还有关于支持 Nordic 的 nRF Connect SDK (NCS) 环境搭建NCS 的开发环境也是基于 Zephyr 的,其实就是在 Zephyr 的基础上添加了一些关于 Nordic 的一些驱动代码库及相关例程。

 

1.2 新工程的创建与编译

开发环境搭建好之后,对于如何创建并编译一个新工程也是很重要的,这也是继环境搭建之后最基础的部分,关于就如何创建并编译一个新工程,我也写了一篇文章进行介绍,具体操作过程及步骤请参考 创建并编译一个新的工程

 

1.3 软硬件的配置过程

经过前面的操作后,就可以正常进行开发了,但只是能够正常的创建并编译新工程肯定是不够的,还得了解关于项目工程的一些软件与硬件的配置方式,这样才能更好的理解 Zephyr,才能更好的进行自己的项目工作,源树结构及软硬件配置过程简介 简单的介绍了关于软件与硬件的配置过程,还有一些有用的目录文件。

 

1.4 编译过程简介

前面介绍了关于开发环境的搭建以及怎样去创建、编译一个新的工程,新工程怎样去添加自己的源代码以及进行自己相关的软硬件配置,从而实现自己的需求。但其实对整个系统最终的 hex 文件的生成过程还是比较模糊的,不清楚编译过程以及各文件是怎样关联到一起的。

West 命令及编译过程简介 一文简单的介绍了关于这部分的内容,当然介绍的比较浅,只是一个大概的编译过程及相关文件的关联,只是加深对 Zephyr 的了解,之后若出现问题,也可以根据这个去进行排查。

 

1.5 小结

开发基础部分的简单介绍基本就到此了,当然,可能对于部分内容本人的理解不到位或者有所偏差,若还有疑问或者其他不了解的地方可以参考官方文档:Zephyr 入门指南Zephyr 应用开发

 

2. 内核服务入门

Zephyr 内核是每个 Zephyr 应用程序的核心。它提供了一个低占用空间、高性能、多线程执行环境,并提供了一组丰富的可用特性。Zephyr 生态系统的其余部分,包括设备驱动程序、网络堆栈和特定于应用程序的代码,使用内核的特性来创建完整的应用程序。

内核的可配置特性允许您仅包含应用程序所需的那些功能,使其非常适合内存有限 (低至 2 KB!) 或具有简单多线程要求 (例如一组中断的系统处理程序和单个后台任务)。此类系统的示例包括:嵌入式传感器集线器、环境传感器、简单的 LED 可穿戴设备和商店库存标签。

还可以使用 Zephyr 内核开发需要更多内存 (50 到 900 KB)、多个通信设备 (如 Wi-Fi 和蓝牙低功耗) 和复杂多线程的应用程序。此类系统的示例包括:健身可穿戴设备、智能手表和物联网无线网关。

下面简单的介绍下 Zephyr 内核的相关内容,大部分都是基于官方文档进行理解与翻译的,会有不到位之处与理解偏差之处,可以参考相应的官方文档。

 

2.1 调度、中断与同步

这些涵盖了与线程调度和同步相关的基本内核服务。

 

2.1.1 线程简介

线程 是每一个操作系统的基础,在实时操作系统中,线程 (任务) 的调度是基于优先级的。同时一个操作系统主要的功能就是对 SoC 的资源和线程进行管理,线程管理包括线程的创建,线程的调度,线程的终止,线程的挂起,线程间的通信,对 SoC 资源管理主要包括 CPU,RAM等。

因此,线程是很很很很很 重要 的,线程简介 介绍了关于线程的一些基本概念。

线程线程简介 的基础上进一步补充了关于线程的相关内容。

 

2.1.2 工作队列线程

Zephyr 中工作队列是基于线程的,简单来说,就是有一个专门的线程 (工作队列线程) 一直在等待工作队列的 API 发来的工作项,当有工作项时(一个待执行的函数) 就处理 (把函数调用了),当有多个工作项时就按顺序处理,没有工作项时就休眠。

 

2.1.3 调度

调度 是内核基于优先级来允许应用程序的线程共享 CPU。

 

2.1.4 中断

中断服务程序 (ISR) 是响应硬件或软件中断而异步执行的功能。 通常,ISR 会抢先执行当前线程,从而以非常低的开销进行响应。 只有在完成所有 ISR 工作后,线程执行才会恢复。

 

2.1.5 轮询 API

轮询 API 一般用于线程并发地等待多个条件中的任何一个被满足。

 

2.1.6 信号量

信号量 是一个多任务系统的标配,基本上任何多任务内核都会有信号量接口。信号多用于同步,比如 ISR 和线程之间的同步,由 ISR 释放信号量,由线程等待信号量,这样 ISR 和线程就能同步执行。

 

2.1.7 互斥锁

互斥锁 是一个实现了传统的可重入互斥锁的内核对象。互斥锁允许多个线程通过确保对资源的互斥访问来安全地共享相关的硬件或软件资源。

 

2.1.8 条件变量

条件变量 是一种同步原语,它使线程能够等待特定条件发生。一般与 互斥锁 一起使用。

 

2.1.9 Symmetric Multiprocessing

Symmetric Multiprocessing

 

2.2 数据传递

这些涵盖了可用于在线程和 ISR 之间传递数据的内核对象。

下表总结了它们的高级功能:

Object Bidirectional? Data structure Data item size Data Alignment ISRs can receive? ISRs can send? Overrun handling
FIFO No Queue Arbitrary [1] 4 B [2] Yes [3] Yes N/A
LIFO No Queue Arbitrary [1] 4 B [2] Yes [3] Yes N/A
Stack No Array Word Word Yes [3] Yes Undefined behavior
Message Queue No Ring buffer Power of two Power of two Yes [3] Yes Pend thread or return -errno
Mailbox Yes Queue Arbitrary [1] Arbitrary No No N/A
Pipe No Ring buffer [4] Arbitrary Arbitrary No No Pend thread or return -errno

[1] 调用者在数据元素本身中为队列开销分配空间。

[2] 通过 k_fifo_alloc_put()k_lifo_alloc_put() 添加的对象没有对齐约束,但是使用调用线程的资源池中的临时内存。

[3] ISRs 只能在传递 K_NO_WAIT 作为超时参数时接收。

[4] 可选。

  • FIFO
  • Stacks
  • Message Queues

你可能感兴趣的:(Zephyr-RTOS,rtos)