Utility之内核对象的静态实例化

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

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

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

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

编译时声明的对象,如果没有赋初值,并不会消耗系统镜像的空间,编译器只是把它放到镜像的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()一致

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

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

信号量

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

消息队列

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

看门狗

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

这正是:

嵌入实时系统,对象静态声明。

灵活参考使用,提升实时性能。

本文分享自微信公众号 - 这里只有VxWorks(VxWorks567)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程之路的专栏

程序员C语言快速上手——基础篇(二)

在代码目录下打开cmd命令行或打开VSCode中的命令行,VS Code快捷键是【Ctrl】+【~】

18130
来自专栏二的十次方

Nginx 整合 FastDFS 实现文件服务器

本篇衔接《FastDFS 环境搭建》内容进行讲解,上篇文章我们实现了图片上传的功能,但是无法通过 http 进行访问,本篇将解决该问题。

20220
来自专栏呼延

Rake的使用

desc: 定义了任务的描述,在使用rake -T或者rake --tasks可以列出所有的任务包含其描述. task: 定义了任务的名字以及任务的具体执行逻...

15220
来自专栏嵌入式大杂烩

【C语言笔记】extern关键字

extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C+...

19530
来自专栏呼延

Spring Boot 使用junit编写单元测试

单元测试是我们工作中必不可少的一个环节,同时,我们在项目中验证自己的一些想法时,使用单元测试也是极其方便的。

11420
来自专栏嵌入式大杂烩

【C语言笔记】C语言编译的过程

如果你使用的是集成开发环境,那么你点击编译按钮就可生成可执行文件,然后点击运行即可运行。那么,你知道从源代码到可执行文件经历了哪些过程吗。仅仅是编译?

15130
来自专栏嵌入式大杂烩

【C语言笔记】char *str与char str[]的区别

C语言中没有特定的字符串类型,常用以下两种方式定义字符串:一种是字符数组,另一种是指向字符串的指针。如下:

49020
来自专栏嵌入式大杂烩

【C语言笔记】带参宏定义(二)

其中参数列表中的参数之间用逗号分隔,字符序列中应包含参数表中的参数。在定义带参数的宏时,宏名标识符与左圆括号之间不允许有空白符,应紧接在一起,否则变成了无参数的...

42910
来自专栏嵌入式大杂烩

【C语言笔记】Windows下体验Linux环境

若要使用Linux环境,可以把Linux操作系统装在真机上,也可以把Linux操作系统安装在虚拟机上(如VMware)。本文介绍除了这两种方法之外的第三种可以使...

12350
来自专栏嵌入式大杂烩

【C语言笔记】windows命令行下编译C程序

有关注我的朋友可能会知道我的C开发环境是:Notepad++与MinGW相结合,即用Notepad++写代码,用MinGW这个工具包中的gcc编译器进行编译。如...

34630

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励