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 开始分析下一个测试项