前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Utility之内核对象的静态实例化

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

作者头像
Taishan3721
发布2019-07-10 15:30:51
5880
发布2019-07-10 15:30:51
举报
文章被收录于专栏:这里只有VxWorks

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。因此,实例化过程如下

这正是:

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档