自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 FreeRTOS学习(三十九)——最终总结

任务创建与延时优先级与时间片任务句柄挂起、恢复和删除任务状态与优先级修改Idle Task与系统Tick队列二值信号量与计数信号量互斥量与优先级继承事件组任务通知软件定时器流缓冲区与消息缓冲区中断安全API临界区与调度器锁heap_1到heap_5任务栈与栈溢出检测Hook函数与运行时间统计调试与追踪CMSIS-RTOS生产者消费者模型多任务同步系统架构设计FreeRTOS移植与调度原理工程规范性能优化真正需要掌握的并不是把这些API全部背下来。

2026-08-22 11:19:40 303

原创 FreeRTOS学习(三十八)——性能优化

这一节学习了FreeRTOS几个比较实用的性能优化方向。不要凭感觉优化↓先测量↓再修改检查任务栈。检查Heap。哪些任务占用了大量CPU。任务是否存在无意义死循环能不能通过阻塞等待事件任务栈是否设置过大Heap是否合理任务数量是否过多任务通信方式是否合适任务优先级是否合理是否存在大量无意义printf让CPU一直高速运行。该运行的任务及时运行不需要运行的任务及时阻塞RAM不浪费CPU不空转任务之间关系清楚。

2026-08-22 11:11:56 221

原创 FreeRTOS学习(三十七)——常见错误与工程规范

这一节集中整理了FreeRTOS工程中最容易出现的几个问题。任务while(1)不阻塞优先级随意设置中断中使用普通API任务栈设置不合理创建对象不检查结果共享资源没有保护Mutex获取后忘记释放临界区时间过长这个任务什么时候阻塞?优先级真的需要这么高吗?有没有和其他任务共享资源?栈空间够不够?有没有在中断中错误调用普通API?队列信号量事件组任务通知每个任务职责明确任务该阻塞时能够阻塞共享资源正确保护中断和任务边界清楚系统资源能够被监控。

2026-08-21 23:05:16 558

原创 FreeRTOS学习(三十六)——FreeRTOS移植与调度原理

Task1Task2CPU↓Task1Task1需要阻塞。Task1↓保存运行现场↓选择Task2↓恢复Task2运行现场↓Task2继续运行运行现场CPU寄存器栈指针程序执行位置等信息。上下文切换也就是Context Switch。这一节初步学习了FreeRTOS移植与任务调度原理。tasks.cqueue.clist.cport.c当前任务运行↓保存任务现场↓选择下一个任务↓恢复任务现场↓新任务运行SysTick↓系统时间节拍PendSV↓。

2026-08-21 16:56:22 324

原创 FreeRTOS学习(三十五)——系统架构综合项目

实际传感器通常不只有一个数据。温度湿度UartQueue这一节没有学习新的FreeRTOS函数,而是把前面的知识组合成了一个简单的系统架构。SensorTask采集数据↓↓处理数据↓UartQueue↓UartTask发送数据LedTask↓独立运行↓显示系统状态先根据功能划分任务↓再分析任务之间需要传递什么数据↓选择队列、信号量、通知或互斥量↓最后确定任务优先级一个功能随便创建一个任务所有任务全部while(1)职责明确关系清楚该阻塞时阻塞。

2026-08-20 23:28:29 385

原创 FreeRTOS学习(三十四)——多任务同步综合实验

这一节把前面学习过的任务、二值信号量和互斥量组合到了一起。SensorTask↓采集数据↓↓二值信号量↓↓UploadTask任务什么时候运行的问题。Task1↘Mutex↗Task2谁能够使用共享资源的问题。就认为它们作用完全相同。我要通知另一个任务做事↓任务同步我要防止多个任务同时使用一个外设↓资源互斥理解这个区别以后,二值信号量和互斥量在实际工程中就不容易用错了。

2026-08-20 23:24:36 364

原创 FreeRTOS学习(三十三)——生产者消费者综合实验

先不考虑FreeRTOS。1000ms采集一次温度。25℃26℃27℃这些数据需要交给另外一个任务处理。SensorTask生产数据↓Queue↓处理数据生产者消费者保存并传递数据。这一节把前面学习的任务、队列和阻塞机制组合起来,实现了一个简单的生产者消费者模型。产生数据↓↓Queue↓↓处理数据产生数据处理数据保存数据传递数据缓冲生产和消费速度差异传感器采集任务↓队列↓数据处理任务串口接收任务↓队列↓协议解析任务数据采集任务↓队列↓。

2026-08-19 23:01:31 385

原创 FreeRTOS学习(三十二)——CMSIS-RTOS与FreeRTOS的关系

