任务堆栈
任务堆栈vTaskList 介绍可通过 vTaskList() 来协助分析操作系统当前 task 状态,以帮助优化内存,帮助定位栈溢出问题,帮助理解和学习操作系统原理相关知识。 vTaskList 使用使用 vTaskList() 前需使能: make menuconfig -> Component config -> FreeRTOS -> Enable FreeRTOS trace facility make menuconfig -> Component config -> FreeRTOS -> Enable FreeRTOS trace facility -> Enable FreeRTOS stats formatting functions 通过上面配置,等同于使能 FreeRTOSConfig.h 中如下两个宏:configUSE_TRACE_FACILITY 和 configUSE_STATS_FORMATTING_FUNCTIONS 123456void SystemInfo::PrintTaskList()...
结构化绑定
结构化绑定概述结构化绑定是一个语法糖,它允许你从一个数组、结构体、元组或类似的拥有多个数据成员的对象中,一次性声明并初始化多个变量。这使得代码更简洁、更易读,特别是当你需要处理像 std::pair 或 std::tuple 这样的类型时。 注意 结构化绑定的变量数量必须与表达式中的元素数量匹配 结构化绑定的变量生命周期与绑定的对象相同 结构化绑定的变量是表达式中对应元素的副本或引用 结构化绑定不能用于类的私有成员,除非在类的成员函数内部 结构化绑定不支持嵌套绑定 必须使用 auto 关键字作为类型 例程12345678int arr[2] = { 1, 2 };auto [x, y] = arr;cout << x << ' ' << y << endl;auto [m, n](arr);cout << m << ' ' << n << endl;auto [p, q]{arr};cout...
协程
协程概念协程是一种特殊的函数,不像普通函数那样,一旦执行这个函数就会一直执行下去,直到函数结束或者出现异常。而协程就非常灵活,它在执行的过程中可以随时暂停,把 CPU 资源让出来,等到合适的时候再重新恢复运行。 协程的使用场景当你正在一个大型的网络服务器,需要处理多个并发的客户端请求,但是传统的服务器是给每个请求分配一个线程来进行处理,这样会导致资源消耗过大。而使用协程,你可以在一个线程中同时处理多个客户端的请求,当某个客户端的请求需要等待 I/O 时,协程可以暂停执行,切换到处理其他客户端的请求,从而提高服务器的并发能力。 有栈协程和无栈协程 有栈线程:协程在执行时会使用自己的栈空间,协程的调用和返回都是通过栈来实现的。这种方式的优点是实现简单,性能较好,但缺点是栈空间有限,容易导致栈溢出。Go 语言的协程就是有栈协程的一个典型例子。 无栈协程: 协程在执行时不使用自己的栈空间,而是将所有的状态信息保存在堆上。这种方式的优点是可以支持更大的协程栈,但缺点是实现复杂。C#的协程就是无栈协程的一个典型例子。 C++ 协程原理C++...
数制和编码
数制和编码真值和机器数 真值:符合人类习惯的数字 机器数:数字实际存到机器里的形式,正负号需要被数字化 真值 机器数 +15 0 1111 -8 1 1000 BCD码BCD码:二进制编码的十进制数 二进制数:0、1 方便计算机处理十进制数:0、1、2、3、4、5、6、7、8、9、10 符合人类习惯 BCD码的计算 进制数 算术式 结果 十进制 5 + 8 13 8421码 0101 + 1000 1101 我们发现1101不在8421码映射表里,8421码中1010~1111没有定义。我们可以在这个运算基础上+6即:1101 + 0110 = 10011即0001 0011也就是13。 进制数 算术式 结果 十进制 9 +...
计算机硬件
...
计算机性能指标
计算机性能指标存储器性能指标MAR位数反应存储单元的个数(最多支持多少个)。MDR位数就是存储字长也就是每个存储单元的大小。 $$ 总容量(bit) = 存储单元个数 × 存储字长$$ $$ 总容量(Byte) = 存储单元个数 × 存储字长/8$$ 例:MAR为32位,MDR为8位 $ 总容量 = 2^{32} × 8 bit = 4GB $ CPU性能指标CPU主频 CPU内数字脉冲信号震荡的频率 CPI 执行一条指令需要的时钟周期数。这个指标受很多因素影响。不同的指令,CPI不同,甚至相同的指令,CPI也有可能发生变化 $$ 执行一条指令的耗时 = CPI × CPU时钟周期 $$ $$ CPU执行时间(这个程序耗时) = \frac{CPU时钟周期数}{主频} $$ IPS(instructions Per Second) 每次执行多少条指令 $$ IPS = \frac{主频}{CPU时钟周期} $$ 单位:KIPS...
IO概述
IO概述IO设备I/O就是输入输出,I/O设备就是可以将数据输入到计算机,或者可以就接收到计算机输出数据的外部设备,属于计算机中硬件部件。 UNIX系统将外部设备抽象为一种特殊的文件,用户可以使用与文件操作相同的方式对外部设备进行操作。 Write操作:向外部设备写出数据。 Read操作:从外部设备读入数据。 IO设备分类按使用特性 按传输速率分类 按信息交换单位分类
IO控制器
...
IO软件
IO软件IO软件层次结构 设备独立性软件设备独立性软件,又称设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现。 这一层实现的功能: 向上层提供统一的调用接口:如write/read系统调用 设备的保护:原理类似于文件保护。设备被看做是一种特殊文件,不同用户对各个文件的访问权限是不一样的,同理,对设备的访问权限也不一样。 差错处理:设备独立性软件需要对一些设备的错误进行处理 设备的分配和回收 数据缓冲区管理:可以通过缓冲技术屏蔽设备之间数据单位大小的传输速度的差异。 建立逻辑设备名到物理设备名的映射关系;根据设备类型选择调用相应的驱动程序:用户或用户层软件发出I/O操作相关系统调用的系统调用时,需要指明此次要操作的I/O设备的逻辑设备名。设备独立性软件需要通过**逻辑设备表(LUT,Logical...
文件功能
文件功能文件操作创建文件 进行Create系统调用时,主要做了两件事: 在外存中找到文件所需的空间 根据文件存放的路径信息找到该文件,在目录中创建该文件对应的目录项。目录项中包含了文件名。文件在外存中的存放位置信息。 删除文件 进行Delete系统调用时,需要提供的几个主要参数 文件存放路径 文件名 进行Delete系统调用时,主要做了两件事: 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项。 根据该目录记录的文件在外存的存放位置、文件大小信息,回收文件占用的磁盘块。位图法等管理策略的不同,需要做不同的处理。 从目录表中删除文件对应的目录项。 打开文件 在很多操作系统中,在对文件进行操作之前,要求用户先使用 open 系统调用打开文件,需要提供的几个主要参数: 文件存放路径(“D:/Demo”) 文件名(“test.txt”) 要对文件的操作类型(如:r 只读;rw 读写等) 操作系统在处理 open...



