在当今的嵌入式和实时系统中,实时性是一个关键的性能指标。为了满足严格的时间约束,系统需要以确定性和低延迟的方式运行。本文将深入探讨 SinssgyeMetaOS
中的关键技术,特别是它的双内核模式、线程的两种运行模式、动态模式切换机制,以及如何优化应用程序以充分利用实时内核的能力。
SinssgyeMetaOS
采用了双内核架构,运行两个独立但协同工作的内核:
Cobalt 实时核心:
Linux 内核:
这种双内核模式的设计,使得系统能够同时满足实时任务和非实时任务的需求,实现了性能和功能的平衡。
Cobalt
核心调度,享受硬实时调度的低延迟。Linux
线程运行,由 Linux
内核调度。Linux
服务,包括文件系统、网络、图形界面等。Linux
应用程序兼容,易于开发和维护。通过允许线程在两种模式下运行,系统能够充分利用实时核心的性能,同时保留 Linux
的丰富功能。
线程可以根据调用的服务类型,动态地在实时模式和非实时模式之间切换。这种机制使得线程可以灵活地使用不同的服务,而不影响系统的实时性。
模式切换规则
从非实时模式切换到实时模式:
Cobalt
的实时服务时。Linux
内核切换到 Cobalt
实时核心。从实时模式切换到非实时模式:
Cobalt
服务或任何 Linux
服务(包括发生如页面错误这样的异常)时。Linux
内核。Linux
内核调度。graph TD;
A[线程在非实时模式运行] --> B{线程调用 Cobalt 的实时服务?};
B -- 是 --> C[线程请求实时服务,系统检测到这是一个实时调用];
C --> D[线程的调度从 Linux 内核切换到 Cobalt 实时核心];
D --> E[线程进入实时模式,享受低延迟的调度];
B -- 否 --> F[继续在非实时模式运行];
E --> G{线程调用非实时的 Cobalt 服务或任何 Linux 服务(包括页面错误)?};
G -- 是 --> H[线程请求非实时服务,可能会导致阻塞或不可预知的延迟];
H --> I[为了不影响实时调度器的确定性,线程被切换回 Linux 内核];
I --> J[线程进入非实时模式,由 Linux 内核调度];
G -- 否 --> K[继续在实时模式运行];
模式切换的影响
为了充分利用 Cobalt
实时内核的能力,开发者需要对应用程序进行优化,确保关键的实时任务始终在实时模式下运行。
找到性能受限的循环
gprof、perf
等,分析程序的性能瓶颈。确保线程不退出实时模式
Cobalt
提供的实时替代品。例如,使用实时消息队列代替标准的 Linux
消息队列。mlockall()
等函数,防止内存分页,避免因页面错误导致的模式切换。为了防止实时线程意外地退出实时模式,需要识别和消除导致模式切换的服务调用。
cppcheck
、clang-tidy
,设置规则检测不安全的调用。Cobalt
的日志功能,记录模式切换事件。最佳实践