这一节学习了CMSIS-RTOS与FreeRTOS之间的关系。FreeRTOS↓真正的RTOS内核CMSIS-RTOS↓统一的RTOS编程接口用户程序↓↓FreeRTOS↓STM32F407虽然写法不同,但都可以用于创建任务。osDelay();也都是让当前任务延时阻塞。osDelay();我明明使用的是FreeRTOS,为什么代码里面没有xTaskCreate?因为CubeMX可以通过CMSIS-RTOS这一层接口来使用底层FreeRTOS内核。

2026-08-19 21:31:13 257

原创 FreeRTOS学习(三十一)——调试与追踪

这一节学习了FreeRTOS中几个非常实用的调试方法。的返回值。LEDprintf去猜。先看任务状态↓再看优先级和阻塞关系↓再检查Stack和Heap↓最后结合断点定位具体代码掌握这些方法以后,FreeRTOS出现的很多“莫名其妙的问题”,实际上都可以一步一步定位出来。

2026-08-17 09:00:00 436

原创 FreeRTOS学习(三十)——FreeRTOSConfig配置

这一节集中认识了中几个最常见的配置。↓是否使用抢占式调度↓系统Tick频率↓任务优先级数量↓最小任务栈深度参考↓FreeRTOS动态Heap大小↓同优先级任务是否使用时间片↓是否开启软件定时器某个FreeRTOS函数不能使用某个功能没有开启Heap空间不足任务优先级设置异常Tick时间与预期不一致但是也不要为了“功能齐全”,把所有配置全部打开。需要什么↓开启什么这样既能够减少不必要的代码和RAM占用,也更容易理解整个FreeRTOS工程到底使用了哪些功能。

2026-08-16 17:54:50 609

原创 FreeRTOS学习(二十九)——低功耗Tickless Idle

减少不必要的Tick接下来1000ms没有任务需要运行暂时停止周期Tick↓进入低功耗状态↓等待接近任务唤醒时间↓重新恢复Tick进入休眠↓长时间不产生周期Tick↓唤醒这样CPU就可以拥有更长的连续休眠时间。这一节学习了FreeRTOS中的Tickless Idle低功耗机制。任务全部阻塞↓Idle Task运行↓Tick仍然周期产生任务全部阻塞↓计算预计空闲时间↓停止一段时间的周期Tick↓进入低功耗↓定时或中断唤醒↓恢复系统运行让任务运行得更快。

2026-08-16 16:31:39 411

原创 FreeRTOS学习(二十八)——钩子函数与运行时间统计

FreeRTOS运行到某个固定位置↓自动调用用户编写的函数系统进入空闲任务↓调用Idle Hook系统产生一次Tick↓调用Tick Hook我们不需要修改FreeRTOS内核源码,只需要按照规定的函数名称编写函数即可。Task1Task2Task3Task1到底运行了多久?Task2占CPU多少?Task3是不是一直抢占CPU?任务运行时间统计。任务CPU占用情况。这一节学习了FreeRTOS中的钩子函数与运行时间统计。空闲任务运行时执行。系统Tick到来时执行。简单快速。

2026-08-13 18:03:32 189

原创 FreeRTOS学习(二十七)——任务栈与栈溢出检测

Task1,"Task1",128,NULL,2,NULL512Byte1000Byte显然已经超过任务栈空间。栈溢出。这一节学习了FreeRTOS中的任务栈与栈溢出检测。StackType_t数量。128↓↓约512Byte任务的局部变量、函数调用以及任务切换保存的数据都会消耗栈空间。程序跑飞数据异常HardFault观察任务历史上的最小剩余栈空间。栈不能太小↓防止溢出栈也不能盲目设置过大↓避免浪费RAM。

2026-08-12 18:00:00 299

原创 FreeRTOS学习(二十六)——动态内存管理heap_1到heap_5

这一节学习了FreeRTOS中的五种动态内存管理方案。申请内存。heap_1heap_2heap_3heap_4heap_5五种实现方式。heap_1:只申请,不释放heap_2:可释放,但不合并空闲块heap_3:使用malloc/freeheap_4:可释放,并合并相邻空闲块heap_5:支持多个不连续RAM区域heap_4通常是一个比较常用的选择。MCU总RAM≠这一点一定不要混淆。

2026-08-12 13:28:30 342

原创 FreeRTOS学习(二十五)——临界区与调度器锁

一段不能被打断的关键代码。Count++;以后,FreeRTOS会通过屏蔽一定优先级范围内的中断来保护这段代码,因此任务切换也不会在这里正常发生。Count++;退出临界区。暂时不要发生任务切换硬件中断可以正常响应。这时可以暂停FreeRTOS调度器。Count++;其他任务暂时不会被调度运行中断仍然可以正常响应。这一节学习了FreeRTOS中的临界区和调度器锁。它适合保护非常短的关键代码。它暂停的是FreeRTOS任务调度,中断仍然可以继续响应。几条关键代码需要保护↓临界区。

