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),以确保多线程环境下的数据一致性

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

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

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

相关文章

Spring WebFlux

文章目录 一、概述1、Spring体系定位2、Spring MVC和WebFlux差异 二、入门1、依赖2、ReactorHttpHandlerAdapter(main启动)3、DispatcherHandler(SpringWebFlux启动)4、WebFilter 三、DispatcherHandler理解1、handle 前置知识&am…

基于SSM的自助购药小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

Oracle graph 图数据库体验-安装篇

服务端安装 环境准备 安装数据库 DOCKER 安装23AI FREE ,参考: https://container-registry.oracle.com/ords/f?p113:4:111381387896144:::4:P4_REPOSITORY,AI_REPOSITORY,AI_REPOSITORY_NAME,P4_REPOSITORY_NAME,P4_EULA_ID,P4_BUSINESS_AREA_ID:1…

CSS 的基础知识及应用

前言 CSS(层叠样式表)是网页设计和开发中不可或缺的一部分。它用于描述网页的视觉表现,使页面不仅实现功能,还能提供吸引人的用户体验。本文将介绍 CSS 的基本概念、语法、选择器及其在提升网页美观性方面的重要性。 什么是 CSS&…

C语言之装甲车库车辆动态监控辅助记录系统

🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之装甲车库车辆动态监控辅助记录系统 目录 一、前言 1.1 (一)…

python+django+Nacos实现配置动态更新-集中管理配置(实现mysql配置动态读取及动态更新)

一、docker-compose.yml 部署nacos服务 version: "3" services:mysql:container_name: mysql# 5.7image: mysql:5.7environment:# mysql root用户密码MYSQL_ROOT_PASSWORD: rootTZ: Asia/Shanghai# 初始化数据库(后续的初始化sql会在这个库执行)MYSQL_DATABASE: nac…

OpenEuler学习笔记(一):常见命令

OpenEuler是一个开源操作系统,有许多命令可以用于系统管理、软件安装、文件操作等诸多方面。以下是一些常见的命令: 一、系统信息查看命令 uname 用途:用于打印当前系统相关信息,如内核名称、主机名、内核版本等。示例&#xff…

聊聊如何实现Android 放大镜效果

一、前言 很久没有更新Android 原生技术内容了,前些年一直在做跨端方向开发,最近换工作用重新回到原生技术,又回到了熟悉但有些生疏的环境,真是感慨万分。 近期也是因为准备做地图交互相关的需求,功能非常复杂&#x…

C++,设计模式,【目录篇】

文章目录 1. 简介2. 设计模式的分类2.1 创建型模式(Creational Patterns):2.2 结构型模式(Structural Patterns):2.3 行为型模式(Behavioral Patterns): 3. 使用设计模式…

RabbitMQ集群安装rabbitmq_delayed_message_exchange

1、单节点安装rabbitmq安装延迟队列 安装延迟队列rabbitmq_delayed_message_exchange可以参考这个文章: rabbitmq安装延迟队列-CSDN博客 2、集群安装rabbitmq_delayed_message_exchange 在第二个节点 join_cluster 之后,start_app 就会报错了 (CaseC…

【C++】如何从源代码编译红色警戒2地图编辑器

【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库,已经包含三方库。 一、运行效果:二、源代码来源及编程语言:三、环境搭建:安装红警2安装VS2022下载代码,源代码其实不太多&#xff0c…

下定决心不去读研了。。。

大家好,我是苍何。 之前发表过一篇文章,表达了自己读研的困惑和纠结,得到了大家很多的建议,也引起了很多人的共鸣,在留言区分享了自己的故事,看着这些故事,我觉得都够苍何写一部小说了。 可惜苍…

重温STM32之环境安装

缩写 CMSIS:common microcontroller software interface standard 1,keil mdk安装 链接 Keil Product Downloads 安装好后,开始安装平台软件支持包(keil 5后不在默认支持所有的平台软件开发包,需要自行下载&#…

[苍穹外卖] 1-项目介绍及环境搭建

项目介绍 定位:专门为餐饮企业(餐厅、饭店)定制的一款软件产品 功能架构: 管理端 - 外卖商家使用 用户端 - 点餐用户使用 技术栈: 开发环境的搭建 整体结构: 前端环境 前端工程基于 nginx 运行 - Ngi…

能源物联网数据采集设备 串口服务器功能参数介绍

摘要 ​随着物联网技术的快速发展,各种传统设备的联网需求愈发迫切。串口服务器作为一种桥接传统串口设备与现代网络的关键设备,在工业控制、智能电网、交通运输等域发挥了重要作用。本文以APort100串口服务器为例,探讨串口服务器在现代物联…

20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识

20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识 2025/1/18 15:12 缘起:做飞凌OK3588-C开发板/核心板【Linux R4】的时候,测试/生产要求没有开机LOGO【飞凌/Rockchip】 要求:黑屏或者中性界面。…

【STM32-学习笔记-4-】PWM、输入捕获(PWMI)

文章目录 1、PWMPWM配置 2、输入捕获配置3、编码器 1、PWM PWM配置 配置时基单元配置输出比较单元配置输出PWM波的端口 #include "stm32f10x.h" // Device headervoid PWM_Init(void) { //**配置输出PWM波的端口**********************************…

RocketMQ源码之消息刷盘分析

前言 刷盘是将内存中的消息写入磁盘,分为同步刷盘和异步刷盘。同步刷盘指一条消息写入磁盘才返回成功,异步刷盘指写入内存就返回成功,稍后异步线程刷盘。 在创建CommitLog对象的时候,会初始化刷盘服务: //代码位置:org.apache.rocketmq.store.CommitLog public CommitL…

navicat 折线图或面积图

折线图或面积图将信息显示为以直线段连接的一系列数据点。 折线图 面积图 堆积面积图 图表属性 选择图表类型后,可以更改其属性来自定义图表: 选项 描述 常规 背景颜色 设置图表区域的背景颜色。 不透明度 设置背景颜色的不透明度。 显示边框…

【数模学习笔记】插值算法和拟合算法

声明:以下笔记中的图片以及内容 均整理自“数学建模学习交流”清风老师的课程资料,仅用作学习交流使用 文章目录 插值算法定义三个类型插值举例插值多项式分段插值三角插值 一般插值多项式原理拉格朗日插值法龙格现象分段线性插值 牛顿插值法 Hermite埃尔…