31、【OS】【Nuttx】OSTest分析(1):stdio测试(一)

背景

接上篇wiki
30、【OS】【Nuttx】构建脚本优化,引入待构建项目参数
最小系统分析完后,下一个能够更全面了解Nuttx的Demo,当然选择OSTest,里面有大量关于OS的测试用例,方便对Nuttx的整体功能有个把握。

stdio_test

OSTest 首个测试用例,向标准输出端口写入一串数据

在这里插入图片描述
这里 write 函数原型如下,其中输入参数为

  • fd:file description,文件描述符(就是文件id,在Nuttx文件系统中,所有设备包括输入输出端口被视为文件)
  • buf:数据指针
  • nbytes:数据长度
    在这里插入图片描述

所以上面的测试用例为向 fd = 1 和 fd = 2 的文件写入一串字符,write_data 定义如下:
在这里插入图片描述
在 Nuttx 或类Unix系统(如Linux),文件描述符 1 和 2 是标准 IO 流的预定义文件描述符,分别对应标准输出(stdout)和标准错误(stderr)

  • 文件描述符 0 (stdin):标准输入流
  • 文件描述符 1 (stdout):标准输出流,通常用于向终端或控制台输出信息或程序正常运行结果。
  • 文件描述符 2 (stderr):标准错误流,通常用于输出错误信息或警告消息。与 stdout 不同的是,stderr 一般不会被重定向,因此即使 stdout 被重定向到文件或其他地方,错误信息仍然会显示在终端上。

综上,stdio_test 的测试目的是往标准输出端口和标准错误端口写一串数据

另外,write 函数接口处于文件系统的 VFS 抽象层(Virtual File System),即虚拟文件系统,VFS 是 Nuttx 文件系统中的一个重要组成部分,VFS 位于用户应用程序和实际文件系统实现之间,为用户提供了统一接口来访问不同文件系统类型,而无需关心底层存储介质的具体细节
在这里插入图片描述

标准IO端口初始化

首先来简单介绍文件系统中几个关键类型,首先是 filelist 队列,里面存放了各文件实例,当用户拥有文件描述符后,可以从 filelist 队列中取出对应的文件实例,以便对文件进行操作
在这里插入图片描述
下面来详细分析下这个 filelist 队列结构体,里面有五个成员,其中最关键的为 fl_files 成员,该成员是一个指针,指向一个二维数组,这个二维数组里直接存放了所有文件实例

  • fl_lock:全局原子锁,防止资源竞争
  • fl_rows:fl_files的行数,表示有多少块文件实例,文件系统每次会预先申请一块内存区域,用来预存放即将注册的文件实例,每申请一次,fl_rows加1
  • fl_files:filelist 队列的核心成员,指向存放所有文件实例的二维数组,当用户通过文件描述符对文件实例进行访问时,fd / NFILE_DESCRIPTORS_PER_BLOCK 为二维数组的行索引,fd % NFILE_DESCRIPTORS_PER_BLOCK 为二维数组的列索引(这里NFILE_DESCRIPTORS_PER_BLOCK 就是文件系统的块大小),此时文件系统可以很容易找出文件描述符 fd 对应的实例进行使用
  • fl_prefile:预存放文件实例的内存指针
  • fl_prefiles:预存放文件实例的内存

filelist作用如下图
在这里插入图片描述
SIM 中每个块能放8个文件实例
在这里插入图片描述

这里思考个问题,为什么这里 fl_files 使用二维数组,而不是一维数组?有几个关键原因,主要与内存管理和性能优化有关:

  • 分块管理:通过将文件描述符按块组织,可以更高效地管理内存分配和释放。每个块大小由宏 CONFIG_NFILE_DESCRIPTORS_PER_BLOCK 定义,在二维数组 fl_files 中每一行代表一个固定大小的块,可以一次性分配或释放一整块资源。分块管理后,有如下几个显著的优点:
    1、减少碎片:相比于逐个分配文件描述符,分块分配可以减少内存碎片
    2、简化内存管理:当需要扩展时,只需增加新的块而不是逐个增加文件描述符
    3、提高缓存命中率:同一块中的文件描述符在内存中是连续存储的,访问同一块内的多个文件描述符有利于提高缓存命中率,从而提升性能
  • 预分配和线程安全:通过预先分配一定数量的文件描述符(如 fl_prefiles 数组),可以在创建线程时避免动态内存分配,确保系统的功能安全性,这也是 filelist 队列结构体类型定义时注释的
  • 简化锁定机制:由于每个块大小是固定的,锁定机制可以更加精细。比如可以给每个块设置单独的锁,或者在整个 filelist 上设置一个全局锁(如 fl_lock),以确保多线程环境下的数据一致性

先分析到这里,下次再接着分析

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 24.04 LTS 安装 Docker Desktop

Docker 简介 Docker 简介和安装Ubuntu上学习使用Docker的详细入门教程Docker 快速入门Ubuntu版(1h速通) Docker 安装 参考 How to Install Docker on Ubuntu 24.04: Step-by-Step Guide。 更新系统和安装依赖 在终端中运行以下命令以确保系统更新并…

Elasticsearch 和arkime 安装

安装一定要注意版本号,不然使用不了 这里Ubuntu使用ubuntu-20.04.6-desktop-amd64.iso elasticsearch这里使用Elasticsearch 7.17.5 | Elastic arkime这里使用wget https://s3.amazonaws.com/files.molo.ch/builds/ubuntu-20.04/arkime_3.4.2-1_amd64.deb 大家想…

C语言之整数转换英文表示

🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 整数转换英文表示 摘要:本文设计了一种基于C语言的数字到英文表示的转换程序&am…

战场物联网:通信挑战与最新解决方案综述

论文标题 The Internet of Battle Things: A Survey on Communication Challenges and Recent Solutions 作者信息 Rachel Kufakunesu, Herman Myburgh, Allan De Freitas 论文出处 Discover Internet of Things (2025) 5:3 | The internet of battle things: a survey on…

【2024年华为OD机试】 (B卷,100分)- 路灯照明问题(Java JS PythonC/C++)

一、问题描述 路灯照明问题 题目描述 在一条笔直的公路上安装了 ( N ) 个路灯,从位置 0 开始安装,路灯之间间距固定为 100 米。每个路灯都有自己的照明半径。请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。 输入描述 第一…

将n变为一个可以被表示为2^{a}+2^{b}的正整数m

给出一个正整数n,需要将n变为一个可以被表示为的正整数m,其中a和b都是非负整数且a!b,你可以进行两种操作: 1.令n加1 2.令n减1 请你求出最少需要多少次操作才能将n变成满足条件的m。 输入格式 输入一个整数,代表n。…

ARM学习(42)CortexM3/M4 MPU配置

笔者之前学习过CortexR5的MPU配置,现在学习一下CortexM3/M4 MPU配置 1、背景介绍 笔者在工作中遇到NXP MPU在访问异常地址时,就会出现总线挂死,所以需要MPU抓住异常,就需要配置MPU。具体背景情况可以参考ARM学习(41)NXP MCU总线挂死,CPU could not be halted以及无法连…

大语言模型的语境中“越狱”和思维链

大语言模型的语境中“越狱”和思维链 越狱(Jailbreaking) 含义:在大语言模型的语境中,“越狱”是指用户试图绕过语言模型的安全限制和使用规则,让模型生成违反伦理道德、包含有害内容(如暴力、歧视、恶意软件代码等)的输出。这些安全限制是由模型开发者设置的,目的是确…

AI时代下 | 通义灵码冲刺备战求职季

AI时代下 | 通义灵码冲刺备战求职季 什么是通义灵码使用智能编程助手备战求职靠谱吗体验心得 AI时代下,备战求职季有了不一样的方法,使用通义灵码冲刺备战求职季,会有什么样的体验? 什么是通义灵码 在开始话题之前,首…

PHP企业IM客服系统

💬 企业IM客服系统——高效沟通,无缝连接的智慧桥梁 🚀 卓越性能,释放无限可能 在瞬息万变的商业环境中,我们深知沟通的力量。因此,基于先进的ThinkPHP5框架与高性能的Swoole扩展,我们匠心独运…

华为HuaweiCloudStack(一)介绍与架构

本文简单介绍了华为HCS私有云解决方案,并从下至上介绍HCS的整体架构,部署架构、部署方式等内容。 目录 HCS简介 HCS架构 纵向结构 ?管理平台类型 HCS节点类型 FusionSphere OpenStack CPS ServiceOM SC 运营面 OC 运维面 HCS部署架构 regi…

[Qt] Box Model | 控件样式 | 实现log_in界面

目录 1、样式属性 (1)盒模型(Box Model) 2、控件样式示例 (1)按钮 (2)复选框 (3)单选框 (4)输入框 (5&#xff09…

【PowerQuery专栏】PowerQuery提取XML数据

XML数据和Json 数据类型都是比较典型的层次数据类型,XML的数据格式非常的对称。所有的数据均是由标签对组成,图为典型的XML文件类型的数据。 在PowerQuery中进行XML数据类型解析采用的是Xml.Document 函数来进行文件内容的解析,Xml.Document 目前有三个可用参数。 参数1为数…

高等数学:映射与函数

目录 映射 函数 定义 函数特性 映射 函数 定义 函数特性

华为AI培训-NLP实验

中文分词、命名实体识别、语义词性标注、语句逻辑推理、文本摘要、机器翻译、文本情感分析、内容创作 1 实验介绍 1.1 实验背景 中文分词、命名实体识别、语义词性标注、语句逻辑推理是自然语言处理领域中的重要任务。中文分词是将连续的汉字序列切分成有意义的词语序列…

Netty的相关组件之间的关系

组件类型 通常分为Client和Server两个,其中如果作为Client通常只需要一个EventLoopGroup并且是用Bootrap绑定该EventLoopGroup用作客户端去监听服务器端的ip和端口。而Server通常是用ServerBootrap绑定两个EventLoopGroup,一个用作连接一个用作处理事务…

OpenHarmony-7.IDL工具

IDL 工具 1.openharmony IDL工具 在OpenHarmony中,当应用/系统服务的客户端和服务端进行IPC(Inter-Process Communication)跨线程通信时,需要定义双方都认可的接口,以保障双方可以成功通信,OpenHarmony ID…

总结3..

#include<stdio.h> int n,m; int a[1002][1002]; int b[1002][1002];//判断该空的八连通图是否被走过 int gg0; int dd0; int xz[8]{-1,-1,-1,0,0,1,1,1},yz[8]{-1,0,1,-1,1,-1,0,1};//八个方向 void dfs(int x,int y) { int dx,dy; for(int i0;i<8;i) { …

html全局遮罩,通过websocket来实现实时发布公告

1.index.html代码示例 <div id"websocket" style"display:none;position: absolute;color:red;background-color: black;width: 100%;height: 100%;z-index: 100; opacity: 0.9; padding-top: 30%;padding-left: 30%; padding-border:1px; "onclick&q…

LeetCode - #187 Swift 实现重复的DNA序列

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…