- 博客(24)
- 收藏
- 关注
原创 串口+DMA:固件库踩坑日记
表明是USART1的RXNE事件唤起DMA1_Chanal5开启转运。USART_ClearITPendingBit()函数只是手动清除SR寄存器,此前DMA转运过DR寄存器数值,但是顺序是反的!传输速度过快,处理速度慢时,会出现先接收数据被覆盖。
2025-07-22 21:15:52
410
原创 Freertos源码分析:任务创建/删除
FreeRTOS 中任务创建通过或实现。动态创建()会自动分配任务栈和TCB(任务控制块),静态创建()需用户预分配内存。参数校验:检查栈深度、任务函数指针等有效性。内存分配:调用分配TCB和栈空间。TCB初始化:填充任务名、优先级、栈指针等字段。栈初始化:调用模拟中断压栈,构造初始上下文。任务就绪:将任务加入就绪列表,触发调度(若调度已启动)。任务删除流程:任务删除通过实现,支持删除其他任务或自身(传参NULL删除后资源需由空闲任务回收。任务状态检查:若删除自身标记为待删除状态并触发调度;
2025-07-17 01:02:14
447
原创 OLED 多级目录-树的方式实现
(箭头应都为双向,表示是双向链表)大概逻辑就是这样,后续需要设置亮度/时钟可以再加相应代码,这个代码只实现了不同目录的切换。单片机驱动OLED时只需要将cout输出改为OLED输出即可!
2025-07-16 04:04:31
234
原创 STM32寄存器操作:USART
STM32的USART(通用同步异步收发器)模块通过寄存器配置实现串行通信。关键寄存器包括控制寄存器(CR1/CR2/CR3)、状态寄存器(SR)、数据寄存器(DR)、波特率寄存器(BRR)等。直接操作寄存器可精细控制通信参数和状态。中断的配置应分为三部分:第一部分usart的中断使能,EXIT的的常用的就是第4位的空闲中断和第5位的接收完成中断;第4位的中断信号是在接收完成后一段时间内再也没有数据接收了就会被触发,所以叫做空闲中断的使能;而第5是接收中断,也就是每次接收完一个字符后就会触发一次中断。
2025-06-19 01:46:49
2296
原创 STM32寄存器操作:EXIT
固件库函数:EXTI_GetITStatus(EXTI_Line14),就是依据PR寄存器和IMR寄存器判断中断是否发生。这里只用配置ISER中断使能寄存器组和IPR中断优先级控制寄存器组(抢占优先级,比较优先级)GPIO模式配置为输入模式(上拉,下拉,还是开漏自己按情况选),注意输入没有复用选项。(2)配置触发选择寄存器EXTI_RTSR(上升沿)、EXTI_FTSR(下降沿)(1)配置中断屏蔽寄存器EXTI_IMR,相应标志位置1(不屏蔽该线信号)(3)挂起寄存器(EXTI_PR)
2025-06-16 04:40:16
1725
原创 STM32寄存器操作:GPIO
STM32的GPIO(通用输入输出)寄存器操作是硬件级控制的基础,通过直接配置寄存器可实现高效、灵活的引脚控制。主要涉及以下寄存器:RCC重映射:: 模式寄存器(输入/输出/复用/模拟): 输出类型寄存器(推挽/开漏):输出速度寄存器: 上拉/下拉寄存器GPIOx_IDR: 输入数据寄存器GPIOx_ODR: 输出数据寄存器GPIOx_BSRR: 置位/复位寄存器(原子操作)GPIOx_LCKR。
2025-06-16 01:12:34
539
原创 STM32内存分配
段主要有bss .data .textbss段(bss segment)通常是指用来存放程序中未初始化的全局变量,静态变量的一块内存区域。bss段属于静态内存分配。数据段(data segment)通常是指用来存放程序中已初始化的全局变量,静态变量的一块内存区域。数据段属于静态内存分配。代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。
2025-06-15 23:02:47
592
原创 FreeRTOS启动流程以及任务调度
FreeRTOS的启动流程通常分为硬件初始化和操作系统初始化两个阶段。以下是典型启动流程:硬件初始化阶段由用户完成,包括时钟配置、外设初始化、堆栈设置等。通常需要在main()函数中调用硬件相关的初始化函数。操作系统初始化阶段由FreeRTOS完成。调用启动调度器,此函数会初始化内核组件(如任务列表、空闲任务、定时器任务等),并启动第一个任务。
2025-06-15 03:47:50
569
原创 FreeRTOS源码分析:heap
configTOTAL_HEAP_SIZE:定义堆总大小 configAPPLICATION_ALLOCATED_HEAP:允许用户自定义堆位置 configHEAP_CLEAR_MEMORY_ON_FREE:释放时清零内存。最简单的内存分配方案,仅支持pvPortMalloc()不支持vPortFree()。FreeRTOS提供5种堆内存管理方案(heap_1.c至heap_5.c),每种方案针对不同应用场景设计,源码位于。支持内存分配与释放,使用最佳匹配算法但会产生碎片。通过挂起调度器保证原子操作。
2025-06-14 22:47:59
987
原创 FreeRTOS链表分析
FreeRTOS中的链表采用双向链表结构,主要用于任务调度、事件管理、队列操作等核心功能。其实现特点是轻量高效,通过指针直接嵌入数据结构中,避免动态内存分配。主要代码位于list.c和list.h文件中。
2025-06-14 01:46:00
512
原创 FreeRTOS任务切换,现场保护(M3,M4内核)
删除当前任务时,任务实际在idle函数中被删除,在DeleteTask()函数中实际完成的是链表从ReadyList移除,uxDeletedTasksWaitingCleanUp增加,告诉idle任务,有任务需要删除,idle任务在xTasksWaitingTermination链表中找到要删除的TCB,释放其申请的空间。此图中除了pc,lr,sp,fp之外,r4-r11并不用被保存,所以接下来保存fun1的形参(str r0,[xxxxxx])。),包含任务栈指针、优先级、状态链表项等关键字段。
2025-06-13 21:27:09
914
原创 FreeRTOS源码分析:软件定时器-Timer
二.xTimerStart()/xTimerStop()/xTimerStartFromISR()/xTimerStopFromISR()FreeRTOS 的软件定时器是一种基于系统节拍(tick)的机制,允许用户创建和管理定时任务。回调函数在服务任务上下文中运行,需注意:避免阻塞操作(可能影响其他定时器)。通过分析源码可优化定时器使用场景,例如高精度需求需结合硬件定时器。定时器通过链表组织,服务任务按到期时间排序管理。在中断中开启软件定时器定时。在中断中停止软件定时器定时。动态方式创建软件定时器。
2025-06-12 23:10:31
456
原创 FreeRTOS软件定时器使用以及例程
FreeRTOS的软件定时器(Software Timer)提供了一种基于系统节拍(Tick)的定时功能,允许创建周期性或单次触发的定时任务。软件定时器由内核调度,通过回调函数实现定时逻辑,适用于低精度定时场景(如秒级或毫秒级)。软件定时器是基于 FreeRTOS 内核提供的时间管理功能实现的,允许开发者创建、启动、停止、删除和管理定时器,从而实现在任务中对时间的灵活控制。软件定时器硬件定时器FreeRTOS提供的功能来模拟定时器,依赖系统的任务调度器来进行计时和任务调度。
2025-06-12 16:52:11
922
原创 FreeRTOS源码分析:任务通知-TaskNotify
任务通知是FreeRTOS提供的一种轻量级通信机制,允许任务间直接发送事件或数据。相比队列、信号量等传统IPC机制,任务通知更高效,因为其直接操作任务控制块(TCB)中的通知字段,无需额外数据结构。
2025-06-12 00:29:05
854
原创 FreeRTOS任务通知使用以及例程
任务通知是FreeRTOS提供的一种轻量级通信机制,允许任务间直接发送事件或数据,无需创建队列、信号量等中间对象。每个任务拥有独立的通知值(32位)和状态标志,效率高且节省内存。任务通知通常用于替代二值信号量或事件标志组,提供了更轻量级的任务间通信方式。大多数任务间通信方法通过中间对象,如队列、信号量或事件组。发送任务写入通信对象,接收任务从通信对象读取。使用任务通知时,发送任务直接向接收任务发送通知,而无需中间对象。(相当直接发到别人的邮箱里,缺点:只能一对一或者多对一)。
2025-06-11 03:08:25
1093
原创 FreeRTOS源码分析:事件标志组-EventGroup
证实了之前的猜想,之所以事件组的API不关中断只关闭调度器是因为其ISR相关函数并不会在中断中直接修改事件组的成员,而是在中断结束后接着开启一个守护进程,完成事件组标志位或者链表的相关操作。等待任务的唤醒在vTaskRemoveFromUnorderedEventList()函数中完成,将等待任务放入ReadyList中,同时将事件组结构体中相应的链表项移除.可以发现事件组的操作不再基于消息队列。
2025-06-10 20:20:20
880
原创 FreeRTOS事件标志组使用以及例程
当在嵌入式系统中运行多个任务时,这些任务可能需要相互通信.允许任务等待多个事件中的任意一个或全部事件发生FreeRTOS中的事件标志组(Event Flags Group)提供了一种轻量级的机制,用于在任务之间传递信息和同步操作,每个事件由二进制标志表示,支持“与”和“或”逻辑触发。如果设置为 1,则事件组内实现的位数(或标志数)为 8;如果设置为 0,则为 24(这个宏另外作用系统时钟节拍计数使用 TickType_t 数据类型定义的。
2025-06-09 04:28:41
866
原创 FreeRTOS源码分析:信号量-semaphore
FreeRTOS 中的信号量是一种用于任务间同步或资源管理的机制,分为二进制信号量、计数信号量和互斥信号量(Mutex)。信号量的实现基于队列机制,核心源码位于queue.c和semphr.h中。信号量是队列的一种特殊形式,队列长度为信号量计数最大值。信号量的释放和获取通过队列的发送和接收实现。互斥信号量通过优先级继承解决优先级反转问题。
2025-06-08 20:26:44
751
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1