自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

唐顺才的博客

后端开发技术探讨:linux、c/c++/qt/golang、存储/即时通讯工具/智能硬件

  • 博客(256)
  • 资源 (1)
  • 收藏
  • 关注

原创 linux kernel源码解析之:smp系统cpu热插拔

本文分析了SMP系统中CPU热插拔流程及per-cpu slab无锁缓存机制。通过流程图展示了CPU热插拔过程,并详细解析了slab缓存的构建与析构代码实现,包括slab元数据管理和object数组回收机制。重点阐述了无锁设计在per-cpu缓存中的运用,通过多幅代码截图展示了关键数据结构的操作流程。该机制有效提升了多核环境下的内存分配性能,同时保证了CPU动态调整时的缓存一致性。

2025-12-20 11:02:41 24

原创 linux字符设备驱动

摘要:该代码实现了一个Linux字符设备驱动memdev,包含设备初始化、读写操作等功能。通过register_chrdev_region或alloc_chrdev_region分配设备号,使用cdev_init和cdev_add注册字符设备,并创建4KB的内存缓冲区。实现了open/release/read/write/llseek等文件操作接口,支持用户空间与内核空间的数据拷贝。最后通过class_create创建设备类,为udev/mdev自动创建设备节点提供支持。

2025-11-28 13:43:07 33

原创 linux kernel之proc文件系统源码解析

本文对比了新旧Linux内核中proc文件系统的数据结构差异,通过图示直观展示了架构变化。同时解析了老版本内核proc文件系统的实现源码,揭示其内部工作机制。两幅配图分别呈现了数据结构对比和源码实现细节,为理解proc文件系统的演进提供了可视化参考。

2025-11-25 16:22:52 43

原创 如何解释c指针?

本文阐明了指针的本质是编译器/链接器的抽象概念,而非CPU直接使用的机制。通过C代码示例和伪汇编分析表明:指针本质上是指导编译器生成多级寻址代码的标记——每增加一个指针层级(),编译器就自动补充一次寻址操作。CPU执行时只处理地址和数据总线上的具体数值,通过逐步访问内存地址链(如0x1000→0x2000→0x3000)最终到达目标数据。无论是读写变量还是多级指针,CPU的底层操作流程完全一致,区别仅在于编译器根据指针层级生成的寻址次数不同(0级变量1次寻址,每多1个增加1次寻址)。这揭示了高级语言指针与机

2025-11-12 10:21:53 44

原创 linux kernel mmu机制设计原理剖析

上图:

2025-11-07 18:53:24 144

原创 linux module机制

Linux内核模块文件(ko文件)是动态扩展内核功能的二进制文件,采用ELF格式存储模块代码和数据。ko文件包含关键节区如.text(代码)、.data(变量)和.modinfo(元数据)。其生成过程经过预处理、编译、汇编和链接阶段,其中链接阶段处理内核符号引用和版本控制。加载ko文件时,系统会进行签名验证、内存分配、符号解析,最后执行初始化函数完成模块激活。这种机制实现了内核功能的动态扩展和"即插即用"特性。

2025-10-30 12:15:54 66

原创 linux 大文件直接IO带来的性能提升

摘要: 通过对比常规IO与直接IO(O_DIRECT)的性能测试发现,对于大文件连续读写,绕过page buffer的直接IO显著提升速度。测试显示,10MB文件直接IO速度达8123MB/s,远超常规IO的683MB/s;500MB文件直接IO速度达8245MB/s,而常规IO仅640MB/s。直接IO通过内存对齐分配和磁盘扇区(512B)直接访问,避免了page buffer的中间处理,尤其适合确定的大文件操作。代码使用posix_memalign确保内存对齐,并对比了不同规模文件的写入效率。

2025-10-23 15:21:06 56

原创 《linux kernel 进程加载器、进程调度器源码解析》

本文分析了Linux内核中进程加载器的实现机制,以传统a.out格式为例,探讨了执行./a.out时内核如何加载程序的过程。文章详细介绍了a.out文件结构,包括代码段、数据段、BSS段等布局,并对比了现代ELF格式。同时解析了task_struct数据结构中关键字段,如内存管理边界、进程标识、权限机制(uid/euid/suid)等。通过分析内核加载可执行文件的流程,揭示了从文件系统到进程创建的系统内部工作原理,特别关注了权限切换和资源继承机制。

