自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 C/C++柔性数组

柔性数组允许你在一个结构体的末尾定义一个没有指定大小的数组。这个数组的大小可以在运行时动态确定。int length;// ... 其他成员 ...// 柔性数组成员data[]也可以写成data[0](某些老编译器可能只支持这种形式,但 C99 标准推荐使用[]柔性数组是 C 语言中一种非常优雅和高效地处理可变长结构体的方法。它通过将元数据和实际数据存储在单块连续内存中,带来了性能提升和管理便利。

2025-09-18 16:20:12 654

原创 内存页和TLB缓存

摘要: 内存页是操作系统管理内存的最小单位(通常4KB),用于虚拟内存映射和进程隔离。TLB是CPU内部的硬件缓存,用于加速虚拟地址到物理地址的转换,减少访问主存页表的开销。内存页支持高效内存管理(如共享、按需加载),而TLB通过缓存常用地址映射提升性能,其命中率显著影响程序速度。两者协同工作,优化现代计算机的内存访问效率。

2025-08-29 10:01:01 571

原创 子进程、父进程、僵尸进程和孤儿进程

本文介绍了操作系统中父进程、子进程、孤儿进程和僵尸进程的核心概念及相互关系。父进程通过fork()创建子进程,子进程继承父进程资源并独立运行。僵尸进程是已终止但未被父进程回收的子进程,会占用系统资源;孤儿进程是父进程终止后仍在运行的子进程,会被init进程自动回收。文章通过比喻和对比表格清晰解释了这些概念,并提供了防止僵尸进程和孤儿进程的策略,如父进程调用wait()或捕获SIGCHLD信号,以及正确处理子进程终止后的资源回收。

2025-08-29 09:54:16 1005

原创 C/C++ 指针与函数

技术优点缺点适用场景返回值指针灵活易产生悬挂指针一般不推荐动态内存控制生命周期需手动管理内存需要长期存在的数据静态变量简单安全全局状态,线程不安全单线程简单场景参数传递最安全需要预先定义变量推荐使用函数指针实现回调语法复杂策略模式、回调机制推荐优先使用参数传递和直接返回值的方式,避免不必要的指针操作。

2025-08-25 17:02:31 375

原创 文件IO和标准IO

文件I/O与标准I/O是两种不同的输入输出机制。文件I/O(Unbuffered I/O)是操作系统提供的底层无缓冲接口,通过文件描述符操作,实时性强但效率较低;标准I/O(Buffered I/O)是C标准库提供的高级带缓冲接口,通过文件指针操作,利用缓冲区减少系统调用,效率更高但实时性较差。标准I/O适合大多数普通文件操作,而文件I/O适用于需要精细控制或实时性要求的场景。两者可通过fdopen()和fileno()相互转换。

2025-08-25 09:47:10 768

原创 串行通信协议(UART、I2C、SPI)

文章摘要: 本文介绍了三种常见的串行通信协议(UART、I2C、SPI)及其工作原理。重点解析了I2C协议的地址读写位规则、上拉电阻的必要性以及SCL/SDA的时序配合机制。通过Arduino与电脑的UART通信实例,展示了串口在设备间数据交换中的应用,包括硬件连接方式和软件实现代码。这些通信协议作为微控制器与外设交互的"语言",在嵌入式系统中扮演着重要角色。文章还对比了串行与并行通信的优缺点,解释了现代系统更倾向于使用高速串行通信的原因。

2025-08-23 14:13:33 760

原创 进程间通信

本文介绍了操作系统中的进程间通信(IPC)机制。首先解释操作系统作为管理硬件和软件资源的系统软件角色,以及进程与线程的区别。重点阐述了6种主流IPC方式:管道(Pipe)、消息队列(Message Queue)、共享内存(Shared Memory)、信号量(Semaphore)、信号(Signal)和套接字(Socket),分析其原理、特点及适用场景。通过对比表格直观展示各机制差异,并给出选择建议,如共享内存+信号量的高性能组合。最后提供了匿名管道的C++代码示例,展示父子进程通过管道通信的实现过程。线程

2025-08-22 20:47:50 993

原创 虚拟内存与物理内存的映射关系

页 (Page)是虚拟内存的单位。页框 (Page Frame)是物理内存的单位。页表 (Page Table)负责把虚拟页号映射到物理页框号,从而让进程用虚拟地址就能访问到真实的物理内存。虚拟内存和物理内存通过“页表”这个中间数据结构联系起来。页表存储了“虚拟页”到“物理页框”的映射关系。当程序使用虚拟地址访问内存时,CPU中的MMU硬件会自动查阅页表,找到对应的物理地址,从而访问到真正的物理内存。这个过程对应用程序是完全透明的。

2025-08-21 16:22:16 1225

原创 Linux 进程调度

实时进程使用SCHED_FIFO或SCHED_RR策略,拥有最高优先级,总是优先于普通进程运行。普通进程由CFS管理,其核心思想是通过vruntime和红黑树来实现按权重(nice值)公平分配 CPU,同时兼顾响应性和吞吐量。CFS 的成功在于它用简单而优雅的数学模型(公平分配)取代了之前调度器中复杂且容易出错的启发式规则。VIP客人->实时进程-> 必须立刻满足。大厅客人->普通进程-> 要讲公平。厨师换锅->上下文切换-> 有开销。愚蠢策略->FIFO, SJF-> 会导致有人饿死。

