- 博客(58)
- 收藏
- 关注
原创 从零玩转RT-Thread(23):你必须知道的坑——定时器使用注意事项
本文介绍了RT-Thread定时器使用的注意事项。重点分析了硬定时器(HARD_TIMER)和软定时器(SOFT_TIMER)的区别:硬定时器在中断上下文执行,响应快速但限制严格;软定时器在任务上下文执行,灵活性高但响应稍慢。文章建议在定时器回调中避免耗时操作,可通过标志位或IPC机制交由其他任务处理。同时指出定时器精度受系统时钟节拍、负载等因素影响,无法实现绝对精确。最后通过代码示例演示了定时器的正确使用方法,并强调不当使用可能导致系统异常。
2025-12-12 08:55:00
903
原创 从零玩转RT-Thread(22):定时器底层机制揭秘
RT-Thread定时器基于系统时钟节拍(tick)触发,分为HARD_TIMER和SOFT_TIMER两种模式。HARD_TIMER在中断上下文中执行回调,精度受tick周期限制;SOFT_TIMER则由专用任务处理回调。定时器队列采用按触发时间排序的链表结构,周期定时器会自动重置,一次性定时器执行后移除。文中通过LED控制的代码示例,展示了SOFT_TIMER模式定时器的创建和使用方法,包括周期性和一次性定时器的实现。
2025-12-12 08:54:15
603
原创 从零玩转RT-Thread(21):创建简单的定时器
本文介绍了RT-Thread中软定时器的使用方法。软定时器通过定时器控制块(rt_timer_t)管理,包含定时时长、执行周期、回调函数等核心信息。文中展示了两种定时器的创建示例:周期性定时器实现LED闪烁,一次性定时器延时点亮LED。同时演示了在回调函数中重启或停止定时器的操作方式。这些API为RT-Thread系统提供了灵活的定时功能,不受硬件定时器数量限制。
2025-12-12 08:53:31
397
原创 从零玩转RT-Thread(20):为什么需要定时器?——定时器的应用场景
RT-Thread定时器是一种非阻塞式的延迟或周期性执行工具,通过系统时钟节拍中断触发预设回调函数。与阻塞式延时函数不同,定时器具有非阻塞特性,适用于周期性任务调度(如LED闪烁)、超时检测、替代任务延时、软件看门狗和延迟启动等功能。通过创建周期性定时器并指定回调函数,可实现1秒切换LED状态的案例。定时器能有效节省系统资源,提高响应效率,是嵌入式系统中重要的调度工具。
2025-12-12 08:52:33
573
原创 从零玩转RT-Thread(19):
本文介绍了RT-Thread系统中任务睡眠的实现原理及使用方法。主要讲解了睡眠功能的应用场景(避免CPU过载、控制执行节奏等),详细说明了RT-Thread将睡眠任务移入定时器列表的工作机制。文章列出了常用的睡眠接口函数(如rt_thread_mdelay、rt_thread_delay等),并通过LED闪烁示例展示了具体应用。最后强调了睡眠时间精度受系统时钟节拍限制,指出RTOS延时是"近似最小保证延时",精密定时需使用硬件定时器。本文内容适用于嵌入式开发人员理解RTOS任务调度机制。
2025-12-12 08:51:38
454
原创 从零玩转RT-Thread(18):主动让出CPU — 自愿下台的任务
摘要:主动让出CPU指任务自愿放弃运行权,通过rt_thread_yield()函数实现协作式调度,允许同/高优先级任务运行。适用于需要快速轮询但避免独占CPU的场景,如设备监测任务。该函数仅影响当前优先级任务,若无其他就绪任务则不会切换。示例展示两个同优先级任务通过yield()实现轮流执行。作者李述铜专注嵌入式系统教学,提供RTOS内核实现等系列课程。
2025-12-11 08:57:33
391
原创 从零玩转RT-Thread(17):优先级调度 — 让重要任务先走
RT-Thread内核支持基于优先级的抢占式调度,高优先级任务可打断低优先级任务运行。任务优先级范围为0-255,数值越小优先级越高。通过示例代码展示了t2高优先级任务抢占t1低优先级任务的情况:当t2使用忙等待时t1无法运行,而使用rt_thread_mdelay()时t1可获得执行机会。注意事项包括:合理设置优先级避免低优先级任务"饿死"、高优先级任务应适当释放CPU资源、避免所有任务设为同一优先级。
2025-12-11 08:56:43
280
原创 从零玩转RT-Thread(16):时间片调度 — 任务轮流上场
本文介绍了RT-Thread操作系统中的时间片调度机制。该机制通过为同优先级任务分配固定时间片(系统节拍数),实现任务间的公平轮转执行。文章通过示例代码展示了两个同优先级任务如何根据各自的时间片参数(20和40个tick)交替运行,并分析了任务执行时长与时间片的关系。时间片调度能防止单一任务独占CPU,当任务时间片用完或主动阻塞时,系统会自动切换任务。需要注意的是,时间片仅限制任务单次最大运行时长,实际执行时间可能更短。
2025-12-11 08:55:47
463
原创 从零玩转RT-Thread(15):两个特殊的任务
RT-Thread系统自动创建两个核心任务:main任务和空闲任务。main任务作为系统主线程执行用户main()函数,由rt_application_init()创建,支持静态和动态两种初始化方式,其优先级和栈大小可配置。空闲任务是最低优先级任务,负责系统空闲处理、资源回收和执行钩子函数,但禁止执行任何可能导致暂停的操作。用户可注册空闲钩子函数实现低优先级功能,如LED指示等。这两个任务共同构成了RT-Thread任务调度机制的基础框架。
2025-12-11 08:54:44
492
原创 从零玩转RT-Thread(14):怎样暂停任务的运行
本文介绍了RTOS中任务挂起与恢复机制,通过rt_thread_suspend()和rt_thread_resume()两个API实现任务暂停与重启。示例展示了系统运行中挂起日志任务5秒后再恢复的场景,LED任务保持运行。作者李述铜是嵌入式系统专家,提供RTOS、TCP/IP协议栈等手写实现课程。该机制适用于调试、低功耗等需要临时控制任务执行的场景。
2025-12-11 08:53:47
392
原创 从零玩转RT-Thread(14):怎样终止任务
RT-Thread任务终止机制解析:介绍了RT-Thread中任务终止的两种方式(主动返回和强制终止),详细说明了终止任务需要完成的资源释放工作,包括释放动态内存、关闭文件、移除调度队列等。特别强调了强制终止任务的风险,如文件损坏、资源泄漏和死锁等问题,建议优先采用任务自行清理的安全退出方式。文章最后提供了作者背景和相关课程推荐信息。
2025-12-10 09:53:55
748
原创 从零玩转RT-Thread(13):静态创建任务
本文介绍了RT-Thread中静态创建任务的方法。与动态创建不同,静态创建需要预先使用全局变量分配任务控制块和栈空间,通过rt_thread_init()初始化任务,再用rt_thread_startup()启动。静态创建具有内存可靠性高、适合长期运行任务的优点,但灵活性较差;动态创建则相反,适合临时任务。文章还指出,全静态任务可裁剪堆管理模块以节省空间。作者李述铜是嵌入式系统专家,提供相关课程资源。
2025-12-10 09:52:41
381
原创 从零玩转RT-Thread(12)-临时性任务的创建
摘要:临时性任务是指仅执行一次逻辑后自动退出的任务,与常驻任务不同,它不需长期占用CPU资源。这类任务适用于初始化、事件响应等场景,能有效节省系统资源。示例展示了按键触发LED闪烁的临时任务实现方式。临时任务适合低频事件处理,但频繁创建/销毁会增加开销。作者李述铜是嵌入式系统专家,提供相关课程教学。
2025-12-10 09:51:53
241
原创 从零玩转RT-Thread(11)-创建自己的第一个任务
本文介绍了在RT-Thread中创建多任务的方法,通过智能家居控制器的示例,展示了如何将功能拆分为LED心跳任务和按键检测任务。详细说明了任务函数格式、动态创建任务的接口rt_thread_create()及其参数配置,并提供了完整的示例代码。重点讲解了任务创建后需要通过rt_thread_startup()启动任务,以及如何在main函数中初始化并启动多个任务。文章为初学者提供了在RT-Thread环境下实现多任务编程的实用指导。
2025-12-10 09:51:08
315
原创 从零玩转RT-Thread(10):任务切换是怎么实现的
摘要:RTOS通过任务调度实现多任务并发执行,其核心原理是快速任务切换。在单CPU环境下,RTOS采用时间片轮转和抢占式调度策略,通过保存和恢复任务上下文(包括寄存器值、堆栈指针等),使多个任务看似并行运行。触发切换的条件包括主动让出CPU、高优先级任务就绪或时间片耗尽。这种机制类似于数码管动态扫描原理,通过毫秒级切换实现"同时"运行的效果。
2025-12-10 09:46:59
980
原创 从零玩转RT-Thread(9):RTOS是怎么管理任务的
摘要:RTOS通过任务控制块(TCB)唯一标识任务,记录任务函数、栈空间、状态和优先级等信息。系统将所有TCB组织成不同队列(就绪、挂起、延时队列)来管理任务状态。调度策略包括时间片轮转(CPU资源分配)、先来先服务(资源占用)和优先级(紧急任务优先)三种方式。RTOS通过这些机制实现任务的高效调度和资源管理,确保系统实时性和公平性。
2025-12-09 08:34:09
565
原创 从零玩转RT-Thread(8):什么是任务
本文介绍了RTOS中任务和中断的基本概念及区别。中断是硬件触发的短暂处理机制,而任务是RTOS中可长期运行的独立执行单元,包含任务函数、栈空间、状态和优先级等组成部分。任务通过RTOS调度实现并发执行,优先级决定执行顺序。文章还类比饭店员工分工来解释任务并发执行的原理,并简要说明了任务的生命周期和状态转换。
2025-12-09 08:32:45
521
原创 从零玩转RT-Thread(7):使用RTOS解决挑战
本文对比了裸机开发和RTOS开发的特点,通过示例代码展示了RTOS如何实现多任务并发执行、优先级管理和实时响应。RTOS通过独立线程封装任务,解决了裸机开发中任务阻塞、响应延迟等问题,使系统结构更清晰、易于维护。但同时也指出RTOS会带来额外资源开销,建议根据项目复杂度选择合适方案:简单系统用裸机,复杂系统用RTOS。文章最后介绍了作者背景和相关课程。
2025-12-09 08:31:20
991
原创 从零玩转RT-Thread(6):课程简介
RT-Thread Nano是一个轻量级实时操作系统,专为资源受限的嵌入式设备设计。它具有小巧(最小3KB Flash/1.2KB RAM)、实时响应、模块化架构等特点,主要采用C语言编写,适用于各类MCU平台。该系统通过任务调度实现多任务并行执行,开发者可以方便地创建LED控制、串口通信等线程。RT-Thread采用清晰的文件组织结构,支持功能裁剪,并有活跃的开发者社区提供支持,是嵌入式开发的理想选择。
2025-12-09 08:30:03
736
原创 从零玩转RT-Thread(5):什么是RTOS
本文通过饭店管理的生动比喻,对比了裸机开发和RTOS(实时操作系统)的差异。裸机开发如同单人经营饭店,任务需顺序执行,容易顾此失彼;而RTOS则像多人协作,通过任务管理、时间管理、调度机制等功能,实现多任务并发执行。RTOS将功能分解为独立任务,每个任务专注单一功能,由系统自动调度,提高实时性和扩展性。文章还介绍了RTOS的核心功能模块,并推荐了相关实践课程,帮助开发者深入理解操作系统原理。
2025-12-09 08:29:06
1010
原创 从零玩转RT-Thread(4):裸机开发面临的挑战
裸机开发在简单任务中直观高效,但随着系统复杂度提升,面临多任务冲突、实时响应延迟、程序结构臃肿、优先级缺失和可维护性差等五大挑战。通过状态机改造、中断标志位等方法可缓解部分问题,但会显著增加开发难度。特别是当系统需要并发处理LED控制、串口通信和按键扫描等多任务时,裸机开发的轮询机制会导致响应不及时、数据丢失等问题。随着功能扩展,主循环膨胀、任务耦合等问题会更加突出,此时采用RTOS等方案能更好地实现任务管理、优先级划分和模块解耦。开发方式的选择应基于项目实际需求,权衡开发效率与系统性能。
2025-12-08 15:02:58
573
原创 从零玩转RT-Thread(3):什么是祼机开发
裸机开发是一种直接在硬件上编程的嵌入式开发方式,无需操作系统支持。其主要特点包括高实时性、低资源占用和直接硬件控制,所有功能都在主循环中顺序执行。这种方式简单直观,适合简单项目,但随着系统复杂度增加会遇到瓶颈。示例代码展示了通过按键控制LED的典型裸机实现。作者李述铜是嵌入式系统专家,专注于底层架构和操作系统教学。
2025-12-08 15:02:00
345
原创 从零玩转RT-Thread(2):开发环境准备
本文介绍了基于RT-Thread的嵌入式开发课程所需环境准备。课程采用嘉立创梁山派开发板(GD32F470芯片),需配合Keil软件和DAPLink调试器使用,并提供了器件支持包下载链接。课程要求学员具备STM32等MCU开发基础,主要使用开发板上的LED和按键演示RTOS功能,可选配游戏机扩展板。文章还推荐了相关进阶课程,并介绍了作者李述铜在嵌入式系统领域的专业背景。
2025-12-08 14:59:03
425
原创 从零玩转RT-Thread(1):课程简介
本文介绍RT-Thread开源操作系统的入门课程内容。课程将讲解RT-Thread核心功能,包括线程管理、同步机制、时间管理和内存管理等基础内容,适合已有嵌入式开发经验的学习者。课程代码开源在Gitee仓库,配套视频详见README。通过学习,学员将掌握RT-Thread的核心API使用和RTOS工作原理,为嵌入式开发奠定基础。课程要求具备C语言和单片机开发基础,适合工程师、学生和创客学习。作者李述铜是嵌入式系统领域讲师,出版多部操作系统相关著作。
2025-12-08 14:57:03
760
原创 为什么嵌入式开发中要使用RTOS
嵌入式开发中RTOS的优势在于解决裸机编程的痛点。当项目复杂度增加时,裸机代码会导致功能相互阻塞,影响系统实时性。RTOS通过多任务独立运行机制,使不同功能模块互不干扰,即使某个任务出现延迟也不会影响其他任务执行。此外,RTOS还提供清晰的代码结构、良好的扩展性以及优先级调度能力,确保关键任务的实时性。虽然简单项目可用裸机实现,但随着系统规模扩大,RTOS是更稳定、高效的解决方案。
2025-12-08 13:47:27
780
原创 笔记软件推荐:给开发者的笔记利器Obsidian
李述铜分享了从印象笔记迁移到Obsidian的经验。他选择Obsidian主要因为:1)笔记以Markdown纯文本存储,格式开放且迁移成本低;2)基础功能免费,不受软件绑定;3)丰富的插件生态;4)可自由选择Git或云盘进行数据同步,确保数据掌控权。迁移过程遇到印象笔记导出困难,最终通过Windows旧版软件批量导出。作者认为Obsidian解决了长期笔记存储和跨平台使用的问题,即使未来软件下线也可无缝切换其他编辑器。
2025-11-19 11:02:09
651
原创 C编程技巧:将do{ ... } while(0)用于宏定义的好处
本文探讨了C语言宏定义中使用do{}while(0)的技巧。作者通过宏交换变量的例子,分析了简单宏定义可能导致的逻辑错误,以及使用大括号包裹的局限性。do{}while(0)结构完美解决了这些问题:既能将多条语句组合成单一逻辑块,又能正确处理末尾分号,同时支持break跳出。文章还指出C99标准的内联函数是更好的替代方案,但在仅支持C89时必须使用这种技巧。这种写法在嵌入式开发中尤为实用,能确保宏展开后的正确性和灵活性。
2025-11-14 10:22:03
679
原创 一个任务写,一个任务读,RTOS里到底要不要加锁?
摘要:嵌入式系统专家李述铜针对RTOS开发中多任务读写共享数据的问题进行深入分析。文章以温湿度传感器数据读取为例,指出在多任务并发环境下可能出现数据不一致的情况(如温度更新而湿度未更新时被读取),并详细解释了问题根源在于非原子操作被打断。解决方案包括使用互斥锁确保读写操作的原子性,同时讨论了32位整型变量在不同位宽处理器上的原子性问题。文章强调保护机制的使用需根据操作原子性来判断,为嵌入式开发者提供了实用指导。
2025-11-07 10:23:50
822
原创 C编程必知:为什么每个头文件都需要#ifndef/#define
摘要:本文介绍了C语言中#ifndef和#define的用途及重要性。通过实际代码示例,分析了多次包含同一头文件导致的重复定义问题,并详细讲解了如何通过使用#ifndef/#define/#endif宏来防止此类错误。文章指出,这种"头文件保护"机制能确保头文件内容仅被展开一次,有效避免编译错误,是C程序员必须掌握的基础技巧。
2025-11-03 15:37:16
881
原创 一个大学生,想像Linus一样写操作系统,需要具备什么能力?
本文探讨大学生从零开发操作系统的可行性与意义。作者李述铜认为,开发操作系统的价值不在于创造实用系统,而在于深入理解计算机底层原理。尽管挑战不小,但通过掌握C语言、计算机体系结构等基础知识,并采用渐进式开发策略(从简单功能到复杂模块),这一目标是可达成的。文章提供了具体的学习路线,强调"边做边学"的重要性,并指出关键难点在于如何迈出第一步。作者鼓励有想法的学生勇敢尝试,认为这一过程能带来远超学习内容本身的收获。文章最后推荐了作者的系统开发课程,帮助读者实现从零编写操作系统的目标。
2025-10-30 10:12:14
1057
原创 别再只用malloc了!嵌入式C的栈上动态数组分配:变长数组
本文介绍了C99标准中的变长数组(VLA)特性,该特性允许使用运行时变量定义数组长度,解决了传统固定长度数组浪费内存或动态分配复杂的问题。文章分析了变长数组的工作原理(栈上分配)、优势(自动管理、高效灵活)和使用注意事项(栈大小限制、编译器兼容性等)。作为嵌入式系统专家,作者通过实际案例展示了变长数组如何优化资源受限环境下的内存使用,并对比了其与静态数组和malloc分配的差异,帮助开发者更好地利用这一被低估的C语言特性。
2025-10-30 10:07:11
701
原创 作为嵌入式开发者,有必要手写一个RTOS吗
学习手写RTOS的价值在于深入理解底层原理而非重复造轮子。通过实践可以掌握任务调度、中断处理等核心机制,培养系统思维和调试能力。作者分享了自己从研究uc/OSii源码到开发教学课程的经历,强调手写RTOS能帮助学习者从使用者转变为理解者。全新升级的《RTOS开发与实战》课程包含155节课,支持RISC-V和ARM双平台,结合物联网项目实战,让学员真正掌握RTOS设计与应用。课程赠送开发板,使学习更加直观有效。
2025-10-28 11:45:33
728
原创 写给嵌入式C程序员:我们为什么终于不用自己定义UINT8了
《跨平台开发中的整数类型陷阱与stdint.h解决方案》文章分享了作者在MCU开发中遇到的整数类型兼容性问题。当代码从32位ARM移植到16位AVR时,int类型宽度的差异导致了整数溢出、位运算错误和循环边界问题等隐患。传统解决方案是自定义类型别名,但存在命名混乱和维护困难的问题。C99标准引入的stdint.h头文件提供了标准化的固定宽度整数类型(如int32_t、uint16_t等),从根本上解决了跨平台一致性问题,使代码更加清晰可读且易于维护。作者建议开发者优先使用这些标准类型来编写可移植性更强的嵌入
2025-10-27 13:45:15
865
原创 C语言中的伸缩型数组:看似简单,其实很巧妙
摘要:《CPrimerPlus》中介绍的C99新增特性——伸缩型数组成员,为数据包结构体定义提供了更优雅的解决方案。传统方法要么浪费空间,要么不够规范,而伸缩型数组成员(如uint8_t payload[])位于结构体末尾且不占空间,其实际长度由运行时决定。使用时需注意三点:必须是结构体最后一个成员、数组声明留空、需配合malloc动态分配空间。这一特性特别适合嵌入式通信协议解析等场景,能更灵活高效地处理变长数据包。
2025-10-23 15:32:35
816
原创 全新升级的手写RTOS课程:从原理到实战,一次掌握操作系统的核心
《RTOS开发与实战》新版课程较2017年旧版进行了全面升级:1)内容扩充3倍至155课时,新增动态内存分配、C库移植等实用功能;2)采用RISC-V+ARM双架构,支持真实开发板运行;3)配套物联网实战项目,集成LWIP、FATFS等组件;4)代码工程化重构,提升模块化与可维护性;5)教学方式更系统,增加21课时详解任务切换等核心机制。新版注重从原理理解到工程应用的完整闭环,适合希望深入掌握RTOS设计与实战的开发者。
2025-10-20 17:19:11
819
原创 C结构体的初始化你还在按顺序写?试试这个C99神操作!
本文介绍了C语言中结构体的指定初始化方法(C99标准特性),对比传统初始化方式具有显著优势:1)通过.字段名直接赋值,大幅提升代码可读性;2)支持乱序初始化和选择性初始化未指定字段自动置零;3)避免因结构体定义变更导致的隐晦错误。该方法同样适用于数组初始化([索引]=值形式),并能实现嵌套结构的灵活初始化。作者在实际项目(RTOS开发、操作系统课程)中广泛应用该特性,显著提升了代码可维护性和开发效率。
2025-10-18 09:39:59
911
原创 为什么c语言没有布尔类型?
本文介绍了C99标准新增的_Bool类型及其使用。在C89/C90标准中,常用int类型配合1/0或宏定义来表示布尔值。C99引入的_Bool类型通过<stdbool.h>头文件提供了bool、true、false等语法糖,使代码更具可读性。虽然底层实现与之前方法类似,但直接使用标准类型避免了重复造轮子。文章通过示例代码展示了bool类型的使用方式,并指出这一特性虽不改变本质逻辑,却提高了代码清晰度。
2025-10-15 21:40:43
821
原创 我是如何写出第一本自己的书
我的第一本书终于由清华大学出版社会出版了,书名是《从0手写x86计算机操作系统》。这里录制了一个视频,介绍这本书是如何写出来的。这本书里从0开始,介绍了一个操作系统的实现。程序员如何出版自己的第一本书。
2025-10-14 17:23:05
208
原创 我做了一块开发板,可以让你真正懂RTOS
这是一套结合开发板与课程的RTOS深度教学方案,旨在帮助学习者突破"仅会调用API"的瓶颈,真正掌握RTOS内核原理。课程包含两大模块:1)从零手写RTOS内核(34小时/18章),覆盖RISC-V与Cortex-M架构的任务调度、中断管理等核心机制;2)实战项目开发远程温湿度监控系统,集成FATFS/LWIP等组件。配套开发板支持内核手写与硬件实践,解决"知其然不知其所以然"的痛点。课程已更新完毕并提供答疑服务,适合希望深入理解RTOS原理及提升物
2025-10-13 14:49:18
646
原创 硬核项目!从0手写一个RISC-V模拟器!
RISC-V以其独特的开源指令集架构(ISA),挑战着传统计算机体系结构的边界,为全球的工程师、学者、爱好者提供了一个共同探索、实验和创新的平台。随着越来越多的支持和投资,RISC-V的工具链、库和社区资源变得日益丰富,这为嵌入式开发者提供了广阔的学习和应用平台。但是这些产品在我们看来都有一个比较明显的缺点,那便是配套的资料内容侧重在介绍芯片外设的使用,而忽略了RISC-V内核本身的内容。从嵌入式开发者的角度来看,学习RISC-V不仅是跟上技术潮流的必要步骤,更是打开新的可能性和机遇的关键。
2024-07-26 14:50:39
741
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