2026-08-11 14:09:12 317

原创 FreeRTOS学习(二十四)——中断安全API(FromISR)

中断服务函数。FromISR专门给中断服务函数使用的FreeRTOS API。这一节学习了FreeRTOS中的中断安全API。专门用于中断环境,不会像普通任务API一样进行阻塞等待。用于判断这次中断操作是否唤醒了需要立即运行的更高优先级任务。则负责在需要时请求中断退出后的任务切换。FromISR↓↓中断通知任务↓发现更高优先级任务已经就绪↓退出中断后尽快切换过去。

2026-08-11 11:06:21 323

原创 FreeRTOS学习(二十三)——消息缓冲区(Message Buffer)

一条消息↓完整存进去↓完整取出来HelloFreeRTOS│ Hello │HelloFreeRTOS两条消息不会混在一起。这一节学习了FreeRTOS中的消息缓冲区。流缓冲区只保存连续字节,而消息缓冲区会保留每一条消息的边界。连续字节流↓独立的数据包↓另外,接收消息时一定要保证接收数组足够大,否则无法成功取出完整消息。

2026-08-10 23:49:47 203

原创 FreeRTOS学习(二十二)——流缓冲区(Stream Buffer)

一个先进先出的字节缓冲区。A B C D EA↓B↓C先进先出(FIFO)的顺序读取。这一节学习了FreeRTOS中的流缓冲区。专门处理连续字节流数据,不需要像队列那样逐个消息发送,因此效率更高,特别适合UART、DMA和TCP等连续数据通信场景。

2026-08-08 15:00:00 356

原创 FreeRTOS学习(二十一)——软件定时器(Software Timer)

到达设定时间↓自动执行指定函数。500ms↓LED翻转1000ms↓发送心跳包不需要单独创建任务,也不占用硬件定时器资源。这一节学习了FreeRTOS中的软件定时器。即定时器回调函数。软件定时器适用于周期执行、超时检测和定时触发等场景,不需要额外创建多个任务,因此相比"一个定时功能对应一个任务"更加节省系统资源。

2026-08-08 09:00:00 634

原创 FreeRTOS学习(二十)——任务通知的多种用法

这一节学习了任务通知的几种常见用法。二值信号量模式:通知任务继续运行;计数模式:记录通知次数;32位数据传递:发送一个整数值;事件标志模式:利用32位通知值表示多个事件。正因为功能丰富、执行效率高、RAM占用少,所以任务通知已经成为FreeRTOS官方推荐的任务间通信方式之一。

2026-08-06 17:13:39 353

原创 FreeRTOS学习(十九)——任务通知(Task Notification)基础

每个任务自带一个"邮箱"。这个邮箱属于任务自己,不需要像队列、信号量那样单独创建对象。Task1│Task2│每个任务都有一个通知值(Notification Value),其他任务或者中断可以向这个任务发送通知。任务通知↓直接通知指定任务而不是像队列一样,所有任务共同访问一个通信对象。这一节学习了FreeRTOS中的任务通知基础。每个任务自带一个通知值,不需要额外创建队列或信号量对象。

2026-08-06 17:07:14 477

原创 FreeRTOS学习(十八)——事件组(Event Group)

一个变量每一位(Bit)表示一个事件。Bit0:按键按下Bit1:串口收到数据Bit2:ADC采样完成Bit3:WiFi连接成功0 1 0 1Bit0事件已经发生Bit2事件已经发生Bit1Bit3还没有发生。Bit0↓KEY_EVENTBit1↓UART_EVENTBit2↓ADC_EVENT0x010x020x04更加容易阅读。这一节学习了FreeRTOS中的事件组。

2026-08-04 14:36:25 311

原创 FreeRTOS学习(十七)——优先级翻转与优先级继承

Task_H高优先级(3)Task_M中优先级(2)Task_L低优先级(1)Task_LMutex开始访问串口。Task_H也需要访问串口。MutexTask_H↓等待Mutex按理来说,只需要等待Task_L执行完,释放互斥量即可。Task_M此时变为就绪态。Task_M优先级 > Task_LTask_MTask_L一直得不到CPU。Task_H↓等待Task_L↓Task_L又一直被Task_M抢占高优先级任务反而等待低优先级任务。优先级翻转优先级继承。

2026-08-04 14:26:40 223

原创 FreeRTOS学习(十六)——互斥量(Mutex)与共享资源保护

