Skip to content

Boot-up sequence & execution context

启动顺序和执行上下文 为了实现应用程序代码的任务,需要选择适当的执行原语(抢占式线程、协作线程、工作队列等),并正确设置其优先级,以免阻塞 CPU 上运行的其他任务,同时满足任务的时间要求。

Kernel Initialization

内核初始化 此阶段显示初始化所有已启用静态设备状态的过程。某些器件由 RTOS 开箱即用地启用,而其他器件则由应用程序配置文件 ( prj.conf ) 和电路板配置文件启用。这些设备包括使用Zephyr API 以静态方式定义的设备驱动程序和系统驱动程序对象。 初始化顺序通过将它们分配给特定的运行级别(例如, PRE_KERNEL_1 、 PRE_KERNEL_2 )来控制,并且使用优先级进一步定义它们在同一运行级别中的初始化顺序。在此阶段,调度程序和内核服务尚不可用,因此此阶段的这些初始化功能不依赖于任何内核服务。 在所有 nRF Connect SDK 应用程序 PRE_KERNEL_1 中默认初始化的内容

  • 时钟控制驱动程序: 这启用对硬件时钟控制器的支持。硬件可以为其他子系统提供时钟,因此也可以通过控制其时钟来提高电源效率。
  • 串行驱动程序: 这可以是 UART(E)、RTT 或其他传输。它用于发送调试输出,例如启动。仅当启用调试选项时,才会初始化此选项。 所有 nRF Connect SDK 应用程序 PRE_KERNEL_2 中默认初始化的内容
  • 系统定时器驱动程序: 这通常是 Nordic SoC 和 SiP(nRF91、nRF53、nRF52 系列)上的实时计数器外设 (RTC1)。系统计时器将用于内核的计时服务,例如 k_sleep() 内核计时器 API。

Multithreading Preparation

多线程准备 这是初始化多线程功能(包括调度程序)的地方。RTOS 还将创建两个线程(系统线程):RTOS 主线程,以及在没有其他线程准备好时负责调用 SiP 和 SoC 电源管理系统的空闲线程。 在此阶段,将启动 POST_KERNEL 服务(如果存在)。启动 POST_KERNEL 服务后,将打印 Zephyr 启动横幅: 之后,将初始化 APPLICATION 级别服务(如果存在)。然后,启动所有应用程序定义的静态线程(使用 K_THREAD_DEFINE() )。 在所有 nRF Connect SDK 应用程序 POST_KERNEL 中默认初始化的内容 这是许多库、RTOS 子系统和服务初始化的地方。这些库在配置过程中需要内核服务,因此这就是为什么它们在内核服务可用的 POST_KERNEL 级别中启动的原因。 默认情况下,RTOS 不会在此处初始化任何内容。但是,如果启用了许多库、RTOS 子系统和服务,它们会在此处初始化。例如,如果在延迟模式下启用了日志记录器 ( CONFIG_LOG ),则将启动记录器模块,并创建记录器专用线程(用于延迟模式)。此外,如果使用低功耗蓝牙 ( CONFIG_BT ),则这是初始化蓝牙堆栈以及创建 RX 和 TX 线程的位置。同样,如果使用系统工作队列,则这是初始化系统工作队列线程的位置。 在所有 nRF Connect SDK 应用程序 APPLICATION 中默认初始化的内容 默认情况下,如果启用某些库,则会在此处启动它们。例如在 nRF91 系列上进行开发,使用 AT 监视器库 ( AT_MONITOR ),则这里是初始化该库的位置。

Thread context vs interrupt context

线程上下文与中断上下文

Thread context

线程上下文

  • 执行上下文:线程上下文是指应用程序和系统线程运行的正常执行环境。
  • 触发事件:线程由应用程序或 RTOS 创建,并由调度程序使用定义的规则(类型和优先级)进行调度。
  • 抢占:线程上下文可以被中断或更高优先级的线程抢占。
  • 持续时间:与中断上下文相比,线程可以执行更长的时间并执行更复杂的操作。

Allowed Operations:

允许的操作:

  • Access to the full range of kernel services and OS services.
    访问全方位的内核服务和操作系统服务。
  • Executing time-consuming operations.
    执行耗时的操作。
  • Waiting on synchronization primitives like mutexes, semaphores, or event flags.
    等待同步基元,如互斥锁、信号量或事件标志。
  • Performing blocking I/O operations.
    执行阻塞 I/O 操作。

**Not Allowed Operations: **

不允许的操作

  • Accessing hardware registers directly without proper synchronization or abstraction.
    直接访问硬件寄存器,无需适当的同步或抽象。
  • Running time-critical operations.
    运行时间关键型操作。

Interrupt context

中断上下文

  • 执行上下文:中断上下文是指中断处理程序运行时的执行环境。
  • 触发事件:中断可能随时完全异步发生,并由硬件事件触发,例如计时器、外部信号或设备 I/O。
  • 抢占:中断上下文抢占当前正在运行的线程上下文。
  • 持续时间:中断处理程序应快速执行,以最大程度地减少处理中断的延迟,并且不会阻止系统线程和通信堆栈线程的执行。
  • 中断嵌套:Zephyr 允许嵌套中断,这意味着中断处理程序可以被另一个更高优先级的中断中断。

Allowed Operations: :

允许的操作

  • Executing time-critical operations.
    执行时间关键型操作。
  • Access to a restricted set of kernel services.
    访问一组受限的内核服务。

Not Allowed Operations: :

不允许的操作

  • Blocking operations. 阻塞操作。
  • Using most of the kernel services meant for thread context (for example, sleeping or waiting on synchronization primitives, acquiring a mutex or a semaphore that is potentially blocking).
    使用大多数用于线程上下文的内核服务(例如,休眠或等待同步原语,获取可能阻塞的互斥锁或信号量)。

Released under the GPL License.