当前位置: 首页 > article >正文

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 不变

在这里插入图片描述


http://www.kler.cn/a/524318.html

相关文章:

  • three.js用粒子使用canvas生成的中文字符位图材质
  • C语言初阶力扣刷题——349. 两个数组的交集【难度:简单】
  • 从替代到覆盖:暴雨信创服务器打开市场新局面
  • 基于dlib/face recognition人脸识别推拉流实现
  • 从腾讯云数据仓库TCHouse安全地转移数据到AWS Redshift
  • 《Java核心技术 卷II》日期和时间API的时间线
  • 【JavaEE】_MVC架构与三层架构
  • matlab学习路线
  • springboot使用rabbitmq
  • 使用CSS实现一个加载的进度条
  • 深度学习可视化指标方法工具
  • Python学习之旅:进阶阶段(五)数据结构-双端队列(collections.deque)
  • 如何将电脑桌面默认的C盘设置到D盘?详细操作步骤!
  • leetcode——排序链表(java)
  • 深入探索SQL中修改表字段属性的技巧与策略
  • 【PyQt5】数据库连接失败: Driver not loaded Driver not loaded
  • 10.2 目录(文件夹)操作
  • 至少是其他数字两倍的最大数(747)
  • Skynet实践之「Lua C 模块集成—优先级队列」
  • 渲染流程概述
  • 【逻辑学导论第15版】A. 推理
  • Windows 系统下使用 Ollama 离线部署 DeepSeek - R1 模型指南
  • MyBatis 关联映射详解
  • OpenEuler学习笔记(十五):在OpenEuler上搭建Java运行环境
  • 【实践】基于SakuraLLM的离线日文漫画及视频汉化
  • HarmonyOS:状态管理最佳实践