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

35、【OS】【Nuttx】OSTest分析(1):stdio测试(五)

背景

接之前wiki:
31、【OS】【Nuttx】OSTest分析(1):stdio测试(一)
32、【OS】【Nuttx】OSTest分析(1):stdio测试(二)
33、【OS】【Nuttx】OSTest分析(1):stdio测试(三)
34、【OS】【Nuttx】OSTest分析(1):stdio测试(四)
在经历文件系统类型的分析,了解文件系统中一些基本类型概念,并知道IO端口在文件系统中的类型定位为字符设备类型,现在继续回到标准IO端口初始化分析中来

标准IO端口初始化

节点注册

首先,想要使用 IO 端口,得先注册。好比一个学生想要到学校里面学习,使用校园里的学习资源,得拿到学校的录取通知书,得先到学校注册报道,学校录入学生信息后,才能开展学习。
在这里插入图片描述

对于 IO 端口也是一样,得先到 Nuttx 操作系统里面先注册,Nuttx 掌握 IO 端口信息后, IO 端口才能正常使用操作系统里面的资源,在较复杂的软件工程上,注册是一种很常见的软件设计方式,方便软件工程平台化,提升软件的可移植性和扩展能力

在这里插入图片描述

来看具体代码实现,注册字符设备关键函数 register_driver,将字符设备注册到伪文件系统中,将字符设备等驱动视为节点,方便平台化管理
在这里插入图片描述
来看函数参数:

  • path:节点路径,比如要注册的IO端口路径为 /dev/console
  • fops:节点操作函数,比如IO端口底层驱动为uart串口,所以操作函数为串口驱动的输入输出函数
  • mode:涉及到之前 wiki 34、【OS】【Nuttx】OSTest分析(1):stdio测试(四) 中提到的 i_mode 成员,由于没启用伪文件系统属性(Pseudo Filesystem Attribute),这里先不分析(无非是 rwx 等属性)
  • priv:inode 成员 i_private ,之前 wiki 有分析

再来看节点注册调用栈关系
在这里插入图片描述

  • main:项目入口
  • nx_start:Nuttx入口,通用函数
  • up_initialize:上层初始化,这里的上层是相对于底层硬件细节而言,对于 OS 来说,不感知处理器与底层硬件(如片内外设,或片外器件)差异,以通用方式处理如中断,时钟,通用外设等(对于PC处理器而言,通用外设如 uart,usb,net 等,而对于嵌入式MCU,如 uart,spi,iic 等,视具体场景有所区别)。
    在这里插入图片描述
  • sim_uartinit:模拟环境sim专有,视具体项目上资源进行分配
  • uart_register:在Nuttx上被视为字符设备节点,故最后调用文件系统中的字符注册函数 register_driver

文件注册

注册了节点之后,可以开始注册文件了,和之前注册节点不同,注册节点是为了让 Nuttx 可以使用上节点的串口资源,这里注册文件是为了让用户能通过文件描述符访问到对应的节点资源:
在这里插入图片描述
在调试控制台输入,可看到节点被挂在文件上的过程(之前 wiki 分析了 file 类型结构体的 f_inode 成员)

-exec watch g_kthread_group.tg_filelist.fl_files[0][0].f_inode

在这里插入图片描述
调用栈关系
在这里插入图片描述
文件注册成功后,返回文件描述符给用户,后续用户可以通过文件描述符访问到对应的节点资源
在这里插入图片描述
当文件描述符 0 创建成功后,会复制同样的一份到文件描述符 1 和文件描述符 2
在这里插入图片描述
至此,stdio 测试分析完毕,下篇 wiki 开始分析下一个测试项


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

相关文章:

  • 第05章 11 动量剖面可视化代码一则
  • 【Unity3D】aab包太大无法上传Google问题
  • MongoDB常见的运维工具总结介绍
  • 【MySQL — 数据库增删改查操作】深入解析MySQL的 Update 和 Delete 操作
  • 【linux网络(3)】应用层HTTP协议详解
  • 如何运用python爬虫爬取知网相关内容信息?
  • 青少年CTF练习平台 贪吃蛇
  • 函数与方法
  • 浅谈OceanBase旁路导入
  • 如何学习Java后端开发
  • js手撕 | 使用css画一个三角形 使用js修改元素样式 驼峰格式与“-”格式相互转化
  • QT交叉编译环境搭建(Cmake和qmake)
  • MCP Server 开发实战:无缝对接 LLM 和 Elasticsearch
  • 【深度学习】常见模型-自编码器(Autoencoder, AE)
  • python -m pip和pip的主要区别
  • 亚博microros小车-原生ubuntu支持系列:14雷达跟踪与雷达守卫
  • CAN波特率匹配
  • OPPO自研DataFlow架构与实践
  • RHEL封闭环境部署zabbix
  • 【数据资产】数据资产管理概述
  • Workerman和Swoole有什么区别
  • Verilog中if语句和case语句综合出的电路区别
  • RabbitMQ 多种安装模式
  • 【信息系统项目管理师-选择真题】2013下半年综合知识答案和详解
  • 基于Springboot + vue实现的洗衣店订单管理系统
  • 2025年01月27日Github流行趋势