- 博客(12)
- 收藏
- 关注
原创 第三章 拼凑内核(4) -- 事件组解析
摘要:本文解析FreeRTOS中的事件组组件,对比事件组与队列的区别,指出事件组主要用于标志位管理而非数据传输。事件组通过集中管理事件位(如ADC采集完成、串口发送完成等)实现事件驱动机制,包含事件等待列表和阻塞功能。关键数据结构仅包含事件位和等待列表,核心函数包括xEventGroupWaitBits(等待事件)、xEventGroupSetBits(设置事件)和xEventGroupSync(任务同步)。事件组通过事件发生通知任务运行、未发生则阻塞任务的机制,简化了事件驱动程序的实现。
2026-04-09 09:27:22
358
原创 第三章 拼凑内核(3) -- 软件定时器解析
本文解析了FreeRTOS中软件定时器的实现原理。软件定时器基于任务、队列和列表构建,分为一次性定时器和周期性定时器两种。其核心数据结构包含定时器名称、列表项、周期时间、自动重载标志、ID和回调函数。主要程序逻辑包括定时器任务函数(处理到期定时器)、定时器创建(初始化数据结构并加入列表)和定时器命令处理(通过队列传递操作指令)。文章最后以500ms闪烁灯为例,展示了软件定时器的实际应用。
2026-04-08 11:37:55
336
原创 第三章 拼凑内核(2) -- 队列解析
本文解析了FreeRTOS中的队列组件实现原理。队列由控制块(存储队列元信息)和存储空间(实际消息载体)两部分组成,采用环形缓冲结构,通过读写指针实现先入先出特性。当队列满/空时,任务会进入阻塞状态:队列维护发送/接收两个等待列表,任务通过事件列表项与队列交互。阻塞时任务状态列表项被移入阻塞列表,待条件满足后恢复。信号量和互斥锁本质上是特殊队列,阻塞机制与队列类似。文章通过简化数据结构图解和操作流程,帮助理解队列在RTOS中的关键作用。
2026-04-01 18:21:07
381
原创 第三章 拼凑内核 -- 组件介绍
本文介绍了FreeRTOS操作系统的核心组件与运行机制。主要包含链表、任务、队列、软件定时器、事件组等核心数据结构,其中链表是实现其他组件的基础。系统通过全局资源管理任务状态,包括就绪列表、阻塞列表等。初始化时会创建空闲任务和软件定时器任务,利用SystemTick等中断实现任务调度。当定时器触发时,高优先级的定时器任务会抢占空闲任务执行。文章还涉及内存管理、流缓冲等关键功能的实现原理,为深入理解FreeRTOS系统架构提供了基础。
2026-02-09 11:03:58
677
原创 第二章 内核心脏——任务与调度(4)--任务状态与调度
本文通过小朋友玩滑滑梯的生动类比,讲解了操作系统中的任务状态管理机制。文章将任务状态分为就绪态(准备区)、运行态(正在玩滑梯)、阻塞态(等待区)和挂起态(罚站区),并阐述了状态间的转换关系。同时介绍了任务优先级机制(优/良/差等级)和时间片轮询调度策略,强调高优先级任务可抢占CPU资源。最后指出系统通过1ms的SystemTick定时中断检测任务状态,结合PendSV中断实现任务切换,完成多任务调度管理。这种生活化的类比使复杂的操作系统调度原理更易理解。
2026-01-20 09:59:27
711
原创 第二章 内核心脏——任务与调度(3)--实现OS需要的底层原理
摘要:本文介绍了在Cortex-M3/M4内核上实现操作系统所需的底层原理,重点讲解了寄存器组的功能和使用。主要包括:16个寄存器(R0-R15)的作用,其中R13(SP)分为MSP和PSP,R14(LR)保存返回地址,R15(PC)实现跳转;特殊功能寄存器如xPSR、PRIMASK等的用途;中断与函数调用在保存现场时的区别;以及如何利用PendSV和SVC异常中断实现任务切换。这些知识是构建操作系统的基础,特别是通过中断实现"上下文切换"机制,为任务调度提供了技术支持。
2026-01-15 16:58:23
722
原创 第二章 内核心脏——任务与调度(2)-任务栈与任务控制块
本文讨论了任务栈和任务切换的基本概念。通过多个运算任务并发的例子,说明为每个任务分配独立内存空间(任务栈)的必要性,以避免任务现场数据相互干扰。文章详细解释了任务栈的工作原理,包括栈顶、栈底等关键概念,并介绍了任务控制块(TCB)作为保存任务栈位置信息的机制。通过分析任务切换过程,阐明了如何利用栈顶地址准确恢复特定任务的现场数据。文章还解答了关于任务栈管理的两个关键问题:如何定位特定任务的栈空间,以及如何确保正确恢复固定数量的寄存器数据。
2026-01-13 15:50:11
680
原创 第二章 内核心脏——任务与调度(1)
本文探讨了RTOS中任务调度的核心机制。通过分析函数调用时的CPU行为,揭示了寄存器组和栈在保存现场和返回地址中的关键作用。以一个计算2^20和3^10的例子,展示了如何通过拆分任务和轮流执行实现"并发"效果。重点阐述了任务切换的本质:利用栈保存当前任务状态(包括寄存器和返回地址),使得CPU可以在多个任务间切换而不丢失各自进度。文章指出,栈是实现多任务调度的基础,通过保存和恢复现场,系统能够实现看似同时执行多个任务的效果。
2026-01-06 18:38:22
966
原创 第一章 打破黑盒—— 我们为什么需要深入 FreeRTOS?
本文探讨了开发者学习FreeRTOS的三个典型阶段:1)初学阶段只会复制粘贴Demo代码,对系统缺乏理解;2)进阶阶段能熟练调用API但不知其原理;3)高级阶段将系统功能视为"魔法",遇到问题束手无策。作者指出,要真正掌握RTOS必须理解其底层机制,如任务即"结构体+栈内存",调度即"判断+切换",建议开发者以设计者思维思考问题本质,通过推导而非死记硬背来突破学习瓶颈,最终实现对系统的全面掌控。
2026-01-04 11:05:59
665
原创 EasyLogger源码解析及流程理解
EasyLogger是一个轻量实用的开源日志库,主要提供三种打印方式:直接打印、缓存打印和异步打印。其核心架构分为前端处理(日志等级、标签过滤等功能)和后端输出(通过port层适配不同平台)。项目采用全局单例模式管理日志状态,通过elog_cfg.h配置、elog_port.c接口适配和核心功能文件实现模块化设计。阅读方法建议从README入手,先运行demo理解功能,再分析文件结构和调用链。源码分析应重点关注初始化流程、数据流走向和核心数据结构(如日志过滤器和格式设置)。该项目结构清晰,适合学习中小型开源
2025-12-26 11:52:46
1626
原创 关于数组越界导致pcCurrentTCB和fault的问题
本文记录了在开发基于RTOS的事件驱动器时遇到的HardFault问题排查过程。通过ST-Link调试发现pxCurrentTCB指针异常指向Flash地址,经排查发现是由于事件表数组event_table[2]赋值时发生越界,覆盖了pxCurrentTCB的内存地址(0x20000028)。最终确定原因是未明确定义数组大小导致运行时越界。解决方法是将数组大小明确声明,避免越界访问。整个调试过程展示了如何使用寄存器值、内存地址分析等技术定位RTOS开发中的内存越界问题。
2025-09-18 18:26:29
797
原创 理解stm32的boot和app
本文介绍了STM32单片机中boot和app的区别与实现原理。boot和app本质上是存储在不同地址的两段代码,boot负责系统初始化和app升级,app实现具体功能。关键点在于通过VTOR寄存器实现中断向量表重定向,使boot和app拥有各自独立的中断向量表。文章详细讲解了STM32启动流程,包括从Flash读取第一条代码、跳转到ResetHandler和SystemInit的过程,以及如何通过修改VTOR值实现boot到app的跳转。这种分离设计便于代码管理和维护,也为实现单boot多app模式奠定了基
2025-09-09 14:46:15
1290
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