<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[m0_65525149的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/m0_65525149</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; m0_65525149]]></copyright><item><title><![CDATA[RT-Thread定时器内核机制详解]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/160546497</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/160546497</guid><author>m0_65525149</author><pubDate>Mon, 27 Apr 2026 10:23:18 +0800</pubDate><description><![CDATA[RT-Thread的定时器管理系统是一个设计精良的软硬件协同体系。它通过跳表数据结构优化了链表操作效率，通过两种工作模式兼顾了实时性与灵活性，并借助线程内置定时器的巧妙设计，将定时机制与线程调度、IPC通信无缝融合，构成了操作系统时间管理功能的坚实基石。理解其内部机制，对于开发稳定、高效的RT-Thread应用程序至关重要。]]></description><category></category></item><item><title><![CDATA[RT-Thread IPC内核对象源码原理深度解析]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/160443531</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/160443531</guid><author>m0_65525149</author><pubDate>Thu, 23 Apr 2026 15:28:13 +0800</pubDate><description><![CDATA[RT-Thread的IPC内核对象设计精妙地运用了C语言的结构体嵌套来模拟面向对象的继承，形成了清晰的三层体系。作为同步机制的抽象层，通过一个挂起线程链表和配套的挂起/唤醒函数，统一了所有IPC对象的基础行为。信号量和互斥量在此基础上进行特化：信号量专注于计数与同步；互斥量则通过所有权和优先级继承机制，在实现互斥访问的同时，保障了系统的实时性。理解这套继承体系和核心链表操作机制，是掌握RT-Thread IPC乃至整个内核对象管理的关键。]]></description><category></category></item><item><title><![CDATA[RT-Thread线程调度器内核]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/160114821</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/160114821</guid><author>m0_65525149</author><pubDate>Mon, 13 Apr 2026 15:34:31 +0800</pubDate><description><![CDATA[RT-Thread的线程调度器是其实时操作系统的核心，它负责在多个就绪线程中做出仲裁，决定哪个线程获得CPU的执行权。其根本设计目标是确保高优先级任务能够获得及时响应，同时兼顾系统的公平性与确定性。RT-Thread采用 全抢占式优先级调度模型。这意味着，除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外，系统中的其他部分（包括调度器自身）都是可以抢占的。当有比当前线程优先级更高的线程进入就绪状态时，当前线程会立即被换出，CPU资源将被高优先级线程抢占。优先级和时间片。]]></description><category></category></item><item><title><![CDATA[RT-Thread内核对象]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/159766326</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/159766326</guid><author>m0_65525149</author><pubDate>Thu, 02 Apr 2026 16:59:40 +0800</pubDate><description><![CDATA[RT-Thread采用的是的设计思想来管理内核资源。为什么选择对象化设计？在嵌入式实时系统中，资源极其有限，但管理需求却异常复杂。RT-Thread需要同时管理线程、信号量、互斥量、事件、邮箱、消息队列、定时器、内存池、设备驱动等十多种内核设施。如果为每种设施都设计一套独立的管理机制，代码会变得臃肿、难以维护。。这些共性被抽象出来，形成了所有内核对象的"基类"——rt_object。而每种具体对象（如线程、信号量）在这个基类基础上，添加自己特有的属性。与传统函数调用式管理相比，对象化设计有哪些优势？]]></description><category></category></item><item><title><![CDATA[RT-Thread线程]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/159766282</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/159766282</guid><author>m0_65525149</author><pubDate>Thu, 02 Apr 2026 16:58:45 +0800</pubDate><description><![CDATA[RT-Thread线程系统摘要：RT-Thread采用线程控制块(TCB)管理线程，包含线程名称、栈指针、优先级、状态等核心信息。线程栈支持静态分配和动态创建，通过PSP/MSP实现线程栈与中断栈分离。线程具有五种状态（初始、就绪、运行、挂起、关闭），通过调度器进行状态转换。初始化时需设置入口函数、参数、栈空间及优先级，并初始化内部定时器。静态线程通过_rt_thread_init()函数完成初始化，配置栈空间和硬件相关寄存器。]]></description><category></category></item><item><title><![CDATA[RT-Thread UART驱动]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/158961600</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/158961600</guid><author>m0_65525149</author><pubDate>Thu, 12 Mar 2026 10:02:04 +0800</pubDate><description><![CDATA[RT-Thread提供了一套统一的I/O设备模型，UART作为字符设备被纳入该框架管理。应用程序通过设备管理层提供的标准接口访问底层硬件，这使得驱动与应用解耦，提高了可移植性。关键数据结构与流程：在QEMU vexpress-a9 BSP中，UART设备通常已被模拟并集成在BSP的驱动层。我们的重点在于理解驱动如何注册以及应用如何对接。UART设备名

在board.c中连接FinSh Shell



四、 工作模式与应用层操作模式




概念
含义
谁来决定？
常见配置




硬件工作模式
驱动底层]]></description><category></category></item><item><title><![CDATA[RT-Thread 设备模型]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/158844494</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/158844494</guid><author>m0_65525149</author><pubDate>Mon, 09 Mar 2026 14:56:29 +0800</pubDate><description><![CDATA[rt_device 继承自 rt_object，这意味着它具备内核对象的基本特性（如名称、类型、链表节点等），可以被内核统一管理。]]></description><category></category></item><item><title><![CDATA[QEMU RTT记录]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/158844160</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/158844160</guid><author>m0_65525149</author><pubDate>Mon, 09 Mar 2026 14:55:16 +0800</pubDate><description><![CDATA[在无实板环境下，通过 qemu 仿真，系统性学习 RT-Thread 的设备驱动框架，逐步实现伪设备、UART、SPI/I2C、GPIO/PWM/定时器等驱动，并能进行调试与验证。熟悉 C 语言、Make/CMake 构建流程，了解 RT-Thread 的初始化流程。具备 qemu 的基本使用能力，能看到 RT-Thread shell 的输出。RT-Thread 源码和 qemu BSP 已可编译通过。学习笔记、可执行的驱动骨架、测试用例、调试清单。]]></description><category></category></item><item><title><![CDATA[QT应用开发学习（QT项目实战（仿写串口助手））]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/131879749</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/131879749</guid><author>m0_65525149</author><pubDate>Sun, 23 Jul 2023 16:36:17 +0800</pubDate><description><![CDATA[我也是在b站学习的QT，之前学习了C++的基础知识，那么在QT中就能够很好的运用出来了，并且本人之前有学习过安卓，对GUI开发比较熟练，所以如果觉得自己基础不好的可以先看看C++的知识。本文直接粘贴全部代码并逐步讲解。1.在你的类中声明自定义槽函数。槽函数是普通的成员函数，但在声明时需要使用slots关键字进行修饰。例如Q_OBJECT2.在类的实现文件（.cpp）中定义槽函数。你可以像编写普通成员函数一样来实现自定义的槽函数。// 这里编写槽函数的具体实现逻辑 // ... }]]></description><category></category></item><item><title><![CDATA[QT应用开发学习（C++进阶知识学习）]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/131831501</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/131831501</guid><author>m0_65525149</author><pubDate>Thu, 20 Jul 2023 16:19:38 +0800</pubDate><description><![CDATA[/ 类体：由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字，ClassName为类的名字，{}中为类的主体，注意类定义结束时后面分号。类中的元素称为类的成员：类中的数据称为类的属性或者成员变量;类中的函数称为类的方法或者成员函数。1.声明和定义全部放在类体中声明和定义全部放在类体中，需要注意：成员函数如果在类中定义，编译器可能会将其当成内联函数处理_age = age;int _age;2. 声明放在.h文件中，类的定义放在.cpp文件中。]]></description><category></category></item><item><title><![CDATA[QT应用开发学习（C++基础入门知识）]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/131830353</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/131830353</guid><author>m0_65525149</author><pubDate>Thu, 20 Jul 2023 15:15:06 +0800</pubDate><description><![CDATA[定义命名空间，需要使用到namespace关键字，后面跟命名空间的名字，然后接一对{}即可，{}中即为命名空间的成员。1. 命名空间的普通定义 //1. 普通的命名空间，里面可以定义变量，也可以定义函数 namespace xjt {} } 2. 命名空间可以嵌套 //2.命名空间可以嵌套 namespace xjt {int a = 0;} } } 3. 同一个工程中允许存在多个相同名称的命名空间 , 编译器最后会合成同一个命名空间中。int a = 3;int b = 1;]]></description><category></category></item><item><title><![CDATA[QT应用开发学习（1.学习知识汇总）]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/131738964</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/131738964</guid><author>m0_65525149</author><pubDate>Thu, 20 Jul 2023 14:43:36 +0800</pubDate><description><![CDATA[本文是记录学习QT知识的过程，如有错误，请提出批评指正！！！]]></description><category></category></item><item><title><![CDATA[嵌入式Linux应用_学习笔记(6:多进程和多线程)]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/131306532</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/131306532</guid><author>m0_65525149</author><pubDate>Tue, 20 Jun 2023 17:31:52 +0800</pubDate><description><![CDATA[这一章主要学习的是Linux下的多进程和多线程，并会学习到多进程间的通信方式(无名管道，有名管道，共享内存，消息队列，socket通信，信号量灯)。进程和线程都会从创建到使用到删除学习，主要学习的还是API的调用以及通信机制的理解。多进程是指在操作系统中同时运行多个进程。每个进程都是独立的，都有自己的内存空间，可以执行自己的指令，与其他进程相互独立。在Linux中，多进程是非常常见的应用场景。许多 Linux 应用程序都是多进程的，例如 Web 服务器、数据库服务等等。]]></description><category></category></item><item><title><![CDATA[嵌入式Linux应用_学习笔记(5:网络编程TCP和UDP)]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/131260946</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/131260946</guid><author>m0_65525149</author><pubDate>Sat, 17 Jun 2023 17:14:27 +0800</pubDate><description><![CDATA[这一章主要是是记录一下TCP和UDP的概念和在LInux下的编程函数。这个函数使用来创建一个套接字，但是这个套接字并没有具体有用的消息，需要后续的bind绑定。参数介绍domain网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等)，AF_UNIX只能够用于单一的Unix 系统进程间通信，而AF_INET是针对Internet的，因而可以允许远程通信使用。type。]]></description><category></category></item><item><title><![CDATA[嵌入式Linux应用_学习笔记(4:输入系统应用编程)]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/131214355</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/131214355</guid><author>m0_65525149</author><pubDate>Thu, 15 Jun 2023 12:09:00 +0800</pubDate><description><![CDATA[我们这一章主要学习如何编写代码来读取外部的输入设备在Linux下，输入系统是指用于接收和处理用户输入设备（比如键盘、鼠标等）输入的软件系统。输入系统通常由以下几个组件构成：1.内核输入子系统：负责驱动硬件设备，并将输入事件转换为内核中的事件结构体，发出一个内核事件。2.输入事件核心：允许用户应用程序在用户空间读取内核事件。3.输入事件处理：提供用户空间进程以一种统一的方式来管理输入事件的家族和多样化，同时也包括通过特殊的设备文件来定义输入设备类型和配置输入设备。]]></description><category></category></item><item><title><![CDATA[嵌入式Linux应用_学习笔记(3:FrameBuffer应用编程，字符编码)]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/131145814</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/131145814</guid><author>m0_65525149</author><pubDate>Sat, 10 Jun 2023 23:30:35 +0800</pubDate><description><![CDATA[这一章主要学习的了解FrameBuffer的使用，熟悉字符的编码格式，以及如何在LCD上显示一个字符和一行字符串。（本文并没有使用开发板，所有图片均来自网络）开源的Freetype字体引擎库它提供统一的接口来访问多种字体格式文件，从而实现矢量字体显示。我们只需要移植这个字体引擎，调用对应的API接口，提供字体关键点，就可以让freetype库帮我们实现闭合曲线，填充颜色，达到显示矢量字体的目的。]]></description><category></category></item><item><title><![CDATA[嵌入式Linux应用_学习笔记(2:文件IO操作)]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/131100464</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/131100464</guid><author>m0_65525149</author><pubDate>Thu, 08 Jun 2023 11:00:23 +0800</pubDate><description><![CDATA[Linux是一个以文件为中心的操作系统，所有系统的交互都涉及到文件的读写。文件IO通常分为两种方式：标准IO和系统调用IO。标准IO：标准IO是利用stdio库的函数进行文件IO的操作。在文件IO方面，常用的标准IO有fopen，fclose，fread，fwrite等函数。标准IO具有良好的缓冲机制，能够自动将多个小的IO操作合并成大的操作，从而提高效率，但也导致了实时性方面的问题。系统调用IO：系统调用则是直接调用操作系统的API进行文件IO操作。]]></description><category></category></item><item><title><![CDATA[嵌入式Linux应用_学习笔记(1:Linux指令，vim，MakeFile)]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/131089989</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/131089989</guid><author>m0_65525149</author><pubDate>Wed, 07 Jun 2023 22:20:38 +0800</pubDate><description><![CDATA[本文主要记录的是Linux常用指令，Linux下的vim常用的一些指令和MakeFile的使用说明。下图是嵌入式Linux的系统组成：在裸机或者是操作系统中，应用程序是可以直接通过调用库函数来操作内核的。而在Linux中，应用程序是不能操作内核程序的，因此我们是需要通过内核提供的驱动来调用内核。Makefile 是一种构建自动化工具，用于构建和管理计算机程序的编译过程。它通常用于大型软件项目，其中需要对多个源文件进行编译，并将它们链接起来以生成最终的可执行文件。]]></description><category></category></item><item><title><![CDATA[深入理解FreeRTOS_学习笔记(11.内存管理)]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/131032505</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/131032505</guid><author>m0_65525149</author><pubDate>Sun, 04 Jun 2023 15:07:29 +0800</pubDate><description><![CDATA[内存管理的五种方式]]></description><category></category></item><item><title><![CDATA[深入理解FreeRTOS_学习笔记(10.链表)]]></title><link>https://blog.youkuaiyun.com/m0_65525149/article/details/130986152</link><guid>https://blog.youkuaiyun.com/m0_65525149/article/details/130986152</guid><author>m0_65525149</author><pubDate>Thu, 01 Jun 2023 18:44:47 +0800</pubDate><description><![CDATA[链表是FreeRTOS中使用次数相当多的，我们这一章主要就是链表项定义，插入，删除等一些操作，并且通过源码分析。如图所示，freertos具有非常多的链表宏操作freertos中对链表设定为双向链表，这是对数据结构中链表的深度理解，以及需要一定的C语言的代码能力。]]></description><category></category></item></channel></rss>