2025-10-10 14:34:02 768

原创 从linux0.11再探minix文件系统设计原理

之前分析过fatfs32文件系统的设计原理,顺带探讨了ext2这种使用多级bitmap级联的文件系统设计原理。本文,将会以linux kernel 0.11为基础,全面分析minix 1.0文件系统的设计原理。代码需要跳来跳去,用顺序的文字比较难描述清楚,后面再说。

2025-09-28 15:21:32 508

原创 嵌入式带屏幕设备(单片机 + lvgl,或linux + soc + qt),纯c代码生成二维码图片

二维码是一种图片编码的文件格式,文件格式比较复杂。对于android、qt、web都比较容易实现二维码,有原生或第三方的库。但是对于单片机开发,可以借助开源轻量级库来实现二维码生成。例子虽然是linux,但是是纯c,因此可以很容易编译进单片机项目中,再调用gui库例如lvgl、emwin,即可实现二维码图片的显示。

2025-09-28 10:19:02 413

原创 从RTC时钟问题,引入CAS无锁化

本文通过实验室加锁的类比,解释了CAS(Compare-And-Swap)无锁技术的原理和优势。传统加锁方式会带来额外开销,而CAS通过"君子约定"和状态检测实现了无锁并发控制。文章提供了两个Go语言示例:1)使用atomic包实现的无锁计数器,10个goroutine各递增100万次;2)基于指针原子操作实现的无锁队列,详细展示了Enqueue和Dequeue的CAS操作流程。这些实现避免了锁竞争带来的性能损耗,通过重试机制保证线程安全,适用于高并发场景。

2025-09-25 15:22:01 573

原创 RTC时钟芯片读取时间不准?以为是RTC芯片或晶振的问题?

摘要:RTC时钟芯片读取存在时间误差问题,常见原因是程序员未正确处理时间进位。典型错误代码直接读取各时间寄存器,可能在读取过程中发生进位导致数据不一致。Linux内核采用双重读取机制:先完整读取时间数据,再验证秒值是否变化,若变化则重新读取,确保获取同一时间点的一致性数据。这种原子性操作避免了因进位导致的时间读取错误,解决了小概率但量产致命的时间误差问题。

2025-09-25 14:31:15 371

原创 从二极管到Ai大模型,需要走过去的路线

2025-09-05 16:49:05 169

原创 定时器设计之->分级时间轮

文章摘要:介绍了定时器的多种实现方案,包括Linux定时器API、编程语言级定时器、红黑树和时间轮等,重点分析了分级时间轮模型。通过Go语言代码展示了时间轮的具体实现,包含任务创建、取消、层级迁移等核心功能。时间轮采用环形双向链表结构,支持多级扩展,适用于不同规模的定时任务场景(从200到10万级),具有动态修改和精确调度的特点。代码实现了任务取消、多级时间轮协作等关键机制,并提供了性能监控接口。

2025-09-01 18:41:47 443

原创 论,物联网日志系统架构如何设计?

本文描述了一个物联网日志系统的双引擎存储架构。系统采用MongoDB存储用户行为日志、设备元数据和用户配置,使用Elasticsearch存储应用系统日志和设备状态数据。架构包含设备层(4G终端和执行器)、通信层(MQTT服务)、服务层(REST API和日志服务)、数据存储层(MongoDB分片集群和Elasticsearch集群)以及分析层(Kibana和Grafana)。MongoDB采用分片副本集群架构,包含多个分片副本集和配置服务器,通过mongos路由器处理客户端请求。该设计实现了设备数据采集、

2025-08-14 13:54:18 397

原创 nordic通过j-link rtt viewer打印日志

在Nordic新版本的sdk里面已经默认继承了rtt功能的代码。

2025-08-05 23:08:15 311

原创 esp32 挂载mpu6050实现加速度计

使用Nordic uart service传输数据给app。

2025-07-24 23:15:52 324

原创 编译器自举过程……

2025-07-08 19:45:01 175

原创 arm代码->汇编代码->机器码->cpu执行过程剖析

