<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[hsjiasb的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/hsjiasb</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; hsjiasb]]></copyright><item><title><![CDATA[FreeRTOS学习（三十九）——最终总结]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163970913</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163970913</guid><author>hsjiasb</author><pubDate>Sat, 22 Aug 2026 11:19:40 +0800</pubDate><description><![CDATA[任务创建与延时优先级与时间片任务句柄挂起、恢复和删除任务状态与优先级修改Idle Task与系统Tick队列二值信号量与计数信号量互斥量与优先级继承事件组任务通知软件定时器流缓冲区与消息缓冲区中断安全API临界区与调度器锁heap_1到heap_5任务栈与栈溢出检测Hook函数与运行时间统计调试与追踪CMSIS-RTOS生产者消费者模型多任务同步系统架构设计FreeRTOS移植与调度原理工程规范性能优化真正需要掌握的并不是把这些API全部背下来。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（三十八）——性能优化]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163970795</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163970795</guid><author>hsjiasb</author><pubDate>Sat, 22 Aug 2026 11:11:56 +0800</pubDate><description><![CDATA[这一节学习了FreeRTOS几个比较实用的性能优化方向。不要凭感觉优化↓先测量↓再修改检查任务栈。检查Heap。哪些任务占用了大量CPU。任务是否存在无意义死循环能不能通过阻塞等待事件任务栈是否设置过大Heap是否合理任务数量是否过多任务通信方式是否合适任务优先级是否合理是否存在大量无意义printf让CPU一直高速运行。该运行的任务及时运行不需要运行的任务及时阻塞RAM不浪费CPU不空转任务之间关系清楚。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（三十七）——常见错误与工程规范]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163957755</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163957755</guid><author>hsjiasb</author><pubDate>Fri, 21 Aug 2026 23:05:16 +0800</pubDate><description><![CDATA[这一节集中整理了FreeRTOS工程中最容易出现的几个问题。任务while(1)不阻塞优先级随意设置中断中使用普通API任务栈设置不合理创建对象不检查结果共享资源没有保护Mutex获取后忘记释放临界区时间过长这个任务什么时候阻塞？优先级真的需要这么高吗？有没有和其他任务共享资源？栈空间够不够？有没有在中断中错误调用普通API？队列信号量事件组任务通知每个任务职责明确任务该阻塞时能够阻塞共享资源正确保护中断和任务边界清楚系统资源能够被监控。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（三十六）——FreeRTOS移植与调度原理]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163950296</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163950296</guid><author>hsjiasb</author><pubDate>Fri, 21 Aug 2026 16:56:22 +0800</pubDate><description><![CDATA[Task1Task2CPU↓Task1Task1需要阻塞。Task1↓保存运行现场↓选择Task2↓恢复Task2运行现场↓Task2继续运行运行现场CPU寄存器栈指针程序执行位置等信息。上下文切换也就是Context Switch。这一节初步学习了FreeRTOS移植与任务调度原理。tasks.cqueue.clist.cport.c当前任务运行↓保存任务现场↓选择下一个任务↓恢复任务现场↓新任务运行SysTick↓系统时间节拍PendSV↓。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（三十五）——系统架构综合项目]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163927775</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163927775</guid><author>hsjiasb</author><pubDate>Thu, 20 Aug 2026 23:28:29 +0800</pubDate><description><![CDATA[实际传感器通常不只有一个数据。温度湿度UartQueue这一节没有学习新的FreeRTOS函数，而是把前面的知识组合成了一个简单的系统架构。SensorTask采集数据↓↓处理数据↓UartQueue↓UartTask发送数据LedTask↓独立运行↓显示系统状态先根据功能划分任务↓再分析任务之间需要传递什么数据↓选择队列、信号量、通知或互斥量↓最后确定任务优先级一个功能随便创建一个任务所有任务全部while(1)职责明确关系清楚该阻塞时阻塞。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（三十四）——多任务同步综合实验]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163927729</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163927729</guid><author>hsjiasb</author><pubDate>Thu, 20 Aug 2026 23:24:36 +0800</pubDate><description><![CDATA[这一节把前面学习过的任务、二值信号量和互斥量组合到了一起。SensorTask↓采集数据↓↓二值信号量↓↓UploadTask任务什么时候运行的问题。Task1↘Mutex↗Task2谁能够使用共享资源的问题。就认为它们作用完全相同。我要通知另一个任务做事↓任务同步我要防止多个任务同时使用一个外设↓资源互斥理解这个区别以后，二值信号量和互斥量在实际工程中就不容易用错了。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（三十三）——生产者消费者综合实验]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163895585</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163895585</guid><author>hsjiasb</author><pubDate>Wed, 19 Aug 2026 23:01:31 +0800</pubDate><description><![CDATA[先不考虑FreeRTOS。1000ms采集一次温度。25℃26℃27℃这些数据需要交给另外一个任务处理。SensorTask生产数据↓Queue↓处理数据生产者消费者保存并传递数据。这一节把前面学习的任务、队列和阻塞机制组合起来，实现了一个简单的生产者消费者模型。产生数据↓↓Queue↓↓处理数据产生数据处理数据保存数据传递数据缓冲生产和消费速度差异传感器采集任务↓队列↓数据处理任务串口接收任务↓队列↓协议解析任务数据采集任务↓队列↓。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（三十二）——CMSIS-RTOS与FreeRTOS的关系]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163895443</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163895443</guid><author>hsjiasb</author><pubDate>Wed, 19 Aug 2026 21:31:13 +0800</pubDate><description><![CDATA[这一节学习了CMSIS-RTOS与FreeRTOS之间的关系。FreeRTOS↓真正的RTOS内核CMSIS-RTOS↓统一的RTOS编程接口用户程序↓↓FreeRTOS↓STM32F407虽然写法不同，但都可以用于创建任务。osDelay();也都是让当前任务延时阻塞。osDelay();我明明使用的是FreeRTOS，为什么代码里面没有xTaskCreate？因为CubeMX可以通过CMSIS-RTOS这一层接口来使用底层FreeRTOS内核。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（三十一）——调试与追踪]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163801556</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163801556</guid><author>hsjiasb</author><pubDate>Mon, 17 Aug 2026 09:00:00 +0800</pubDate><description><![CDATA[这一节学习了FreeRTOS中几个非常实用的调试方法。的返回值。LEDprintf去猜。先看任务状态↓再看优先级和阻塞关系↓再检查Stack和Heap↓最后结合断点定位具体代码掌握这些方法以后，FreeRTOS出现的很多“莫名其妙的问题”，实际上都可以一步一步定位出来。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（三十）——FreeRTOSConfig配置]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163800703</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163800703</guid><author>hsjiasb</author><pubDate>Sun, 16 Aug 2026 17:54:50 +0800</pubDate><description><![CDATA[这一节集中认识了中几个最常见的配置。↓是否使用抢占式调度↓系统Tick频率↓任务优先级数量↓最小任务栈深度参考↓FreeRTOS动态Heap大小↓同优先级任务是否使用时间片↓是否开启软件定时器某个FreeRTOS函数不能使用某个功能没有开启Heap空间不足任务优先级设置异常Tick时间与预期不一致但是也不要为了“功能齐全”，把所有配置全部打开。需要什么↓开启什么这样既能够减少不必要的代码和RAM占用，也更容易理解整个FreeRTOS工程到底使用了哪些功能。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（二十九）——低功耗Tickless Idle]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163800533</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163800533</guid><author>hsjiasb</author><pubDate>Sun, 16 Aug 2026 16:31:39 +0800</pubDate><description><![CDATA[减少不必要的Tick接下来1000ms没有任务需要运行暂时停止周期Tick↓进入低功耗状态↓等待接近任务唤醒时间↓重新恢复Tick进入休眠↓长时间不产生周期Tick↓唤醒这样CPU就可以拥有更长的连续休眠时间。这一节学习了FreeRTOS中的Tickless Idle低功耗机制。任务全部阻塞↓Idle Task运行↓Tick仍然周期产生任务全部阻塞↓计算预计空闲时间↓停止一段时间的周期Tick↓进入低功耗↓定时或中断唤醒↓恢复系统运行让任务运行得更快。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（二十八）——钩子函数与运行时间统计]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163730609</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163730609</guid><author>hsjiasb</author><pubDate>Thu, 13 Aug 2026 18:03:32 +0800</pubDate><description><![CDATA[FreeRTOS运行到某个固定位置↓自动调用用户编写的函数系统进入空闲任务↓调用Idle Hook系统产生一次Tick↓调用Tick Hook我们不需要修改FreeRTOS内核源码，只需要按照规定的函数名称编写函数即可。Task1Task2Task3Task1到底运行了多久？Task2占CPU多少？Task3是不是一直抢占CPU？任务运行时间统计。任务CPU占用情况。这一节学习了FreeRTOS中的钩子函数与运行时间统计。空闲任务运行时执行。系统Tick到来时执行。简单快速。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（二十七）——任务栈与栈溢出检测]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163696683</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163696683</guid><author>hsjiasb</author><pubDate>Wed, 12 Aug 2026 18:00:00 +0800</pubDate><description><![CDATA[Task1,"Task1",128,NULL,2,NULL512Byte1000Byte显然已经超过任务栈空间。栈溢出。这一节学习了FreeRTOS中的任务栈与栈溢出检测。StackType_t数量。128↓↓约512Byte任务的局部变量、函数调用以及任务切换保存的数据都会消耗栈空间。程序跑飞数据异常HardFault观察任务历史上的最小剩余栈空间。栈不能太小↓防止溢出栈也不能盲目设置过大↓避免浪费RAM。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（二十六）——动态内存管理heap_1到heap_5]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163696280</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163696280</guid><author>hsjiasb</author><pubDate>Wed, 12 Aug 2026 13:28:30 +0800</pubDate><description><![CDATA[这一节学习了FreeRTOS中的五种动态内存管理方案。申请内存。heap_1heap_2heap_3heap_4heap_5五种实现方式。heap_1：只申请，不释放heap_2：可释放，但不合并空闲块heap_3：使用malloc/freeheap_4：可释放，并合并相邻空闲块heap_5：支持多个不连续RAM区域heap_4通常是一个比较常用的选择。MCU总RAM≠这一点一定不要混淆。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（二十五）——临界区与调度器锁]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163666700</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163666700</guid><author>hsjiasb</author><pubDate>Tue, 11 Aug 2026 14:09:12 +0800</pubDate><description><![CDATA[一段不能被打断的关键代码。Count++;以后，FreeRTOS会通过屏蔽一定优先级范围内的中断来保护这段代码，因此任务切换也不会在这里正常发生。Count++;退出临界区。暂时不要发生任务切换硬件中断可以正常响应。这时可以暂停FreeRTOS调度器。Count++;其他任务暂时不会被调度运行中断仍然可以正常响应。这一节学习了FreeRTOS中的临界区和调度器锁。它适合保护非常短的关键代码。它暂停的是FreeRTOS任务调度，中断仍然可以继续响应。几条关键代码需要保护↓临界区。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（二十四）——中断安全API（FromISR）]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163661356</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163661356</guid><author>hsjiasb</author><pubDate>Tue, 11 Aug 2026 11:06:21 +0800</pubDate><description><![CDATA[中断服务函数。FromISR专门给中断服务函数使用的FreeRTOS API。这一节学习了FreeRTOS中的中断安全API。专门用于中断环境，不会像普通任务API一样进行阻塞等待。用于判断这次中断操作是否唤醒了需要立即运行的更高优先级任务。则负责在需要时请求中断退出后的任务切换。FromISR↓↓中断通知任务↓发现更高优先级任务已经就绪↓退出中断后尽快切换过去。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（二十三）——消息缓冲区（Message Buffer）]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163646887</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163646887</guid><author>hsjiasb</author><pubDate>Mon, 10 Aug 2026 23:49:47 +0800</pubDate><description><![CDATA[一条消息↓完整存进去↓完整取出来HelloFreeRTOS│ Hello │HelloFreeRTOS两条消息不会混在一起。这一节学习了FreeRTOS中的消息缓冲区。流缓冲区只保存连续字节，而消息缓冲区会保留每一条消息的边界。连续字节流↓独立的数据包↓另外，接收消息时一定要保证接收数组足够大，否则无法成功取出完整消息。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（二十二）——流缓冲区（Stream Buffer）]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163574404</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163574404</guid><author>hsjiasb</author><pubDate>Sat, 08 Aug 2026 15:00:00 +0800</pubDate><description><![CDATA[一个先进先出的字节缓冲区。A B C D EA↓B↓C先进先出（FIFO）的顺序读取。这一节学习了FreeRTOS中的流缓冲区。专门处理连续字节流数据，不需要像队列那样逐个消息发送，因此效率更高，特别适合UART、DMA和TCP等连续数据通信场景。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（二十一）——软件定时器（Software Timer）]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163574340</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163574340</guid><author>hsjiasb</author><pubDate>Sat, 08 Aug 2026 09:00:00 +0800</pubDate><description><![CDATA[到达设定时间↓自动执行指定函数。500ms↓LED翻转1000ms↓发送心跳包不需要单独创建任务，也不占用硬件定时器资源。这一节学习了FreeRTOS中的软件定时器。即定时器回调函数。软件定时器适用于周期执行、超时检测和定时触发等场景，不需要额外创建多个任务，因此相比"一个定时功能对应一个任务"更加节省系统资源。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习（二十）——任务通知的多种用法]]></title><link>https://blog.youkuaiyun.com/hsjiasb/article/details/163539770</link><guid>https://blog.youkuaiyun.com/hsjiasb/article/details/163539770</guid><author>hsjiasb</author><pubDate>Thu, 06 Aug 2026 17:13:39 +0800</pubDate><description><![CDATA[这一节学习了任务通知的几种常见用法。二值信号量模式：通知任务继续运行；计数模式：记录通知次数；32位数据传递：发送一个整数值；事件标志模式：利用32位通知值表示多个事件。正因为功能丰富、执行效率高、RAM占用少，所以任务通知已经成为FreeRTOS官方推荐的任务间通信方式之一。]]></description><category></category></item></channel></rss>