欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > 36、【OS】【Nuttx】OSTest分析(2):环境变量测试

36、【OS】【Nuttx】OSTest分析(2):环境变量测试

2025/5/14 20:20:09 来源:https://blog.csdn.net/nobigdeal00/article/details/145391421  浏览:    关键词:36、【OS】【Nuttx】OSTest分析(2):环境变量测试

背景

2025.1.29 蛇年快乐!
接之前wiki
35、【OS】【Nuttx】OSTest分析(1):stdio测试(五)
已经分析完了第一个测试项,输入输出端口测试,接下来分析下环境变量测试,也比较简单

测试内容

主要测试设置环境变量和获取环境变量的接口是否正常,在软件工程里面,很多功能,模块提供的无非也是读和写,设置和获取,输入和输出等等
在这里插入图片描述
在这里插入图片描述
测试内容虽然简单,但仍有几个关键点值得注意:

  • 嵌入式实时操作系统(RTOS)如 Nuttx,环境变量的管理方式与传统桌面或服务器OS有所不同。NuttX 是一个微内核架构的OS,资源非常有限(与桌面或服务器OS相比),特别注重资源隔离和任务独立性。因此,环境变量通常不是全局共享的,而是通过任务组管理。
  • 环境变量的内存管理策略,也是通过内存动态分配预分配策略实现(之前wiki 31、【OS】【Nuttx】OSTest分析(1):stdio测试(一) 有简单分析文件系统内存分配)
  • 环境变量可以为任务组中的任务成员提供资源共享能力,在任务运行中起作用,生命周期仅限于任务的执行期间,任务结束后,这些变量通常会被释放
  • 环境变量管理的是较小字符串(通常几十个字节到几百个字节不等)

接口分析

来看测试的主要几个接口
在这里插入图片描述

  • putenv:主要是对 setenv 的封装,这里不分析
  • setenv:设置环境变量,下面分析
  • show_environment:主要通过 getenv 获取环境变量,下面会分析 getenv

setenv 接口:
在这里插入图片描述
来分析下 setenv 的三个成员:

  • name:环境变量名,字符串
  • value:环境变量值,字符串,最后存储字符串 “name=value”
  • overwrite:是否覆盖原来的值,非零值为覆盖,0为不覆盖(目前没看到overwrite=0的用法)

在修改环境变量前,先进入临界区,防止修改冲突;然后取出当前任务所在分组,对当前任务分组的私有环境变量进行修改
在这里插入图片描述
给当前修改的环境变量申请内存(需要多两个字节,‘=’,‘\0’),使用 group_malloc 进行内存分配,下面来看下 group_malloc 定义
在这里插入图片描述
当定义配置项 CONFIG_MM_KERNEL_HEAP 之后,可开启内存组管理模块,管理模块会将任务组按权限进行分类,其中内核任务为高权限任务组,用户任务为低权限任务组
在这里插入图片描述
Nuttx 将根据用户组类型选择合适的内存分配函数:
kmm_malloc:kernel memory management
kumm_malloc:user memory management
因为没有开启内存组管理模块,更详细的内存分配细节这里先不分析,主要是针对Nuttx中的特定堆进行内存管理,允许更细粒度的控制和多个独立的内存区域
在这里插入图片描述
在 sim 环境中,这里使用的是普通的 malloc 函数,malloc 适用于一般的应用程序开发,在不需要特别复杂的内存管理策略时使用,比如内存管够的 sim 环境
在这里插入图片描述
接下来可以看到环境变量内存的预分配策略,SCHED_ENVIRON_RESERVED 用于预留一定数量的环境变量槽位,确保系统有足够的空间来存储关键的环境变量,预留槽位可以防止动态分配内存时出现频繁的重新分配和拷贝操作,以提高性能并减少内存碎片。另外,这里会额外预留两个槽位,一个用于存储新的环境变量(name=value),另一个用于终止符(通常是 NULL),以标记环境变量数组的结束
在这里插入图片描述
最终字符串会以(name=value)形式,存入任务组中的环境变量数组中,最后一个元素为终止符NULL
在这里插入图片描述
下面来看 getenv 接口,返回值为环境变量的值,类型也为字符串。
在这里插入图片描述
需要注意的是,这里返回的直接是环境变量存储的位置,而不是一个拷贝副本,这意味着如果用户拿到这个指针后,如果修改其内容,将直接修改环境变量的值,因此返回值标注了(Read-only),提醒用户不应该去修改其内容
在这里插入图片描述

测试结果

  • putenv 设置 Variable1 = BadValue3,此时 Variable1 为 BadValue3
  • setenv 设置 Variable1 = GoodValue1,由于 Overwrite 为 True,此时 Variable1 被重置 GoodValue1
  • setenv 设置 Variable2 = BadValue1,即使此时 Overwrite 为 False,但由于是初次设置,故 Variable2 为 BadValue1
  • setenv 设置 Variable2 = GoodValue2,由于 Overwrite 为 True,此时 Variable2 被重置为 GoodValue2
  • setenv 设置 Variable3 = GoodValue3,即使此时 Overwrite 为 False,但由于是初次设置,故 Variable3 为 GoodValue3
  • setenv 设置 Variable3 = BadValue2,由于 Overwrite 为 False,此时 Variable3 保持原来的值 GoodValue3 不变

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词