以2个整数相加为例子。

2025-07-01 14:26:42 169

原创 linux c实现协程

makecontext(ucontext_t *ucp, void (*func)(), int argc, …swapcontext(ucontext_t *oucp, const ucontext_t *ucp):保存当前上下文到 oucp,然后恢复 ucp 上下文。setcontext(const ucontext_t *ucp):恢复 ucp 所保存的上下文并继续执行。getcontext(ucontext_t *ucp):获取当前执行上下文并存储到 ucp 中。

2025-07-01 11:07:35 532 1

原创 hex、json、cbor、protobuf编码压缩率对比

protobuf: 1.2倍长度 适用于网络游戏,坏处是强耦合性(app和服务器需要随时保持同步,同过.proto文件存储位置元数据)json解析时是通过特殊符号," ’ { } [] 的匹配,来确定key:value,是位置无关编码,可读性最强,但是特殊符合过多。坏处是json序列化之后的数据长度,是十六进制t l v格式的3~4倍。在嵌入式行业,有大量的工程师在使用header type value value crc这种十六进制的编码协议。这种协议的好处是数据紧凑,数据量小。

2025-06-13 15:18:28 505

原创 LRU 和 DiskLRU实现相册缓存器

我是写Linux后端的(golang、c++、py),缓存算法指的是内存里面的lru,没有用内存lru与disklru结合的场景需求。近段时间研究android开发,里面有一些设计思想值得后端学习。经过缓存的图片从内存或文件加载,速度快了很多。为了简化测试,用Python编程语言实现。看到了android开发里面的一个片段。

2025-06-06 19:46:18 730

原创 PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别

rx是响应式编程框架的集大成者,相当于应用内部的轻量级的ASMQ(高级消息队列),前端是ui和逻辑分离的特点,需要大量的数据双向多层传递。用rx可以从出发点直达终点,数据不需要层层传递,比如说原来的传递路径是6层,你修改一次数据类,你就需要修改6个地方的代码,用rx只需要修改前后紧挨着的2个数据管道之间的代码。中最新的元素发送出来(如果不存在最新的元素,就发出默认元素)。,有的只会将最新的 n 个元素发送给观察者,有的只会将限制时间段内最新的元素发送给观察者。只关心最终结果的场景(如计算完成后的结果)。

2025-06-05 11:56:38 1039

原创 android与Qt类比

通过这种类比,可快速将 Android 的列表开发思维迁移到 Qt 的模型 - 视图体系中,核心差异在于 Qt 的模型与视图解耦更彻底,数据操作通过索引间接完成,而 Android 的 Adapter 直接管理视图单元的创建和绑定。

2025-06-04 10:59:11 519

原创 golang 柯里化(Currying)

使用场景:参数在语义上属于不同组,Go 语法无法在单次调用中声明多组可变参数,通过柯里化可以实现分步接收参数。有的参数是在不同时间段产生,使用Currying可以让函数记住(缓存)参数,避免应用代码去手工管理缓存的参数。

2025-05-28 14:21:33 420

原创 双重检查锁定(Double-Checked Locking)机制

线程 A 释放锁,线程 B 获得锁,进入同步块后发现 instance 已经被创建,不执行实例化操作。线程 A 和 B 都通过了第一次 instance == null 检查,进入同步块前。线程 A 先获得锁,进入同步块,再次检查 instance == null,创建实例。后续所有线程都不会进入同步块,直接返回已创建的实例。

2025-05-24 11:33:13 230

原创 fatfs文件系统设计原理

3)应用层,与进程结合的文件(每个进程有一个数组,存放打开的文件列表)2)内存里面,与操作系统结合的文件接口vfs、存储驱动接口。1)磁盘里面,带格式的文件。

2025-04-25 14:40:21 370

原创 microPython(合宇ESP32-C3开发板)实现24c02的跨页写入、读取

esp32-c3 使用microPython实现at24c02的单字节写、单字节读、连续写(跨页)、连续读(跨页)

2025-03-25 16:19:05 379

原创 github提交不上去,网络超时问题解决

