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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961765.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Ollama本地部署DeepSeek R1

前言 DeepSeek是一款开源的智能搜索引擎,能够通过深度学习技术提高搜索的智能化水平。如果你正在寻找一种方式来将DeepSeek部署在本地环境中,Ollama是一个非常方便的工具,它允许你在本地快速部署并管理各种基于AI的模型。 在本篇博客中&…

libOnvif通过组播不能发现相机

使用libOnvif库OnvifDiscoveryClient类, auto discovery new OnvifDiscoveryClient(QUrl(“soap.udp://239.255.255.250:3702”), cb.Build()); 会有错误: end of file or no input: message transfer interrupted or timed out(30 sec max recv delay)…

Visual Studio使用GitHub Copilot提高.NET开发工作效率

GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码,从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能? 每月 2000 代码补全,帮助开发者快速完成代码编写。 每月 …

HTB:Forest[WriteUP]

连接至HTB服务器并启动靶机 分配IP:10.10.16.21 靶机IP:10.10.10.161 靶机Domain:forest.htb 目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端…

项目集成GateWay

文章目录 1.环境搭建1.创建sunrays-common-cloud-gateway-starter模块2.目录结构3.自动配置1.GateWayAutoConfiguration.java2.spring.factories 3.pom.xml4.注意:GateWay不能跟Web一起引入! 1.环境搭建 1.创建sunrays-common-cloud-gateway-starter模块…

STM32 PWM驱动直流电机

接线图: 代码配置: 根据驱动舵机的代码来写,与舵机不同的是,这次的引脚接到了PA2上,所以需要改一下引脚以及改为OC3通道。 另外还需在配置两个GPIO引脚,来控制电机的旋转方向,这里连接到了PA4与…

强大到工业层面的软件

电脑数据删不干净,简直是一种让人抓狂的折磨!明明已经把文件扔进了回收站,清空了,可那些残留的数据就像牛皮癣一样,怎么也除不掉。这种烦恼简直无处不在,让人从头到脚都感到无比烦躁。 首先,心…

一分钟搭建promehteus+grafana+alertmanager监控平台

为什么要自己搭建一个监控平台 平时进行后端开发,特别是微服务的后端可开发,一定少不了对接监控平台,但是平时进行一些小功能的测试又没有必要每次都手动安装那么多软件进行一个小功能的测试,这里我使用docker-compose搭建了一个…

记一次STM32编译生成BIN文件过大的问题(基于STM32CubeIDE)

文章目录 问题描述解决方法更多拓展 问题描述 最近在一个项目中使用了 STM32H743 单片机(基于 STM32CubeIDE GCC 开发),它的内存分为了 DTCMRAM RAM_D1 RAM_D2 …等很多部分。其中 DTCM 的速度是比通常的内存要快的,缺点是不支持…

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具,它将小的代码片段编译成更大、更复杂的代码,例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式,而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…

崇州市街子古镇正月初一繁华剪影

今天是蛇年正月初一,下午笔者步出家门,逛到了崇州市街子古镇井水街,想看看景象如何。结果看到的是车水马龙、人流如织,繁花似锦,热闹非凡,原来今天开始预订此地摆下的长街宴。心里高兴,便用手机…

【橘子Kibana】Kibana的分析能力Analytics简易分析

一、kibana是啥,能干嘛 我们经常会用es来实现一些关于检索,关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI,你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…

python3+TensorFlow 2.x(二) 回归模型

目录 回归算法 1、线性回归 (Linear Regression) 一元线性回归举例 2、非线性回归 3、回归分类 回归算法 回归算法用于预测连续的数值输出。回归分析的目标是建立一个模型,以便根据输入特征预测目标变量,在使用 TensorFlow 2.x 实现线性回归模型时&…

OpenAI-Edge-TTS:本地化 OpenAI 兼容的文本转语音 API,免费高效!

文本转语音(TTS)技术已经成为人工智能领域的重要一环,无论是语音助手、教育内容生成,还是音频文章创作,TTS 工具都能显著提高效率。今天要为大家介绍的是 OpenAI-Edge-TTS,一款基于 Microsoft Edge 在线文本…

练习(复习)

大家好,今天我们来做几道简单的选择题目来巩固一下最近学习的知识,以便我们接下来更好的学习。 这道题比较简单,我们前面学过,在Java中,一个类只能继承一个父类,但是一个父类可以有多个子类,一个…

Meta推动虚拟现实:Facebook如何进入元宇宙时代

随着科技的不断进步,虚拟现实(VR)与增强现实(AR)技术的快速发展,世界正在逐步迈向一个全新的数字时代——元宇宙。而在这个革命性的转变中,Meta(前身为Facebook)作为全球…

go gin配置air

一、依赖下载 安装最新,且在你工作区下进行安装,我的是D:/GO是我的工作区,所有项目都在目录下的src, go install github.com/air-verse/airlatest 如果出现类似报错: 将图中第三行 github.com/air-verse/air 替换最…

Spring--SpringMVC使用(接收和响应数据、RESTFul风格设计、其他扩展)

SpringMVC使用 二.SpringMVC接收数据2.1访问路径设置2.2接收参数1.param和json2.param接收数据3 路径 参数接收4.json参数接收 2.3接收cookie数据2.4接收请求头数据2.5原生api获取2.6共享域对象 三.SringMVC响应数据3.1返回json数据ResponseBodyRestController 3.2返回静态资源…

FreeRTOS的任务创建和删除

1,任务创建和删除的API函数 任务的创建和删除本质就是调用FreeRTOS的API函数 动态创建任务: 任务的任务控制块以及任务的栈空间所需的内存,均由 FreeRTOS 从 FreeRTOS 管理的堆中分配。 静态创建任务: 任务的任务控制块以及任务的…

通过Ngrok实现内网穿透助力远程开发

在现代软件开发和网络应用的环境下,开发人员常常需要在本地搭建服务器进行调试、测试或演示。然而,传统的端口映射(如使用 NAT 或 SSH 隧道)配置繁琐,且并非所有环境都允许直接暴露本地服务。ngrok 作为一款强大的隧道…