vxworks如何实现内核对象的静态实例化

小编给大家分享一下vxworks如何实现内核对象的静态实例化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

VxWorks的内核对象可以动态创建,也可以静态实例化。

静态实例化,指的是使用VxWorks的宏在编译时(compile-time)声明变量,这样编译器就会为其分配空间,而不是运行时(run-time)再动态申请空间。因此在系统启动过程中,就可以初始化对象了

而动态申请,需要系统启动后,调用运行时内存分配机制;对应的动态删除,需要调用内存释放机制,通常也就是malloc()与free()函数。这种动态行为,存在着内存不足的风险,并且会减缓甚至阻塞调用者的执行,因此对系统性能有一定影响

看一下动态与静态的伪代码对比

vxworks如何实现内核对象的静态实例化

编译时声明的对象,如果没有赋初值,并不会消耗系统镜像的空间,编译器只是把它放到镜像的BSS段里

可执行程序包括代码段(也称文本段)、数据段、BSS段。BSS(Block Started by Symbol)是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段自动清0。所以,未初始的全局变量在程序执行之前已经都被初始化为0了

静态实例化的优势:

  • 性能与确定性

  • 简化应用逻辑,不用考虑动态申请失败

  • 静态声明不会失败,除非整个程序超出系统内存的范围

  • VxWorks系统可以裁剪掉动态申请的相关函数,减小系统尺寸

因此,静态实例化更适用于实时系统的需求。并且在多数嵌入式系统中(OS不限于VxWorks),系统对象从始至终需要一直存在,也就不需要动态删除,甚至有些系统(例如CERT OS)都不支持内存的动态使用。

VxWorks专门提供了一些宏来实例化对象,包括:任务、信号量、消息队列、看门狗

任务

宏VX_TASK(name,stackSz)用来在编译时声明任务对象,两个参数分别是任务名(不能为NULL)和栈尺寸(大于0的常量)

宏VX_TASK_INITIALIZE()用来初始化VX_TASK()声明的任务,并将其置于suspend状态,其参数和返回值与taskSpawn()一致

vxworks如何实现内核对象的静态实例化

宏VX_TASK_INSTANTIATE()用来初始化VX_TASK()声明的任务,并将其置于ready状态,其参数和返回值与taskSpawn()一致

vxworks如何实现内核对象的静态实例化

注意在宏中换行时,为了确保宏的正常展开,使用了"\"

信号量

宏VX_BINARY_SEMAPHORE(name)、VX_COUNTING_SEMAPHORE(name)、VX_MUTEX_SEMAPHORE(name)、VX_READ_WRITE_SEMAPHORE(name,numReaders)分别用于编译时声明四种信号量,然后须使用相应的semXInitialize()进行完整实例化。semXInitialize()的第一个参数是name,后面的参数与semXCreate()的相同。因此,实例化过程如下

vxworks如何实现内核对象的静态实例化

vxworks如何实现内核对象的静态实例化

vxworks如何实现内核对象的静态实例化

vxworks如何实现内核对象的静态实例化

消息队列

宏VX_MSG_Q(name, max_msgs, max_msg_len)用于编译时声明消息队列,然后使用msgQInitialize ()进行完整实例化。msgQInitialize()的第一个参数是name,后面的参数与msgQCreate()的相同。因此,实例化过程如下

vxworks如何实现内核对象的静态实例化

看门狗

宏VX_WDOG(name)用于编译时声明看门狗,然后使用wdInitialize()进行完整实例化。wdInitialize()的参数就是name。因此,实例化过程如下

vxworks如何实现内核对象的静态实例化

以上是“vxworks如何实现内核对象的静态实例化”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!