编辑hosts文件,不存在则创建,不要带任何缀名,文件名就叫hosts,可以用git bash命令创建文件:touch hosts。DNS服务器数据不同步,github的服务器发送迁移,在本地缓存的ip地址现在无效了。按照上述操作之后,git push就正常了。

2024-12-31 17:44:45 967

原创 golang自定义MarshalJSON、UnmarshalJSON 原理和技巧

当一个类型实现了encoding/json包中的json.Marshaler接口的MarshalJSON方法时,json.Marshal函数就会调用这个自定义的MarshalJSON方法来进行 JSON 序列化。好的解决办法是:限定拷贝的数据范围,将需要特殊处理的时间戳,单独封装在一个结构体里面。但是引入了新的问题: 对象多拷贝一次,当数据量比较大,api调用比较频繁的时候,浪费cpu时间。问题出现的原因:在前后端分离的项目中,经常出现的问题是时间戳格式的问题。前端由于各种原因,日期格式不完善。

2024-12-21 15:23:33 962 2

原创 《国产单片机,soc的一些现实问题》

在一堆芯片面前,八九不离十,盯着价格最低的那个芯片就不走了,就像一只饥肠辘辘的狗,看到了一块肉。不是电子信息专业的,去搞嵌入式,就会盯着某个芯片、元器件的价格死磕到底,导致研发失败,或用其他地方十几倍的潜在成本,来弥补老板节省下的那一个物料的成本。做嵌入式,是一个系统性的工作,你的成本构成由:采购、研发、测试、销售、售后、机会成本。很多老板,pm,认知水平之低,目光之肤浅,令人发指难以想象,这些吊毛是怎么混到现在的。当然,stm32也不是完全ok,曾经也出现过iic问题,某款芯片功耗大的问题。

2024-12-17 10:00:40 772

原创 android studio 模拟器不能联网?

在下一次关机之前,android studio里面的模拟器就可以上网了。.关闭所有AVD设备实例。

2024-12-10 14:13:11 1285 1

原创 linux c串口应用编程,参照golang里面的json.Marshal/json.Unmarshal

protocol.c 代码,实现二进制流序列化、反序列化。

2024-11-29 09:39:22 430 1

原创 普通单向有头链表,用于内存资源受限,不带mmu的单片机

【代码】普通单向有头链表,用于内存资源受限,不带mmu的单片机。

2024-11-29 09:31:46 374

原创 《设计一款蓝牙热敏打印机》

安卓apk用java + kotlin编写、上位机用Qt编写。主控芯片用易兆威蓝牙ic,通讯接口:蓝牙、串口、usb。

2024-05-06 10:37:06 628 1

原创 Android Studio控制台输出中文乱码问题

1.找到studio的安装目录下的studio64.exe.vmoptions启动配置文件;2.打开文件,最后一行添加 -Dfile.encoding=UTF-8;3.重启android studio;

2024-03-28 21:40:23 3439 2

原创 安卓app之--计算器

写了一款安卓计算器,不是很完善但是能用。

2024-03-16 11:36:35 649

原创 《一个电子工程师的12年》

redis、mysql、sqlite、kafka、zeromq、mongodb、http/https、rest api、mqtt、thread pool、go routine等等,陷入了复杂重复的循环中,中间,我见过形形色色的人,有的很傻,有的很自私,有的很狭隘,有的很极端,有的很要面子,有的很无耻,有的很卑鄙,有的人能当着你的面出尔反尔,这些人的所作所为有适合能惊掉你的下巴……2012年专科毕业,单片机没有学会,keil也不熟悉,protel 99se不熟悉,烙铁不熟悉,就突然毕业了。

2024-02-29 00:06:40 230

原创 boost正负压电路设计和原理分析

如图所示,为模拟电子电路中的Boost电路,可同时提供正压、负压。虽经打板实测,但不可用于商业目的,否则后果自负。

2024-02-04 14:27:23 2123

原创 多谐振荡电路分析

图片源自b站,红色注释为通过微信截图添加,原理应该分析的比较清晰。multisim仿真文件暂不提供。

2024-02-04 14:23:48 564

Red_Hat_Gluster_Storage-3.5-Administration_Guide-en-US.pdf

gluster 运维手册(482页英文原版文档)

2021-01-29

空空如也

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

TA关注的人

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