多个任务都会访问的资源。USART串口LCD显示屏SPI总线I2C总线全局变量SD卡Task1Task2sk1甚至出现乱码。这就是多个任务同时访问共享资源造成的问题。一把锁谁先使用共享资源。Task1↓获得Mutex↓使用串口↓释放MutexTask2才能获得互斥量继续使用串口。同一时刻只有一个任务能够访问共享资源。这一节学习了FreeRTOS中的互斥量。互斥量最大的作用就是保护共享资源。

2026-08-03 12:19:17 167

原创 FreeRTOS学习(十五)——计数信号量

0、10、1、2、3……N事件发生 → Give → 计数值1事件发生 → Give → 计数值2事件发生 → Give → 计数值3Take → 计数值2Take → 计数值1Take → 计数值0Give增加一次计数,Take减少一次计数。这一节学习了FreeRTOS中的计数信号量。它能够累计多个事件或者表示多个可用资源。如果只是表示一次事件是否发生,使用二值信号量即可;如果需要记录事件发生次数,则可以使用计数信号量。

2026-08-03 10:19:12 442

原创 FreeRTOS学习(十四)——二值信号量

0:没有信号量1:存在信号量LED任务↓等待信号量↓没有信号量↓进入阻塞态按键中断↓释放信号量↓LED任务被唤醒↓获取信号量↓LED翻转任务之间或者中断与任务之间的同步问题。这一节学习了FreeRTOS中的二值信号量。“某个事件已经发生。因此它非常适合按键中断、ADC采集完成、串口接收完成等同步场景。

2026-08-02 13:05:22 222

原创 FreeRTOS学习(十三)——队列与中断

这一节学习了FreeRTOS队列在中断中的基本使用方法。通过和,还可以在中断唤醒更高优先级任务后及时进行任务切换。中断快速获取数据↓队列↓任务完成复杂处理这种方式既能够发挥中断响应速度快的特点,又能避免在中断服务函数中执行大量耗时操作。

2026-08-02 12:56:59 543

原创 FreeRTOS学习(十二)——队列发送与接收

这一节学习了FreeRTOS队列最基本的发送和接收操作。负责把数据发送到队列,负责从队列读取数据。当队列满或者队列为空时,还可以通过等待时间让当前任务进入阻塞态,而不是一直占用CPU查询。发送任务 → 队列 → 接收任务这样不同任务之间既能够交换数据,又不需要直接操作同一个变量。

2026-07-28 10:21:14 262

原创 FreeRTOS学习(十一)——队列基础与xQueueCreate()

队列可以理解成FreeRTOS提供的一个数据缓冲区。任务1:采集数据↓队列↓任务2:处理数据任务1负责产生数据,然后把数据发送到队列。任务2从队列中取出数据进行处理。这样两个任务不需要直接操作对方的数据,实现任务之间的数据传递。这一节主要认识了FreeRTOS队列,并学习了函数。队列可以在不同任务之间传递数据,最常见的工作方式是先进先出。创建队列时,需要指定队列长度以及每个队列元素的大小,创建成功以后会得到一个类型的队列句柄。同时需要注意,FreeRTOS队列默认传递的是数据副本。

2026-07-27 22:39:31 334

原创 FreeRTOS学习(十)——空闲任务与系统节拍Tick

Idle Task也就是空闲任务。0属于最低优先级任务。我们不需要自己使用创建它。时间过去了多久才能实现任务延时和周期调度。Tick也就是系统节拍。SysTick产生FreeRTOS系统节拍。例如在每秒产生1000个Tick这一节学习了FreeRTOS中的空闲任务和系统节拍Tick。启动调度器以后,FreeRTOS会自动创建最低优先级的Idle Task。当我们创建的任务全部处于阻塞状态时,CPU就会执行空闲任务,同时空闲任务还承担被删除任务资源回收等系统工作。

2026-07-27 21:09:49 340

原创 FreeRTOS学习(九)——任务优先级修改与任务信息获取

这一节学习了任务优先级修改和几个基本的任务信息获取函数。可以获取任务当前优先级。可以在程序运行过程中修改任务优先级。另外还可以通过获取任务名称,通过获取当前任务句柄。这些函数除了用于控制任务,也非常适合后期调试FreeRTOS程序,帮助我们判断当前任务到底处于什么运行状态。

2026-07-26 15:45:00 232

原创 FreeRTOS学习(八)——任务删除(vTaskDelete)的使用