2025-08-20 20:34:01 776

原创 Buildroot(二)

Buildroot构建嵌入式Linux系统的固件通常包含以下核心组件:Bootloader(如U-Boot)、Linux内核(zImage/uImage)、设备树文件(.dtb)和根文件系统(rootfs.ext4等)。这些组件按特定布局打包,如Bootloader位于存储介质起始位置,内核紧随其后。Buildroot通过工具(如genimage)按照配置文件将这些组件整合为最终镜像(如sdcard.img)。具体组成和布局由目标硬件和Buildroot配置决定。

2025-08-11 22:37:19 531

原创 Buildroot(一)

Buildroot│├── 编译 U-Boot → 提供 bootloader├── 编译 Linux 内核 → 提供 OS 核心├── 编译设备树(DTS → DTB)→ 描述硬件└── 生成根文件系统(rootfs)→ 包含用户应用│└── 最终打包成固件(如 sdcard.img)U-Boot加载Linux 内核设备树。Linux 内核使用设备树初始化硬件,并挂载rootfs。用户应用运行在 Linux 系统上,通过驱动访问硬件。这样,Buildroot。

2025-08-11 22:36:08 687

原创 解决cursor每次ssh连接远程都要下载vscode-server

摘要:本文介绍了在VS Code中关闭自动更新的方法。首先使用快捷键Ctrl+Shift+P打开命令面板,选择"Open Settings(UI)"进入设置界面;然后在设置中找到更新相关选项,取消勾选所有自动更新功能。通过这两步简单操作,即可禁用VS Code的自动更新功能。

2025-07-07 20:17:34 1100

原创 解决docker pull镜像慢的问题

本文介绍在Ubuntu23.04上优化Docker使用的方法。首先通过修改daemon.json将镜像存储路径设置为/disk5/docker,并解决权限问题;其次配置网络代理加速镜像拉取;最后演示hello-world镜像测试流程。注意事项包括:权限管理(避免频繁使用sudo)、容器退出方式、数据持久化策略(仅-v挂载目录可持久化)以及定期清理未使用资源的方法。文末还提供了磁盘空间监控和权限修复等实用命令。

2025-06-19 11:30:14 481

原创 【C/C++】从源码到执行:程序运行的完整生命周期解析

从代码到运行,计算机通过分层处理将人类可读的指令转化为物理硬件能执行的电平信号。理解这一过程有助于调试程序(如链接错误、符号未定义)和优化性能(如减少编译依赖、选择JIT策略)。C/C++静态库和动态库(共享库)

2025-04-25 17:07:34 1288

原创 TensorFlow

张量是多维数组的泛化。在数学中,张量可以看作是向量和矩阵的高维推广。在机器学习和深度学习中,张量是用于表示数据和模型参数的基本数据结构。标量(0维张量):一个单独的数值,例如 5。向量(1维张量):一维数组,例如 [1,2,3]。矩阵(2维张量):二维数组,例如12341&2\\3&413​24​高维张量:超过二维的数组,例如一个三维张量可以表示为123456781&2\\3&45&6\\7&8​13​24​57​68​​​。

2025-04-09 08:45:11 1198

原创 嵌入式开发领域常见的专业术语及其解释

在嵌入式开发领域一些常见的专业术语及其解释。

2025-02-20 16:50:25 615

原创 RAM和ROM的区别

内存影响的是设备同时运行多个应用程序的能力,而存储则决定了你可以安装多少应用程序以及保存多少个人文件。所以,当手机重启后,手机重启前运行的程序(例如微信聊天界面)会被清除。而图片、聊天记录之类的数据还在。“内存”和“存储”是计算设备中的两个不同概念,它们各自有着不同的功能和用途。

2025-02-14 17:12:15 1289

原创 使用kendryte官方的C SDK 和toolchain 对k210进行开发

那么现在就得到三个文件:kendryte-toolchain、kendryte-standalone-sdk、kendryte-standalone-demo。清空当前build、将demo文件里面的face_detect复制到sdk的src文件夹中、编译face_detect。2、硬件环境:Sipped 的 Maix Ⅰ系列开发板 Maix bit(k210)1、获取的工具链放在/opt 路径下(也可以是其它路径,看自己的习惯)三、获取C Demo (自己根据 c sdk写一个demo也行)

2025-01-03 14:44:44 719 1

原创 MaixBit k210学习记录

唯一需要注意的一点是,如果你使用的是Maix bit开发板(Maix-I K210)的话,最新版本的MaixPy v4 是不支持的,所以克隆仓库的时候不要克隆。想要快速上手还是推荐使用Window+MaixPy IDE或者Linux + MaixPy IDE进行开发,后续再使用c。目标实现:在虚拟机(Ubuntu)中,实现对Maix bit(k210)开发板的开发。以上是关于使用MaixPy IDE对开发板进行开发的方法,使用。

