2.4Xenomai3内核空间介绍

2.4 Xenomai3 内核空间介绍

2.4.1 Cobalt 实时内核启动参数

Cobalt内核接受一组参数,这些参数应该由引导加载程序在内核命令行中传递。

Cobalt支持的参数一直在演变,下表列出了当前支持的参数、说明及默认值。

参数名称描述默认值
xenomai.supported_cpus实时CPU掩码。该掩码表示哪些CPU核心允许运行Xenomai的实时任务。-1(=所有CPU核心)
xenomai.allowed_group=<gid>只允许指定用户组的进程创建实时任务,其他用户组的进程无法使用 Xenomai 实时服务。是Linux用户组的ID,其成员应被Cobalt核心允许访问。完全开放访问,所有用户组的进程都可以创建实时任务,没有任何组权限限制
xenomai.sysheap_size=<kbytes>设置Cobalt核心用于分配运行时对象的内部内存堆大小。该值以千字节(kB)为单位表示。4096 kB
xenomai.state=<state>设置Cobalt核心在启动时的初始状态,可以是enabled(启用)、stopped(停止)或disabled(禁用)。有关这些状态的描述,请参阅关于corectl(1)工具的文档。enabled(启用)
xenomai.watchdog_timeoutCONFIG_XENO_OPT_WATCHDOG=y启用看门狗功能,用于检测失控的Cobalt线程。启用后,当实时线程持续运行超过设定时间段且在此期间未与Linux交互时,看门狗将被触发。触发时当前线程会被移出实时域,并立即接收来自Linux内核的SIGDEBUG信号。看门狗的超时时间可通过CONFIG_XENO_OPT_WATCHDOG_TIMEOUT参数设置。4秒
xenomai.smi=<state>x86特有的:设置SMI补救的状态。可能的值有disabled(禁用)、detect(检测)和enabled(启用)。detect(检测)
xenomai.smi_mask=<source-mask>x86特有的:要在SMI控制寄存器中屏蔽的一组位。1(=全局禁用)

当内核启动后,可以在/sys/module/xenomai/parameters/中查看和修改 Cobalt 实时内核的启动参数。

/sys/module/xenomai/parameters/
|-- allowed_group
|-- state
|-- supported_cpus
|-- sysheap_size
`-- watchdog_timeout

另外,下述参数已经被删除,不再支持,避免误用。

  1. xenomai.clockfreq=<hz-freq> 覆盖用于测量时间间隔的实际时间时钟频率。
commit 758b316321b06070eea627d2766eef5842da480b
Author: Philippe Gerum <rpm@xenomai.org>
Date:   Sun Jan 31 15:45:39 2021 +0100

    cobalt/init: ipipe: remove clock frequency override

    Regarding the frequency of the clock hardware, the kernel knows
    better. This parameter dates back to the dark ages when the kernel
    might not have detected variations in (per-CPU) clock frequency, which
    is no more an issue nowadays.

    Actually, we do want to rely on the non-trivial logic the kernel has
    to figure out that value dynamically for us.

    So let's drop the user override for this parameter.

    Signed-off-by: Philippe Gerum <rpm@xenomai.org>
    Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>

  1. xenomai.timerfreq=<hz-freq> 覆盖用于编程定时器触发的实际时间定时器频率。
commit 64289ae2d896f07c005881b3a349f4aae6f902be
Author: Philippe Gerum <rpm@xenomai.org>
Date:   Sun Jan 31 15:45:38 2021 +0100

    cobalt/machine: ipipe: drop timer frequency setting

    The only user of the timer frequency setting was the machine-specific
    timer calibration handler, which is now gone. Therefore we don't need
    to know the timer frequency anymore. As a consequence, we don't care
    about overriding its value as determined by the I-pipe either.

    Let's drop all of these antiquated bits.

    Signed-off-by: Philippe Gerum <rpm@xenomai.org>
    Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>

2.4.2 Cobalt 实时内核状态与统计信息 /proc/xenomai

Xenomai 状态与统计信息可以通过/proc/xenomai目录下的各个子目录和文件获取。

在 Cobalt 实时内核执行 xenomai_init 初始化时,会调用 xnprocfs_init_tree 函数创建 /proc/xenomai 目录。同时,它会创建如下子目录及文件:debug/lock,version,faults,latency。

除了上述默认创建的目录及子目录,Xenomai 各个模块也会根据需要创建自己的子目录及文件。

系统启动之后,/proc/xenomai目录包含如下内容。

/proc/xenomai/
|-- affinity
|-- clock
|   `-- coreclk
|-- debug
|   |-- lock
|   `-- relax
|-- faults
|-- heap
|-- latency
|-- registry
|   `-- usage
|-- sched
|   |-- acct
|   |-- rt
|   |   `-- threads
|   |-- stat
|   `-- threads
|-- timer
|   `-- coreclk
`-- version
  • affinity:Cobalt 实时内核的CPU亲和性掩码,每一个 bit 位表示系统中的一个CPU。如果该位为 1,则表示相应的CPU是 Cobalt 实时内核所管理的,并且可用于调度实时应用程序。支持在线查看和修改。
  • clock/coreclk:输出 Xenomai 核心时钟相关的一些配置和状态,包括底层时钟、定时器、Watchdog、延时补偿(Gravity)等。其中,延时补偿(Gravity)支持在线修改。
  • debug:显示 Cobalt 实时内核的调试信息,包括锁的入口、空转时间等信息和次模式切换信息。
  • faults:显示实时上下文中发生的各种不同异常的计数。
  • heap:显示 Cobalt 实时内核中的各种不同堆内存的总量与余量。
  • latency:显示和修改用户态实时任务的延迟补偿(Gravity)值。
  • registry:显示IPC通信对象例如信号量、互斥锁等的信息。
  • sched:显示实时任务调度信息、状态信息等。
  • timer/coreclk:显示 Cobalt 实时内核在每个 CPU 上维护并运行的定时器的相关信息。
  • version:显示当前运行的 Cobalt 实时内核版本。