这一节学习了FreeRTOS任务删除函数。删除任务可以分为两种方式:删除当前任务和删除指定任务。删除后,任务立即退出调度,不再获得CPU执行权,而动态内存资源通常由空闲任务负责回收。在实际工程中,初始化、自检等一次性任务完成后,通常都会调用主动退出,而长期运行的通信、采集、控制等任务一般不会删除,而是一直在while(1)循环中运行。下一节开始学习任务优先级修改与任务信息获取,介绍如何在程序运行过程中动态修改任务优先级,以及获取当前任务名称、优先级等信息。

2026-07-26 13:00:00 178

原创 FreeRTOS学习(七)——任务挂起与恢复

这一节学习了FreeRTOS中的任务挂起与恢复。可以让指定任务进入挂起状态,任务不会继续参与调度;可以让挂起的任务重新进入就绪态,等待调度器再次运行。需要特别注意的是,挂起和阻塞并不相同。阻塞会在等待条件满足后自动恢复,而挂起必须由程序主动调用恢复函数,否则任务将一直保持暂停状态。下一节开始学习任务删除,介绍如何释放一个已经完成工作的任务,以及删除任务时需要注意的问题。

2026-07-25 23:40:38 255

原创 FreeRTOS学习(六)——任务句柄(TaskHandle_t)的作用与使用

NULL表示不保存这个任务的句柄。实际上,这个参数是一个输出参数,用来接收新创建任务的任务句柄。这里分别定义两个任务句柄。以后创建任务时,就把句柄保存下来。这一节学习了FreeRTOS中的任务句柄。任务句柄本质上是任务控制块(TCB)的指针,可以理解为每个任务唯一的"身份证"。如果后续需要挂起、恢复、删除任务,或者修改任务优先级,都必须先获得对应任务的句柄。对于不会进行任何控制的任务,可以直接把最后一个参数写成NULL;

2026-07-25 23:28:17 298

原创 FreeRTOS学习(五)——任务优先级与时间片调度

CPU连续分配给一个任务运行的一小段时间。1000Hz在开启时间片调度的情况下,相同优先级任务通常每经过一个系统Tick,就有机会发生任务切换。或者等待队列、信号量等资源,那么即使时间片还没有结束,CPU也会立即切换到其他任务。这一节学习了FreeRTOS任务优先级和时间片调度机制。创建任务时,第五个参数决定任务优先级,数字越大,优先级越高。当多个任务同时处于就绪状态时,调度器总是优先运行高优先级任务。

2026-07-24 17:00:00 301

原创 FreeRTOS学习(四)——vTaskDelay()与vTaskDelayUntil()的区别

这一节学习了FreeRTOS两个最常用的延时函数。按照当前时间开始延时,实现简单,适合普通任务。按照固定周期运行,不会因为任务执行时间产生累计误差,更适合实际工程中的周期性任务。后续学习队列、信号量、软件定时器等内容时,也会经常结合实现固定周期任务,因此建议尽早掌握它的使用方法。下一节开始学习FreeRTOS任务优先级与时间片调度机制,理解为什么高优先级任务可以抢占低优先级任务,以及相同优先级任务之间是如何轮流运行的。

2026-07-24 09:08:22 431 1

原创 FreeRTOS学习(三)——任务状态和调度器运行过程

启动FreeRTOS任务调度器。任务调度器的作用是判断当前有哪些任务可以运行,并从中选择一个任务交给CPU执行。当调度器启动后,task1和task2进入FreeRTOS的任务调度过程。调度器会根据任务的优先级和当前状态,决定CPU接下来执行哪个任务。这一节学习了FreeRTOS任务的四种基本状态:运行态表示任务正在占用CPU;就绪态表示任务已经可以运行,正在等待CPU;阻塞态表示任务正在等待延时或者某个事件;挂起态表示任务被人为暂停。在LED点灯程序中,任务执行。

2026-07-20 10:45:00 451

原创 FreeRTOS点灯(2)——创建两个LED点灯任务

这一节创建了两个简单的LED点灯任务。整个程序的基本流程为:编写任务函数;使用创建任务;判断任务是否创建成功;调用启动任务调度器;FreeRTOS根据任务状态调度两个LED任务运行。通过这个实验可以直观地看到,FreeRTOS并不是让一个任务执行结束后再执行另一个任务,而是在任务阻塞、就绪和运行等状态之间进行切换,从而实现多个任务的并发运行。

2026-07-19 12:23:57 284

原创 《STM32串口接收的两种方式:回车换行符 vs 空闲中断》

提示:以下是本篇文章正文内容,下面案例可供参考。

2026-04-11 15:41:25 70

原创 FreeRTOS点灯(1)

对FreeRTOS任务创建函数的理解

2026-04-04 15:14:24 380

空空如也

空空如也

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

TA关注的人

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