视频网站开发问题,建设网站容易吗,东莞市seo网络推广价格,wordpress 正在跳转中 请稍等4.1 用户空间RTOS API
4.1.1 用户空间RTOS API列表
本章对Xenomai 3编写#xff0c;描述应用程序的构建与运行方式。文中应用程序特指基于Xenomai 3库的用户空间程序。
Xenomai 3通过将实时核心Cobalt与Linux内核并行运行#xff0c;形成双内核架构。该实时扩…4.1 用户空间RTOS API4.1.1 用户空间RTOS API列表本章对Xenomai 3编写描述应用程序的构建与运行方式。文中应用程序特指基于Xenomai 3库的用户空间程序。Xenomai 3通过将实时核心Cobalt与Linux内核并行运行形成双内核架构。该实时扩展层内建于Linux内核专门处理时间敏感型任务如中断处理和实时线程调度。Cobalt核心的执行优先级始终高于原生内核。Xenomai 3提供的所有RTOS API如下表所示API 名称描述POSIXXenomai 3实现了POSIX接口便于移植与POSIX接口兼容的程序。Alchemy此为在 Xenomai 2.x Native API 基础上的实现和 Xenomai 2 有大量的重叠有一些过渡库具体情况可以参考 libtrank 兼容Xenomai 2.x生态。pSOSpSOS™ 为Wind River Systems, Inc.的注册商标原为Integrated System, Inc. 开发后被兼并从Vxworks 5.5 开始主要特点已经被融入Vxworks支持嵌入式实时操作系统功能。VxWorksVxWorks™ 为Wind River Systems, Inc.的注册商标提供工业级实时操作系统服务。Xenomai 3提供的上述RTOS API都具备实时能力。通过严格的优先级隔离机制确保实时任务响应时间达到微秒级精度。4.1.2 用户空间RTOS API框架1. 蓝色部分Cobalt core如图中蓝色部分所示Cobalt core是Xenomai3中实时内核的名字运行在内核空间。Cobalt core的代码实现在kernel/cobalt目录。Cobalt是金属元素钴的英文名称它的元素符号是Co刚好与co-kernel相同有点意思吧金属元素钴Cobalt的本色是带有光泽的银白色。然而当钴用于各种应用中时它可以呈现出不同的颜色这取决于它的化合物和使用的形式。例如在陶瓷和玻璃工业中钴化合物用来制造出标志性的深蓝色即所谓的钴蓝。大家注意过吗Xenoami官网的主题色就是蓝色的。2. 红色部分libcobalt如图中红色部分所示Xenomai3在用户空间定义了libcobalt库通过系统调用与内核空间的Cobalt core沟通。libcobalt库代码实现在lib/cobalt目录。特别注意一下旁边括号里面的文字备注POSIX subset extensions。POSIX subset表明Xenomai 3实现了POSIX的若干子集包括POSIX 1003.1 (系统应用编程接口, Base Definitions)POSIX 1003.1b (实时扩展, Real-time Extensions)POSIX 1003.1c线程接口POSIX 1003.1g (套接字和网络)POSIX 1003.1q (消息队列)extensions代表某些接口不属于 POSIX 标准但对于编程来说必不可少_np后缀的函数例如pthread_setname_npGNU_chk函数例如__printf_chk标准 C 库中的函数如printf、fwrite等虽然在 POSIX 系统中可用但它们属于 ISO C 标准而非 POSIX 标准。总而言之libcobalt为用户空间应用程序提供了POSIX real-time API。在Xenomai体系中用户空间RTOS API也被称为skin所以POSIX real-time API一般都简称为POSIX skin。3. 橙色部分copperplate interfaceXenomai 3在libcobalt库中没有把所有的RTOS API都挨个实现一遍原生仅仅提供了POSIX skin。在libcobalt库的基础上实现了一个接口转换层即copperplate interface可以把其它RTOS API也称为skin转换为对POSIX skin的调用从而在用户层提供其它non-POSIX real-time API。接口转换层copperplate interface代码实现在lib/copperplate目录。默认情况下copperplate interface总是会自动初始化Auto-initialization保证其它接口可以正常工作。单词copperplate的本意是铜版印刷体是一种优美圆润的英文书法字体这个名字非常的无厘头。但是单词copper是金属铜的意思与接口转换层非常贴切。铜元素是过渡元素这个过渡二字是不是非常符合copperplate interface的定位观察一下图中copperplate interface的背景色是红色与黄色混合之后的红橙色。纯铜是柔软的金属表面刚切开时为红橙色与背景色一致是不是恍然大悟接口转换层copperplate interface在图中起到了承上启下的作用。向上承接的是红色的libcobalt向下开启的是黄色的non-POSIX real-time API包括Alchemy、VxWorks、pSOSRTOS API接口。4. 黄色部分non-POSIX real-time APInon-POSIX real-time API包括Alchemy、VxWorks、pSOSRTOS API接口。这些接口在Xenomai3中并不是原生实现的而是通过接口转换层copperplate interface模拟实现的这些RTOS API接口也可以称为不同的skin,例如Alchemy skin、VxWorks skin、pSOS skin。它们的代码实现在lib/alchemy目录lib/vxwork目录和lib/psos目录。特别关注一下Alchemy skin它兼容Xenomai2/native接口。5. 白色部分ApplicationsApplications顾名思义就是用户空间应用程序。对于应用程序而言有很多种skin可以选择。如果应用程序是从其它RTOS迁移到Xenomai 3那么自然而然要选择相匹配的skin。如果是新开发一个应用程序那么建议使用POSIX skin可以避免使用转换层copperplate interface减少复杂度。在编译和链接阶段具体要怎么对接不同的skin呢xeno-config横空出世xeno-config是一个辅助脚本可以为使用Xenomai库的应用程序提供正确的编译和链接标志。通过这个工具开发者可以轻松获取所需的编译器选项和链接器参数确保应用程序能够正确地集成到Xenomai环境中。4.1.3 使用xeno-config获取编译和链接参数在之前的章节中xenomai-v3.2.4编译后通过make install临时安装到了/root/xenomai/xenomai-v3.2.4-install目录。xeno-config脚本位于usr/xenomai/bin/xeno-config。xeno-config脚本通过标准化编译参数的方式简化了 Xenomai 实时应用程序的构建过程确保开发者可以专注于业务逻辑而无需手动维护复杂的编译环境配置。对于不同的skinxeno-config可以通过传递特定的参数来调整输出的编译和链接标志包含路径、宏定义等。注意如果是交叉编译环境在执行xeno-config脚本时需让环境变量DESTDIR指向xenomai的临时安装目录。其基本用法如下参考xeno-config --helpcd/root/xenomai/xenomai-v3.2.4-installDESTDIR$(pwd)usr/xenomai/bin/xeno-config --help Usage xeno-config OPTIONS Options:--help --v,--verbose --version --cc --ccld --arch --prefix --[skin]posix|vxworks|psos|alchemy|rtdm|smokey|cobalt --auto-init|auto-init-solib|no-auto-init --mode-check|no-mode-check --cflags --ldflags --lib*-dir|libdir|user-libdir --core --info --compat虽然xeno-config还可以用于获取其它信息但是本章仅聚焦在如何获取不同skin的编译和链接参数主要涉及--skin--cflags--ldflags和--compat。–[skin]posix, alchemy, rtdm, psos, vxworks, smokey, cobalt选择要为其打印信息的API/skin。skin前缀是可选的可以省略例如--posix等同于--skinposix选择POSIX skin。–cflags输出编译基于所选Xenomai API/skin的应用程序所需的C编译器命令行选项CFLAGS。–ldflags输出链接基于所选Xenomai API/skin的应用程序所需的C编译器命令行选项LDFLAGS。–compat此开关影响Alchemy和POSIX API为所选的API/skin启用Xenomai 2.x兼容模式。1.POSIX skin编译与链接参数下面展示如何通过--skinposix获取POSIX skin编译与链接参数。注意--skinrtdm与传递--skinposix严格等效。cd /root/xenomai/xenomai-v3.2.4-install DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinposix --cflags -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/cobalt -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include -marcharmv8-a -D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables -D__COBALT__ -D__COBALT_WRAP__ DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinposix --ldflags -Wl,--no-as-needed -Wl,/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/cobalt.wrappers -Wl,/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/modechk.wrappers /root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/xenomai/bootstrap.o -Wl,--wrapmain -Wl,--dynamic-list/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/dynlist.ld -L/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib -lcobalt -lmodechk -lpthread -lrt -marcharmv8-aPOSIX skin必须解决一个问题基于POSIX API编写的应用程序源码中会使用类似于pthread_create这样的标准接口。在构建应用程序二进制可执行文件时会同时链接libcobalt和libpthread库。为了如何保证pthread_create链接到libcobalt库呢Xenomai使用了一个非常巧妙的方法关键点在于链接参数-Wl,/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/cobalt.wrappers其中lib/cobalt/cobalt.wrappers文件的部分内容截取如下--wrap pthread_attr_init --wrap pthread_create --wrap pthread_setschedparam --wrap pthread_getschedparam --wrap pthread_setschedprio --wrap pthread_yield ...snip...--wrap是一种用于链接器linker的技术通常在 GCC 编译环境中使用。它允许你重新定义或者扩展已有的函数功能而不需要修改原始代码。当你使用 --wrap symbol 选项时链接器遇到对原始 symbol 的调用时它实际上会引用 __wrap_symbol 函数。以pthread_create为例在链接的过程中会隐式地链接libcoablt库定义的__wrap_pthread_create函数。如果不使用这个方法那么势必要修改应用程序原始代码显示地调用__wrap_pthread_create函数。这种方式的缺点非常明显破坏了应用程序的可移植性带来了额外的开发与维护成本。如果因为不可抗拒的原因必须选择显示地调用__wrap_pthread_create函数那么使用--skincobalt来获取编译和链接参数。如何理解--skincobalt所有带有__wrap_前缀的函数都有一个__cobalt_前缀的别名这些函数在Xenomai中也可以被称为Cobalt API。例如__wrap_pthread_create函数在libcoablt库中还有一个别名__cobalt_pthread_create。2.VxWorks skin编译与链接参数下面展示如何通过--skinvxworks获取VxWorks skin编译与链接参数。cd /root/xenomai/xenomai-v3.2.4-install告诉编译器skin是vxworks如何找到头文件和必要的宏定义还有兼容性选项如 -D_REENTRANT 线程可重入保证多线程运行安全DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinvxworks --cflags输出-I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/cobalt -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include -marcharmv8-a -D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables -D__COBALT__ -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/vxworks告诉链接器skin 是vxWorks时, 如何找到 Xenomai 程序所需要的链接库libcobalt、libmodechk和libpthread等和必须的链接参数。注意这里 libmodechk 是用来监控 in-band/out-of-band 运行模式切换。DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinvxworks --ldflags输出-Wl,--no-as-needed -Wl,/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/modechk.wrappers -lvxworks -lcopperplate /root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/xenomai/bootstrap.o -Wl,--wrapmain -Wl,--dynamic-list/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/dynlist.ld -L/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib -lcobalt -lmodechk -lpthread -lrt -marcharmv8-a在POSIX skin的基础上有两个显著的变化链接时增加-lvxworks确保链接VxWorks skin。以下是按include/vxworks/下头文件进行VxWorks API 分类每类仅列出部分代表性函数任务管理taskSpawn,taskDelete,taskDelay;中断服务intConnect,intLock,intUnlock;消息队列msgQCreate,msgQSend,msgQReceive;信号量semBCreate,semMCreate,semTake,semGive;其他。链接时增加-lcopperplatelibcopperplate库实现了一个接口转换层copperplate interface可以把VxWorks skin转换为对POSIX skin的调用。xeno-config脚本默认启用接口转换层copperplate interface的自动初始化功能。3.pSOS skin编译与链接参数下面展示如何通过--skinpsos获取pSOS skin编译与链接参数。cd /root/xenomai/xenomai-v3.2.4-install DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinpsos --cflags -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/cobalt -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include -marcharmv8-a -D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables -D__COBALT__ -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/psos DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinpsos --ldflags -Wl,--no-as-needed -Wl,/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/modechk.wrappers -lpsos -lcopperplate /root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/xenomai/bootstrap.o -Wl,--wrapmain -Wl,--dynamic-list/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/dynlist.ld -L/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib -lcobalt -lmodechk -lpthread -lrt -marcharmv8-a在POSIX skin的基础上有两个显著的变化链接时增加-lpsos确保链接pSOS skin。以下是按include/psos/psos.h的 pSOS API 分类每类仅列出部分代表性函数任务管理t_create,t_delete,t_start,t_suspend,t_resume,t_setpri信号量管理sm_create,sm_delete,sm_p,sm_v消息队列管理q_create,q_send,q_receive,q_delete变长消息队列管理q_vcreate,q_vsend,q_vreceive事件管理ev_send,ev_receive内存分区管理pt_create,pt_getbuf,pt_retbuf,pt_delete区域管理动态内存rn_create,rn_getseg,rn_retseg,rn_delete定时器管理tm_evafter,tm_evwhen,tm_wkafter,tm_cancel对象查找与标识t_ident,sm_ident,q_ident,pt_ident,rn_ident优先级转换函数psos_task_normalize_priority,psos_task_denormalize_priority链接时增加-lcopperplatelibcopperplate库实现了一个接口转换层copperplate interface可以把pSOS skin转换为对POSIX skin的调用。xeno-config脚本默认启用接口转换层copperplate interface的自动初始化功能。4.Alchemy skin编译与链接参数下面展示如何通过--skinalchemy获取Alchemy skin编译与链接参数。cd /root/xenomai/xenomai-v3.2.4-install DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinalchemy --cflags -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/cobalt -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include -marcharmv8-a -D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables -D__COBALT__ -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/alchemy DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinalchemy --ldflags -Wl,--no-as-needed -Wl,/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/modechk.wrappers -lalchemy -lcopperplate /root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/xenomai/bootstrap.o -Wl,--wrapmain -Wl,--dynamic-list/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/dynlist.ld -L/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib -lcobalt -lmodechk -lpthread -lrt -marcharmv8-a在POSIX skin的基础上有两个显著的变化链接时增加-lalchemy确保链接Alchemy skin。以下是按include/alchemy/下头文件进行Alchemy API 分类每类仅列出部分代表性函数任务管理 (task.h)rt_task_create(), rt_task_start(), rt_task_set_priority()信号量 (sem.h)rt_sem_create(), rt_sem_p(), rt_sem_v()互斥锁 (mutex.h)rt_mutex_create(), rt_mutex_acquire(), rt_mutex_release()事件机制 (event.h)rt_event_create(), rt_event_signal(), rt_event_wait()消息队列 (queue.h)rt_queue_create(), rt_queue_send(), rt_queue_receive()条件变量 (cond.h)rt_cond_create(), rt_cond_wait(), rt_cond_signal()内存管理 (heap.h)rt_heap_create(), rt_heap_alloc(), rt_heap_free()定时器 (timer.h/alarm.h)rt_timer_create(), rt_alarm_start(), rt_timer_sleep()管道通信 (pipe.h)rt_pipe_create(), rt_pipe_read(), rt_pipe_write()缓冲区管理 (buffer.h)rt_buffer_create(), rt_buffer_read(), rt_buffer_write()链接时增加-lcopperplatelibcopperplate库实现了一个接口转换层copperplate interface可以把Alchemy skin转换为对POSIX skin的调用。xeno-config脚本默认启用接口转换层copperplate interface的自动初始化功能。5.--compat获取与Xenomai 2兼容的编译与链接参数--compat参数影响Alchemy和POSIX API为所选的API/skin启用Xenomai 2.x兼容模式。Xenomai 2 skinXenomai 3 编译链接参数说明Native–skinalchemy --compat等同于 --skinnativePOSIX–skinposix --compat注意xeno-config出于向后兼容的目的接受--skinnative或--natvie。以兼容Xenomai 2的Native skin为例获取其在Xenomai 3 的编译链接参数。cd /root/xenomai/xenomai-v3.2.4-install DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinalchemy --compat --cflags -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/trank -D__XENO_COMPAT__ -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/cobalt -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include -marcharmv8-a -D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables -D__COBALT__ -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/alchemy DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinalchemy --compat --ldflags -Wl,--no-as-needed -ltrank -Wl,/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/modechk.wrappers -lalchemy -lcopperplate /root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/xenomai/bootstrap.o -Wl,--wrapmain -Wl,--dynamic-list/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/dynlist.ld -L/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib -lcobalt -lmodechk -lpthread -lrt -marcharmv8-a主要变化是增加了-ltrank引入了trank库。trank是Transition Kit的缩写。它包含了一系列的包装器和服务帮助开发者更轻松地将使用Xenomai 2.x开发的应用程序迁移到Xenomai 3.x。这个工具包提供了源代码级别的兼容性使得原本依赖于Xenomai 2.x的POSIX和原生API的应用程序能够在Xenomai 3.x环境中继续运行。6. 特殊选项--skinsmokey在Xenomai实时系统框架中Smokey 是一个专门用于内核空间测试的子系统。通过xeno-config --skinsmokey可以获取测试专用编译和链接参数。cd /root/xenomai/xenomai-v3.2.4-install DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinsmokey --cflags -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/cobalt -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include -marcharmv8-a -D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables -D__COBALT__ -I/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/include/smokey DESTDIR$(pwd) usr/xenomai/bin/xeno-config --skinsmokey --ldflags -Wl,--no-as-needed -Wl,/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/modechk.wrappers -lsmokey -lcopperplate /root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/xenomai/bootstrap.o -Wl,--wrapmain -Wl,--dynamic-list/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib/dynlist.ld -L/root/xenomai/xenomai-v3.2.4-install/usr/xenomai/lib -lcobalt -lmodechk -lpthread -lrt -marcharmv8-a冒烟测试Smoke Testing有时候也称为“smokey”测试是一种初步的软件测试方法用于确认刚刚构建的软件版本是否稳定到足以进行进一步的详细测试。这个术语来源于硬件行业的做法在新硬件组装完成后首次通电时检查是否有部件因过热而冒烟的现象。冒烟测试的通常覆盖了软件的主要模块和关键路径通过自动化脚本执行执行速度快。冒烟测试对于保证软件质量、减少修复成本以及加速开发周期具有重要作用。