2024-12-28 15:09:08 514 1

原创 NFS和Samba环境搭建及交叉编译指南

Ubuntu 同时作为 Samba 和 NFS 服务器,Windows 作为 Samba 客户端,而嵌入式设备作为 NFS 客户端。这将允许 Windows 用户通过 Samba 访问 Ubuntu 上的数据,同时让嵌入式设备通过 NFS 进行高效的数据交换。

2024-12-27 11:03:21 986

原创 VirtualBox下ubuntu23.04使用主机串口以及使用 minicom 进行串口调试

VirtualBox下ubuntu23.04使用主机串口以及使用 minicom 进行串口调试

2024-12-26 16:20:41 1126

原创 【Linux】使用GTest和CuTest编写测试用例,使用GCOV和LCOV测试代码覆盖率

编译器编译源代码时,将额外的代码注入到目标代码中,这些代码将用于记录每个源代码行被执行的次数。然后,通过运行gcov命令来解析这个文件,并将其与源代码相匹配,生成一个HTML格式的测试报告,显示了每个源代码行被执行的次数、未被执行的代码行以及总体覆盖率等信息。另外,lcov还支持一些高级的功能,例如过滤不需要统计的文件和代码行等,可以根据实际需要进行配置。代码覆盖率测试是一种评估软件测试质量的方法,通过测量测试用例执行时实际覆盖到的源代码的比例,来判断测试的充分性。的文件,其中包含了测试覆盖率的数据。

2024-11-21 14:08:08 1353

原创 虚拟机重装(VirtualBox+Ubuntu23.04)

虚拟机安装、软件安装、硬盘挂载

2024-11-08 16:11:11 1752 1

原创 Anaconda + VSCode 实现项目代码复现(一)(Window环境)

使用Anaconda和VSCode复现项目代码

2024-11-02 08:39:56 2329 6

原创 C/C++静态库和动态库(共享库)

如果一家公司或个人开发者不希望公开他们的源代码(.c 文件),但他们又想让其他人能够使用这些代码的功能,他们可以选择将这些源代码编译成库文件,通常是以静态库(.a 文件)或者共享库(如 .so 或 .dll 文件)的形式发布。

2024-09-11 15:41:15 1629

原创 c/c++ 函数指针、线程和互斥锁

关于指针函数的定义和应用,以及线程和互斥锁的内容

2024-09-11 14:24:23 1249

原创 CMake——GitHub移植项目

第一次从GitHub移植一个项目,浅记录一下(window环境)

2024-07-25 14:01:36 2396

原创 C/C++ 结构体变量和结构体指针的应用(含代码示例)

结构体指针和结构体变量在C或C++编程中都是用来处理结构体数据类型的方式,但它们之间存在一些基本的区别,这些差异影响着它们的应用场景和效率。

2024-06-24 14:53:39 2168

原创 什么是进程?线程?进程栈?线程栈?(小白请进!!!含代码示例和运行结果分析)

栈可以理解为内存的意思,即一个程序在被执行时成为一个进程时,就会拥有一块内存,用于储函数调用时的局部变量、函数参数、返回地址等信息。

2024-06-24 09:03:17 2930

原创 C/C++ 输入和输出函数

在C语言中,输入和输出主要通过标准库中的函数来实现,这些函数定义在stdio.h头文件中。

2024-06-21 11:43:36 869

原创 C/C++ 对文件目录进行操作的常用函数

这些函数构成了在C语言中进行目录操作的基础工具集,可以用于遍历目录、创建/删除目录、改变当前目录以及获取目录或文件的元数据信息等操作。

2024-06-19 16:57:41 1167

原创 C/C++ 操作文件常用的函数

文件操作函数构成了进行文件输入输出(I/O)的基础,在C语言编程中扮演着核心角色。这些函数允许程序读取外部文件的数据、向文件写入数据,以及管理文件的打开、关闭、定位等操作。

2024-06-19 11:58:12 1075

原创 SDK是什么?

SDK与编程语言、操作系统/平台、API、开发工具及开发者资源之间的关系最为密切,共同构成了软件开发的基础架构

2024-06-18 11:24:42 813

原创 C/C++编程:复制整个文件或文件的一半

C/C++编程:复制整个文件或文件的一半

2024-06-03 14:54:25 306

原创 [Linux]cppcheck静态检查代码和valgrind内存泄露动态检查

cppcheck是一个静态代码分析工具,它可以在不运行程序的情况下检查C/C++源代码。Valgrind则是一个动态分析工具,擅长检测内存管理问题,如内存泄漏、访问已释放的内存、不正确的使用malloc/free等。

2024-06-01 17:42:59 1276 1

原创 API是什么

API是“应用程序编程接口”(Application Programming Interface)的缩写,它是一套规则、协议和工具,用于构建软件应用。API定义了不同软件组件之间如何交互,允许开发者更容易地使用某些功能,而无需了解其内部实现细节。通过使用API,开发者可以高效地复用代码、接入外部服务、构建复杂功能,同时保持代码的模块化和可维护性。

2024-06-01 16:07:53 4232 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除