- 博客(236)
- 资源 (63)
- 收藏
- 关注
翻译 本周小贴士#224:避免使用vector.at()
在索引容器时,请注意我们处于哪种情况:索引是否是"按构造确定的",还是代码需要检测和处理无效的索引?在这两种情况下,我们都可以比使用基于异常的std::vector::at() API更好。类似的思考也适用于其他基于异常的API,如std::optional::value()和absl::StatusOr::value()(参见Tip#181)。对于非并发的C++代码中的错误处理,请优先进行"查看后跳转" - 然后,在检查了一切都正常之后,避免使用包含自身检查的API。
2024-03-28 18:10:32 5
原创 嵌入式开发——基础电路知识
驱动能力、负载能力、逻辑电平、三态输出、推挽输出、开漏输出、上拉电阻、下拉电阻、高通波滤、低通波滤、电源去耦电路、阻抗匹配、差分信号、MOS管与继电器、RS232和RS485、译码器、UART/IIC/SPI、模拟信号和数字信号眼图、真实U盘电路讲解。
2024-03-27 16:09:57 1078
原创 嵌入式开发——基础元器件
差分线的好处是,如果传输的信号受干扰,那么两个差分线就同时受干扰,两个信号会同时变化,那么两个信号的幅值差就会近似不变的,利用幅值差来表示信号就可降低干扰。电流表是串联接入电路的,电流表的内阻很小,一般为几mΩ,这样电流表接入电路对电源的外部负载影响很小,所以测量的电流近似于真实值。Vdd,IC的设备电压,在NAND Flash中,与Vccq等同,用于数据传输存储,为了降低功耗,其电压从早期的5V到后来的3.3V, 1.8V甚至1.2V。Vcc,IC的工作电压,主要用于控制IC内部的各种逻辑。
2024-03-27 15:45:36 783
原创 NVMe开发——NAND Flash的基本原理
当栅极(Gate)和P型衬底接通电源时,因为电场的缘故,P型半导体中的电子都往氧化绝缘层靠近,当绝缘层附近的电子足够多时,两个N型半导体之间的电子通道(N沟道)就形成了,两个N型半导体和中间的电子通道相当于一整个N型半导体。读0和读1会有两个阈值电压,先在栅极施加读0的阈值电压,检测是否导通,如果导通,输出1,结束。擦除之后读,因为浮栅层的电子全部释放回了P型半导体中,这时在控制栅加10V电压,P型半导体中的电子会聚集到N型半导体之间形成电子通道,源极和漏极之间接上电源,会导通,此时表示读到‘1’。
2024-03-22 17:47:11 854
原创 C/C++代码性能优化——编程实践
主要针对嵌入式C/C++,性能优化编程技巧,参数传递、函数返回、循环展开、查表、位域、尾递归、位运算、0数组、分支预测、异步计算、事件驱动架构、AI。其他性能负优化的示例。
2024-03-22 17:43:28 957
原创 C/C++代码性能优化——数据结构和算法
数据结构,数组、链表、块状链表、栈、堆、队列、二叉树、红黑树、B树、B+树、跳表、索引、哈希表、图的应用场景和性能比较。 常用排序算法、查找的应用场景和性能比较,其他通用算法应用场景介绍。
2024-03-22 17:40:14 958
原创 C/C++代码性能优化——编译器和CPU
在现代软件开发中,性能优化至关重要,尤其是在资源受限的系统和处理大量数据的应用程序中。C/C++ 作为低级编程语言,提供了对底层硬件的直接访问,使其成为性能关键应用程序的理想选择。然而,编写高效的 C/C++ 代码是一项具有挑战性的任务,需要对语言特性、编译器优化、硬件架构、数据结构和算法有深入的理解。本文旨在为 C/C++ 程序员提供一个全面的指南,涵盖各种优化技术,以提高代码性能,重在指南引导,不讲细节。
2024-03-22 17:35:48 796
原创 NVMe开发——PCIe配置空间和地址空间
PCIe支持不同功能的设备,不同的设备其需要操作的内存大小也不同,为了更方便地实现这一种,BAR(Base Address Registers)产生了。为此,提出了一个新的增强配置访问机制,即将每个功能的配置空间映射到设备的256MB空间中,按4K对齐来分配访问。PCI的256字节信息不够PCIe使用,所以PCIe在此基础上将配置空间扩展到4K字节,如下图中列出了一些主要的扩展寄存器。Capabilities是一组描述PCIe设备功能相关的结构,它是一个链式的结构,一个指向下一个,直到最后。
2024-03-04 18:04:27 1018 1
原创 NVMe开发——PCIe复位
简介PCIe中有4种复位机制,早期的3种被称为传统复位(Conventional Reset)。传统复位中的前2种又称为基本复位(Fundamental Resets),分别为冷复位(Cold Reset),暖复位(Warm Reset)。第3种复位为热复位(Hot Reset)。第4种复位被称为功能级复位(Function Level Reset),出现在PCIe 2.0规范中。传统复位。
2024-03-01 19:39:01 1029
原创 NVMe开发——PCIe电源管理
PCIe电源管理详细描述了与PCI总线PM接口规范和高级配置和电源接口(ACPI)兼容的PCIe功耗管理。PCIe定义了对PCI-PM规范的扩展,主要关注链路电源和事件管理。还概述了OnNow计划、ACPI以及Windows操作系统的相关性。
2024-03-01 19:35:49 1152
原创 NVMe开发——PCIe基础
PCI(Peripheral Component Interconnect),外设组件互连。PCI是一种并口总线标准,对比其之前的其他总线,PCI因其速度快、支持即插即用,中断共享等特性,占领计算机总线标准近20年。随着CPU以及外设的速度要求越来越高,PCI总线愈发显得有心无力。PCI因为是并口,在高速信号传输中,因为信号质量问题,以及信号同步问题,并口解决这些问题的成本高,难以为继。在这个时候,PCI的替代者PCIe出现了。
2024-03-01 19:28:37 945
原创 NVMe开发——MTBF介绍
NVM存储器的失效率是如何评估的呢?阿伦尼乌斯公式如何得来的?半导体加速因子又是如何计算的?MTFS计算公式又是如何推导出来的?
2024-02-26 18:12:58 993
原创 GCC工具链简介
想编译各种嵌入式裸机的,想编译Linux Kernel,又或者想编译u-boot的,或者想编译运行在KylinOS上,甚至想编译运行在Android上的C代码,该选择哪个gcc版本呢?MinGW和gcc什么关系?ARM下几种gcc有什么区别?RISC-V内核又该如何选择GCC工具链呢?gcc不同版本的头文件、动态库等兼容性如何呢?选择了正确的gcc版本,又是如何编译安装呢?下载arm gcc时,经常会遇到Linaro,那么Linaro与arm、gcc是什么关系呢?gdb-multiarch?
2024-02-26 17:49:55 981
原创 QEMU开发入门
QEMU开发,对于分析Linux内核帮助非常多。目前电脑上的手机模拟器、还有各种虚拟机技术也基本都是基于qemu进行扩展开发的。文章得比较详细,并提供包括固件和qemu的完整测试代码:1. Windows、Linux下的编译、安装qemu。2. 基于qemu,用VSCode单步调试单片机系统的Cortex-m、RISC-V固件代码。3. 基于qemu,用VSCode单步调试Linux Kernel代码。4. 扩展qemu,给RISC-V添加了一个自定义的uart设备,并演示如何在固件中使用这个uart来输出
2024-02-23 18:55:33 1248
原创 适用于嵌入式单片机的压缩算法
不同的压缩算法,有不同的应用场景。1. 高压缩率,压缩速度慢,但是解压速度快的算法,适用于Bootloader。高压缩率,可以节省ROM空间,高解压速度对Boot速度影响小。因为是外部工具压缩,压缩速度不影响Bootloader的功能。适用于此场景的压缩算法有lzo、lz4hc。2. 追求压缩率,且算力和内存资源充足,并且压缩和解压均不错的算法,选择DEFLATE。3. 有一定的压缩率(50%),追求压缩和解压速度,且算法相对简单,优先LZ4,再选择LZ77,再先LZO.
2024-02-03 17:49:40 3939
原创 ext4文件系统解析
写文件操作时,除了更新Data区处,还会相应更新GDT、Inode Bitmap、Block Bitmap、目录区、Inode Table区。● 针对小于480MB的文件,GDT、目录区、Inode Bitmap,更新较少。Block Bitmap会不停记录使用了的Block,更新较多,Inode Table会不停记录已经使用了的Block数,也更新较多。● 针对超过480MB的文件,尤其是更大的文件,其会启用extent子节点表。
2024-02-01 17:33:40 1485
原创 NTFS文件系统解析
MFT表项记录着文件的相关属性,有常驻属性(比较小),有非常驻属性(数据较大,此属性只记录真实数据的索引)。Bitmap和LogFile一般都超过1K,都是记录在MFT的非常驻DATA属性中。MFT表项由MFT_HEADER+多个属性项构成。NTFS文件写操作过程中,最常修改的文件系统内容分别为:MFT、Bitmap、LogFile,其次是DBR区的一些其他元文件如MFTMirror和MFTMirror和MFTMirror和AttrDef等。
2024-02-01 16:51:01 929
原创 MSVC++远程调试
MSVC++的调试功能非常强大,可以下断点,单步调试,查看堆栈变量信息等。实际用于生产的电脑环境复杂,更容易发生Bug。生产电脑,由于各种原因有些可能无法安装MSVC用来现场调试。基于打印日志,查看日志的方式来分析,一些简单的问题可以解决,但是一些复杂的问题,尤其是语法问题,还是在线调试更方便。针对上述情形,跨电脑的远程调试就出现了,完美解决上述问题。远程调试,一台生产电脑,一台开发电脑,共同接入一个局域网。开发电脑远程连接生产电脑,然后就像调试本地程序一样调试运行于生产电脑上的程序。
2024-02-01 16:03:04 762
原创 C++20新语法
在C++20标准中,允许Lambda表达式使用 [=, this] 这样的语法进行捕获。这种语法称为“复合捕获”(compound capture),表示同时对this指针和所有父作用域的自动变量进行值捕获。具体来说,当我们使用 [=, this] 进行复合捕获时,Lambda表达式会自动捕获当前对象的this指针,并以值的方式复制到Lambda表达式的闭包中。与此同时,Lambda表达式还将自动捕获所有父作用域中的自动变量,并以值的方式复制到闭包中。
2024-01-31 19:10:37 1086
翻译 本周小贴士#218:用FTADLE设计扩展点
这篇翻译讲述了在C++中关于扩展点机制的设计问题以及引入FTADLE(Friend Template with ADL Extension)模式来解决这些问题。文章首先提到了一些常见的扩展点机制,如虚函数、成员函数检查和模板特化,并指出它们各自存在的问题和局限性。接下来,文章详细介绍了FTADLE模式的设计原理和优势。通过使用友元函数模板和ADL(Argument-Dependent Lookup)机制,FTADLE模式可以实现可扩展性、灵活性和低耦合度。它能够避免类层次结构的僵硬性和对用户的依赖,同时
2023-12-01 22:00:00 99
翻译 本周小贴士 #215:使用AbslStringify()将自定义类型转换为字符串
Abseil现在包含一个新的轻量级机制,AbslStringify(),允许用户将用户定义的类型格式化为字符串。使用AbslStringify()扩展的用户定义类型可以与absl::StrFormat、absl::StrCat和absl::Substitute无缝配合使用。与大多数类型扩展一样,您应该拥有要扩展的类型。
2023-11-16 19:11:45 156
原创 Python编程——模块、包和__init__.py
Python中的一个文件即为一个模块(Module),一个模块引用另外一个模块的变量、函数或类时,使用import来导入。模块名即文件名。如fibo.py那么在main.py文件中如下使用fibo模块。或者直接导出指定函数,此方法可能导致同名函数被覆盖导致代码异常。
2023-11-10 18:50:32 604
翻译 本周小贴士#198:标签类型
作为TotW#198最初发表于2021年8月12日由Alex Konradi创作Foo既不可移动也不可复制,但它是可构造的,例如Foo f(1, 2);。这很棒,但是如果std::optional被声明为const,那么我们无法调用emplace()怎么办?等等,std::in_place是什么意思?如果我们查看std::optional的文档,可以看到其中一个重载函数接受std::in_place_t作为第一个参数,以及其他参数的列表。
2023-10-05 17:34:24 92
原创 pytest简明教程
pytest是一款基于Python的测试框架。与Python自带的unittest相比,pytes语法更加简洁,断言更加强大,并且在自动测试以及插件生态上比unittest都要更加强大。
2023-09-22 19:35:02 515
翻译 本周小贴士#188:注意智能指针函数参数
作为TotW#188最初发表于2020年12月10日作者:Krzysztof Kosiński这段代码有什么问题?函数 CanYouPetTheDog 不会影响其 dog 参数的所有权,然而它的函数签名要求将其存储在 std::shared_ptr 中。这样做创建了对特定所有权模型的不必要依赖,尽管函数内部并不需要。这种依赖性阻止调用者使用其他模型,如 std::unique_ptr 或在栈上构造对象。
2023-09-06 19:15:00 102
原创 Windows下打包工具包为一个exe
很多时候,一个工具包有除了一个exe还有不少配置文件及dll库。如果只想给客户发布一个exe,要怎么办呢?使用静态编译,不使用dll,将资源编译到exe中,使用时再释放出来。这种方法比较麻烦,而且需要将资源释放到临时目录,针对一些有安全性的工具,安全性也不够。有没有简单又安全的方法呢?
2023-08-19 10:30:00 622
原创 命令行参数设计
众多通用的小功能,制作为一个小工具,然后通过命令行来进行交互,使用非常的简便。本规范是为了统一命令行参数的设计,使得大家在制作或使用命令行工具时,能够更加有共享,进行会更加方便。
2023-08-16 14:58:23 144
翻译 本周小贴士#187:std::unique_ptr 必须被移动
std::unique_ptr是一个指针,当std::unique_ptr本身被销毁时,它会自动销毁指向的任何对象。它存在的目的是作为类型系统的一部分来传递所有权(销毁资源的责任),并且是C++11中更有价值的新增功能之一。然而,std::unique_ptr经常被过度使用。一个好的检验方法是:如果它从未被std::unique_ptr移动到另一个std::unique_ptr,那么它可能不应该是std::unique_ptr。
2023-07-28 12:11:45 73
翻译 本周小贴士 #186:将函数放在未命名的命名空间中
文件局部函数简化了依赖关系并改善了局部性。非成员函数增加了封装性,简化了类定义,并使依赖关系更加明确。编写函数时,请考虑将其作为文件局部非成员函数,例如将其放在.cc文件的未命名命名空间中。
2023-07-15 17:56:18 59
翻译 本周小贴士#182:初始化你的整形变量
作为TotW#182最初发表于2020年7月23日“在做决定的瞬间,你能做的最好的事情是正确的事情,接下来最好的事情是错误的事情,而你能做的最糟糕的事情就是什么都不做。” ——西奥多·罗斯福C++很容易让变量未初始化,这非常危险,因为几乎对任何未初始化对象的访问都会导致未定义行为。默认初始化是其中一种形式,当变量没有指定初始值时发生,默认初始化并不总是初始化。
2023-06-29 15:46:39 75
原创 C++17新语法及标准库
在C++ 17中,引入了一个新的auto规则来改进直接列表初始化(direct-list-initialization)的行为。在此前,使用auto声明变量并对其进行直接列表初始化时,结果类型通常为std::initializer_list。这意味着该变量只能表示一个具有可复制语义的对象集合,并且很难用于处理其他类型的值。在上面的示例中,我们使用了新的auto规则来声明变量并对其进行直接列表初始化。在第一个示例中,由于列表只包含单个元素,因此结果类型为int。
2023-06-12 18:06:59 4705
翻译 本周小贴士#181:访问 StatusOr<T> 的值
作为TotW#181最初发表于2020年7月9日由Michael Sheely创作当需要访问 absl::StatusOr 对象中的值时,我们应该努力使该访问安全、清晰和高效。注意:本提示试图强调提供典型用例的指导,但并非详尽无遗。如果遇到边缘情况,请考虑本文中的建议和推理,并行使判断力。
2023-06-06 20:38:57 145
翻译 本周小贴士#180:避免悬空引用
与许多编程语言不同,C++缺乏必要的安全检查,以避免引用无效内存(即“悬空引用”)。您可以轻松地对已删除的对象指针进行解引用,或者跟随一个超出作用域的对象引用。即使是类类型也存在这种风险。重要的是,我们正在建立命名约定,围绕名称“view”和“span”表示“这是具有引用语义并可能悬空的对象”。像所有具有引用语义的类型一样,这些类型从不拥有它们指向的基础数据。每当您看到存储这些类型之一的实例时,请注意。
2023-06-01 09:46:02 214
翻译 本周小贴士#177:可赋值性与数据成员类型
作为TotW#177最初发表于2020年4月6日由Titus Winters创作在实现类型时,应先确定类型设计。将API优先于实现细节。这种情况的一个常见例子是类型可赋值性和数据成员的限定符之间的权衡。
2023-05-25 22:06:38 57
翻译 本周小贴士#175:C++14和C++17中字面常量的变化:
C++现在具有一些功能,可以使数字字面常量更易读。整型字面常量现在可以用二进制(0b00101010)表示,之前只支持十进制(42)、十六进制(0x2A)和八进制(052)。单引号(')可以作为数字分隔符,可以用来分组任何进制的数字字面常量(0xDEAD’C0DE)。浮点型字面常量可以用十六进制表示(0x2A0p-4)。
2023-05-16 21:43:38 135
翻译 本周小贴士#173:将参数包装在Option结构中
作为TotW#173最初发表于2019年12月19日由John Bandela创作它来了,没有包裹,盒子或袋子。他疑惑不解,一直疑惑到他的脑筋疼痛了——Dr. Seuss。
2023-05-05 21:47:43 59
翻译 本周小贴士#172:指定初始化器
作为TotW#171最初发表于2019年12月11日由Aaron Jacobs创作指定初始化器是 C++20 标准草案中的一种语法,用于以紧凑但易读且易维护的方式指定结构体的内容。除了语法更简洁之外,指定初始化器可在更多的上下文中使用。
2023-04-23 12:48:32 110
翻译 本周小贴士#171: 避免标志值
作为TotW#171最初发表于2019年11月8日由Hyrum Wright创作标志值是在特定上下文中具有特殊意义的值。除了-5外,int类型的每一个值都被记录为AccountBalance的有效返回值。直觉上,这感觉有点奇怪:调用方只应该检查-5特别吗?任何负数值是否可靠地表示“账户关闭”?当系统支持负余额并且需要调整API以返回负值时会发生什么?使用标志值会增加调用代码的复杂性。
2023-04-19 22:21:48 63
A Beginner's Guide to SSD Firmware
2024-01-17
JEDEC JESD22-A117E:2018 电可擦除可编程 ROM (EEPROM)
2022-12-13
UNH-IOL-NVMe-MI-Conformance-Test-Suite-v15.0
2022-12-05
VS2010单元测试的coverage文件转换为xml文件源代码
2022-05-19
apt-get安装包f
2022-05-13
System Verilog.zip
2021-12-21
protobuf-3.0.0-alpha-2.zip
2021-12-15
TestProperyGrid.zip
2021-12-15
TinyCC的VS2010编译工程
2021-04-28
基于 Visual studio 和虚拟机的驱动调试.pdf
2020-08-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人