- 博客(26)
- 收藏
- 关注
原创 无NVMe命令详解标题 (1)
list功能:列出机器上所有的NVMe设备和命名空间。使用用例:在终端中执行以下命令,会显示系统上所有NVMe设备的详细信息,包括设备名称、命名空间、容量等。功能:列出NVMe子系统。使用用例:此命令会显示所有NVMe子系统的信息,包括每个子系统的NQN(NVMe Qualified Name)。功能:发送NVMe Identify Controller命令,识别控制器并显示其结构。使用用例:此命令用于获取NVMe控制器的详细信息,如制造商、型号、版本号等。
2023-11-16 18:18:58
692
原创 嵌入式编程之中断
在嵌入式系统或操作系统内核开发中,中断处理是核心功能之一。例如,在Linux内核中,中断处理涉及到中断描述符表(IDT)的设置,以及编写特定硬件的ISR。为了编写ISR,开发者需要深入了解硬件的工作原理和操作系统的中断处理机制。ISR通常需要非常高效地执行,因为它们会影响系统的响应时间。此外,ISR中通常需要避免执行可能会阻塞的操作,如内存分配或者长时间的计算,因为这会延迟处理其他中断。
2023-11-03 14:16:05
658
原创 C语言与缓存
缓存通常用于存储计算结果或者频繁访问的数据,以减少重复计算或者减少访问慢速存储设备的次数。写策略:如写回(Write-Back)和写直达(Write-Through),用于决定如何更新缓存和主内存中的数据。缓存的基本原理是空间换时间,即通过使用额外的内存空间来存储数据或计算结果,从而减少CPU或I/O操作的次数。原理:缓存通过减少CPU与主内存之间的数据传输,提高程序运行速度。FIFO是最基础的缓存替换策略,其中最早进入缓存的数据最先被替换。缓存是一种高速的数据存储区,用于存储经常访问或最近访问的数据。
2023-10-30 15:03:21
522
原创 常量指针和指针常量
常量指针: 不能用来修改它所指向的值,但自身可以修改。指针常量: 可以用来修改它所指向的值,但自身不能修改。常量指针常量: 既不能用来修改它所指向的值,也不能自身被修改。
2023-10-26 15:46:18
98
原创 FPGA_SoC基础介绍
FPGA(现场可编程门阵列)核心知识点基础概念可重配置硬件 FPGA 是一种可重配置的硬件平台,意味着你可以通过编程来改变硬件的逻辑功能。逻辑单元(Logic Elements)和逻辑块(Logic Blocks) FPGA 的基础构建块,通常包含查找表(LUTs)、触发器(Flip-flops)和其他基础逻辑和算术功能。编程语言 主要使用硬件描述语言(HDL),如 VHDL 和 Verilog。架构与资源CLBs(Configurable Logic Blocks) 可配置逻辑块,包含一
2023-10-17 14:23:36
187
原创 指针和引用
回调函数是一种编程模式,它允许一个函数(通常称为“调用者”)在某个特定时间或条件下调用另一个函数(“回调函数”)。这种模式在异步编程、事件驱动编程、插件架构等多种场景中非常有用。回调函数是一种非常强大的编程工具,它提供了一种灵活和可扩展的方式来组织代码。通过使用函数指针,你可以在C语言中实现高度动态的行为。
2023-10-11 18:48:57
80
原创 指针&数组使用注意事项极容易引发的错误
当你声明一个变量但没有给它赋值时,该变量的值是未定义的。这种情况也适用于指针。使用未初始化的内存可能导致不可预测的行为,包括程序崩溃、数据损坏或安全漏洞。数组越界是指在数组的有效范围之外进行访问或修改操作。这通常会导致未定义的行为,包括数据损坏、程序崩溃或安全漏洞。悬挂指针是指向已经释放或删除的内存块的指针。访问悬挂指针通常会导致未定义的行为。在底层可能会导致类型不匹配和未定义行为。和ptr = NULL都是将指针设置为NULL,但前者是在定义时,后者是在运行时。在底层,这两者都涉及将一段内存设置为0。
2023-10-11 17:38:24
325
原创 typedef & malloc _=_free
/ 在头文件中// 在源文件中int width;int height;在这种情况下,我们可能不想让库的使用者直接访问结构体的内部成员。他们只能通过 API 函数来操作。int x;int y;} Point;这里,我们没有给结构体定义一个标签名,因为我们不需要在结构体内部引用它。
2023-10-11 15:22:31
66
原创 # C语言嵌入式中的I2C
主设备和从设备:I2C通信中有一个主设备和一个或多个从设备。双线通信:I2C使用两条线进行通信,一条是数据线SDA,另一条是时钟线SCL。地址:每个从设备都有一个唯一的地址,主设备通过地址与从设备通信。I2C是一种强大而灵活的通信协议,但也有许多细节需要注意。从电气连接到数据完整性,从时序同步到安全性,每个方面都需要仔细考虑和计划。理解这些注意事项并将其纳入设计中,可以确保I2C通信的可靠性和效率。附录以下是一些在GitHub上找到的与Linux系统中I2C有关的项目和代码库。
2023-08-25 18:03:53
314
1
原创 内部函数与外部函数&extern
外部函数:在整个程序范围内可见,可以在其他文件中访问。外部函数是默认的链接类型,不需要特殊关键字。内部函数:通过使用static关键字声明,只能在定义它们的文件中访问。这有助于保护代码的封装性,防止不必要的访问。外部函数允许跨文件的函数调用,促进代码的模块化和重用。而内部函数则有助于限制函数的可见性,保护代码的封装性。请注意,这里的“外部函数”和“内部函数”是为了解释目的而使用的术语。在 C 语言规范中,您可能不会找到这些术语的正式定义。外部函数通常只是普通的函数,而内部函数通常是使用static。
2023-08-23 12:00:40
936
原创 递归(C)
递归是一种编程技术,其中函数直接或间接地调用自身。递归函数通常有两个部分:基本情况(base case)和递归情况(recursive case)。基本情况:这是递归的停止条件。没有基本情况,递归将无限制地继续下去。递归情况:这是函数调用自身的部分。递归是一种强大的编程技术,可以用来解决许多复杂的问题。然而,它也可能是复杂的,需要仔细的设计和理解。
2023-08-23 10:33:52
38
原创 C语言中关于变量的基础解析
局部变量的作用范围限于定义它的函数或代码块,而全局变量的作用范围是整个源文件。正确理解和使用这两种变量有助于编写结构清晰、易于维护的代码。全局变量在整个程序中都是可见的,可以在定义它的文件以及其他文件中使用。以下是全局变量的一些特性和如何在不同的代码文件中引用它们的详细说明。全局变量是在所有函数外部定义的变量。你可以在一个源文件中定义全局变量,并在同一文件或其他文件中使用它。全局变量提供了一种在整个程序中共享数据的方式。正确使用全局变量可以使代码更简洁、更易于维护。
2023-08-22 16:16:04
211
1
原创 GCC 编译
这三个选项允许您灵活地控制编译过程中的头文件和库文件的搜索和链接。通过合理地组合这些选项,您可以在复杂的项目结构中进行精确的编译和链接。。编译链接以得到静态库或动态库涉及一些特定的步骤和选项。静态库和动态库在编译链接时有一些特定的步骤和选项。静态库在程序运行时完全包含在可执行文件中,而动态库在运行时动态加载。选择哪种类型的库取决于具体需求和考虑。
2023-08-22 14:56:33
141
1
原创 宏开关-gcc中的宏开关
请注意,宏的定义只在当前的源文件中有效,如果你想在多个源文件中使用同一个宏,那么每个源文件都需要定义这个宏,或者你可以在一个公共的头文件中定义这个宏,然后在需要使用这个宏的源文件中包含这个头文件。也就是说,开启宏开关就是使其生效,将其定义或者赋值。此外,编译命令行选项也可以定义宏,例如在GCC和Clang编译器中,你可以使用。只要在代码中定义了某个宏,我们就可以说这个宏开关被开启了。开启宏开关并不意味着这个宏有特定的值,它只是存在。"开启宏开关"通常意味着定义了相应的预处理器宏。的宏,等同于开启了名为。
2023-05-31 11:45:13
730
原创 SSD性能表征专业名词
吞吐量、IOPS(输入/输出操作数/秒)和带宽之间的关系可以理解为存储系统的不同性能面向。它们在不同的使用场景和应用需求下各有重要性。为了更好地理解这三者之间的关系和区别,我们可以使用一些现实世界的类比。不同的应用会依赖于这三个指标中的一个或多个。例如,数据库和电子邮件服务器更多关注IOPS,而视频流和大数据分析更侧重于带宽。因此,根据特定的应用需求,可能需要优化其中一个或多个指标以实现最佳性能。
2023-05-30 20:16:56
137
原创 SSD相关概念
垃圾收集(Garbage Collection,GC)在固态硬盘(Solid-State Drive,SSD)中扮演了重要的角色。由于NAND闪存单元的物理特性,它们不能单独被覆写,必须先被擦除,然后才能重新编程。这就是为什么SSD需要执行垃圾收集过程,以保持其性能和增强寿命。在SSD中,GC的主要任务是寻找包含已失效(旧版本或已删除的)数据的闪存块,然后擦除这些块以便重新写入新数据。在实际应用中,有两种GC:前台GC和后台GC。前台GC在没有可用闪存块时进行,可能会阻碍新的写入操作。
2023-05-22 16:18:01
545
原创 SSD固态硬盘特性术语&bit位设置
这一系列操作导致实际写入的数据量大于主机请求写入的数据量,从而产生了写放大现象。写放大会影响SSD的性能和寿命,因为更多的实际写入操作会增加闪存的磨损,并消耗更多的写入周期。了解写放大及其影响对于更好地理解SSD性能和寿命至关重要。通过采用适当的优化策略,可以降低写放大,从而提高SSD的性能和耐久性。
2023-03-26 21:25:40
2511
原创 WDT中的pclk及相关单位换算
PCLK (Peripheral Clock) cycles 指的是在微控制器或微处理器系统中由外设时钟(PCLK)产生的时钟周期数。PCLK 是驱动系统中外设的时钟信号,例如定时器、UART、SPI 等。PCLK 周期的长度取决于时钟频率和系统中使用的外设类型。在编程时,可以使用 PCLK 周期来计算各种时间参数,如定时器的时间间隔、UART 通信的波特率等。
2023-03-09 18:12:46
903
原创 SSD 中的GPIO
在SSD中,GPIO(General Purpose Input/Output)指的是通用输入输出端口,也被称为通用IO口或通用引脚。它们通常被用于控制和读取外部设备的状态,例如LED灯、按键、传感器等等。
2023-03-06 14:51:29
389
原创 SSD 中通过#define定义寄存器地址并直接访问
需要注意的是,在访问和操作 HOST register definition 时需要确保地址的正确性,并且需要按照控制器的规格书要求进行读写操作。在使用 HOST register definition 时,还需要考虑多线程、同步和错误处理等问题,以确保程序的正确性和稳定性。定义好 HOST register definition 以后,可以通过宏定义的名称来直接访问和操作寄存器。然后,使用 HOST register definition 读取和写入寄存器的值,并输出当前值和写入后的值。
2023-03-03 00:00:12
482
原创 C语言学习笔记1-隐式转换&string接口&volatile
C语言和C++语言中都存在隐式类型转换的情况,开发者在使用中需要注意隐式类型转换可能导致编译出错在C语言中,枚举类型是一种用户自定义类型,它的定义方式类似于结构体。枚举类型是由一组标识符组成的,这些标识符是由用户定义的。枚举类型的主要作用是为程序中的某些数据提供有意义的名字,从而使程序更加易读易懂。在C语言中,定义枚举类型需要使用关键字enum。cCopy codeenum 枚举类型名 { 标识符1, 标识符2, ... 标识符n };其中,枚举类型名是用户定义的枚举类型名称,标识符1到标识符n。
2023-03-02 23:27:17
162
原创 C中ctype.h中的常用接口
宏定义功能isalnum©判断字符c是否是字母或数字。isalpha©判断字符c是否是字母。iscntrl©判断字符c是否是控制字符。isdigit©判断字符c是否是数字。isgraph©判断字符c是否是可打印字符(空格除外)。islower©判断字符c是否是小写字母。isprint©判断字符c是否是可打印字符(包括空格)。ispunct©判断字符c是否是标点符号。isspace©判断字符c是否是空格字符。isupper©判断字符c是否是大写字母。
2023-02-21 02:04:23
76
原创 C 语言中 stdlib.h中可用的接口
long int strtol(const char *str, char **endptr, int base):将字符串str转换为长整型数,endptr指向str中第一个不能转换的字符。如果buf为NULL,函数会分配足够的空间以存储路径,并返回指向路径字符串的指针。unsigned long int strtoul(const char *str, char **endptr, int base):将字符串str转换为无符号长整型数,endptr指向str中第一个不能转换的字符。
2023-02-21 01:51:19
216
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人