2.4.3 Cobalt 实时内核导出的 RTDM 设备文件

/dev/rtdm/
|-- analogy0
|-- analogy1
|-- analogy2
|-- analogy3
|-- analogy4
|-- analogy5
|-- analogy6
|-- analogy7
|-- analogy8
|-- analogy9
|-- autotune
|-- gpiopwm0
|-- gpiopwm1
|-- gpiopwm2
|-- gpiopwm3
|-- gpiopwm4
|-- gpiopwm5
|-- gpiopwm6
|-- gpiopwm7
|-- heapcheck
|-- memdev-private
|-- memdev-shared
|-- memdev-sys
|-- switchtest
`-- timerbench
  • analogy*:模拟量设备
  • gpiopwm*: GIO-based PWM 设备
  • autotune:autotune 工具依赖于 /dev/rtdm/autotune 设备。
  • heapcheck:smokey 测试框架中的 coreheap 测试用例依赖 /dev/rtdm/heapcheck 设备。
  • switchtest:switchtest 测试工具依赖 /dev/rtdm/switchtest 设备。
  • timerbench:latencyaltency 测试工具依赖 /dev/rtdm/timerbench 设备。
  • memdev-private:Cobalt 实时内核在创建每个实时进程的时候,会为其创建一个内核态的私有堆内存,用于存储实时进程各自的IPC通信对象的状态。且通过 UMM 框架把私有堆内存导出到用户态,支持在用户态直接获取IPC通信对象的状态。
  • memdev-shared:Cobalt 实时内核在启动过程中,会申请一个内核态的共享堆内存。Cobalt 实时内核在创建每个实时进程的时候,会在共享堆内存上申请空间,用于存储实时进程的状态信息。通过 UMM 框架把共享堆内存导出到用户态,支持在用户态直接获取实时进程的状态信息。
  • memdev-sys:Cobalt 实时内核在启动过程中,为自身申请的系统堆内存。在 Cobalt 实时内核中,调用 xnmalloc/xnfree 申请释放内存,都是基于系统堆内存。

2.4.4 OOB 中断信息

实现中断管道机制的项目,从 ipipe 演进到 dovetail 之后,In-Bnad 和 OOB 中断的信息都被合并到 /proc/interrupts 文件中。

           CPU0       CPU1       CPU2       CPU3
  9:          2          1          1          1     SIRQC   9 Edge          in-band work
 12:       3757       3534       3439       3580     GICv3  27 Level    oob  arch_timer
 44:         34          0          0          0     GICv3  78 Edge          virtio0
 45:       2098          0          0          0     GICv3  79 Edge          virtio1
 47:          0          0          0          0     GICv3  34 Level         rtc-pl031
 48:         55          0          0          0     GICv3  33 Level         uart-pl011
 49:          0          0          0          0     GICv3  23 Level         arm-pmu
 50:          0          0          0          0     SIRQC  50 Edge          Inband sirq
 51:          0          0          0          0     SIRQC  51 Edge          Inband sirq
 52:          0          0          0          0     SIRQC  52 Edge          Inband sirq
 53:       3598       3393       3280       3437     SIRQC  53 Edge          proxy tick
 54:          0          0          0          0  9030000.pl061   3 Edge          GPIO Key Poweroff
IPI0:       757        999       1342       1482       Rescheduling interrupts
IPI1:       580        413        493        290       Function call interrupts
IPI2:         0          0          0          0       CPU stop interrupts
IPI3:         0          0          0          0       CPU stop (for crash dump) interrupts
IPI4:         0          0          0          0       Timer broadcast interrupts
IPI5:         0          0          0          0       IRQ work interrupts
IPI6:         0          0          0          0       CPU wake-up interrupts
Err:          0

从中断控制器的角度,包括两个中断控制器: GICv3 和 SIRQC。

  • GICv3 控制器: 在 ARM 系统中,GICv3 控制器是系统中最重要的中断控制器。它负责管理系统中所有中断源,包括外部中断、异常、软件中断、定时器中断等。
  • SIRQC 控制器: SIRQC 控制器是 Cobalt 实时内核中用于模拟中断的虚拟中断控制器。它负责处理软件生成的合成中断(如示例中的 proxy tick 和 in-band work),并将它们交由 Linux 标准中断处理流程处理。

从中断类型的角度,包括两种中断类型:In-Band 和 OOB 中断。

  • OOB 中断
12:       3757       3534       3439       3580     GICv3  27 Level    oob  arch_timer

当一个中断源在注册中断处理程序时指定了 IRQF_OOB 标记,它将被视为 OOB 中断,且其中断处理程序会在 Cobalt 实时内核的上下文中运行。

/proc/interrupts 文件中,OOB 中断的名称之前会额外添加 oob 字样。

#ifdef CONFIG_IRQ_PIPELINE
	seq_printf(p, " %-3s", irq_settings_is_oob(desc) ? "oob" : "");
#endif

上述 arch_timer 就是一个 OOB 中断,它隶属于 GICv3 控制器,用于处理定时器中断。

  • in-band work In-Band 中断
9:          2          1          1          1     SIRQC   9 Edge          in-band work

in-band work 隶属于 SIRQC 虚拟中断控制器,它的中断处理程序运行在 Linux 上下文中,可以跨域调度执行工作者队列中的任务。

在 Cobalt 实时内核上下文中,通过 irq_work_queue() 提交任务到工作者队列。当 in-band work 被触发时,其中断处理函数会从工作者队列中取出任务并执行。

  • Inband sirq In-Band 中断
50:          0          0          0          0     SIRQC  50 Edge          Inband sirq

Inband sirq 隶属于 SIRQC 虚拟中断控制器,常用于在 Linux 上下文中处理特定事件。例如 Cobalt 实时内核的 xnpipeselectregistry 模块利用此机制执行各自在 Linux 上下文中的工作。

  • proxy tick In-Band 中断
53:       3598       3393       3280       3437     SIRQC  53 Edge          proxy tick

proxy tick 隶属于 SIRQC 虚拟中断控制器,用于协调实时(out-of-band)和非实时(in-band)两个阶段的时钟处理。

proxy tick 设备是一种合成时钟事件设备,用于将硬件 tick 设备的控制权移交 Cobalt 实时内核。
当硬件定时器到期时,中断首先在带外阶段被处理,然后综合不同情况来决定是否需要模拟一个带内 tick。如果需要,则会触发一个在带内阶段处理的 proxy tick In-Band 中断。

无界云图(开源在线图片编辑器源码)是由四川爱趣五科技推出的一款类似可画、创客贴、图怪兽的在线图片编辑器。该项目采用了React Hooks、Typescript、Vite、Leaferjs等主流技术进行开发,旨在提供一个开箱即用的图片编辑解决方案。项目采用 MIT 协议,可免费商用。 无界云图提供了一系列强大的图片编辑功能,包括但不限于: 素材管理:支持用户上传、删除和批量管理素材。 操作便捷:提供右键菜单,支持撤销、重做、导出图层、删除、复制、剪切、锁定、上移一层、下移一层、置顶、置底等操作。 保存机制:支持定时保存,确保用户的工作不会丢失。 主题切换:提供黑白主题切换功能,满足不同用户的视觉偏好。 多语言支持:支持多种语言,方便全球用户使用。 快捷键操作:支持快捷键操作,提高工作效率。 产品特色 开箱即用:无界云图采用了先进的前端技术,用户无需进行复杂的配置即可直接使用。 免费商用:项目采用MIT协议,用户可以免费使用和商用,降低了使用成本。 技术文档齐全:提供了详细的技术文档,包括技术文档、插件开发文档和SDK使用文档,方便开发者进行二次开发和集成。 社区支持:提供了微信技术交流群,用户可以在群里进行技术交流和问题讨论。 环境要求 Node.js:需要安装Node.js环境,用于运行和打包项目。 Yarn:建议使用Yarn作为包管理工具,用于安装项目依赖。 安装使用 // 安装依赖 yarn install // 启动项目 yarn dev // 打包项目 yarn build 总结 无界云图是一款功能强大且易于使用的开源在线图片编辑器。它不仅提供了丰富的图片编辑功能,还支持免费商用,极大地降低了用户的使用成本。同时,详细的文档和活跃的社区支持也为开发者提供了便利的二次开发和集成条件。无论是个人用户还是企业用户,都可以通过无界云图轻
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值