自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 I2C(Inter-Integrated Circuit)通信

I2C是一种两线制、低速串行通信总线,用于MCU和其他外围设备的通信,通常是一主多从也可以多主多从。主要有两条链路:串行数据线(SDA)、串行时钟线(SCL)。图1 I2C通讯设备连接图。

2026-04-10 10:32:22 216

原创 STM32的BOOT启动模式

在我们日常嵌入式软件开发的过程中,少不了烧录程序。烧录程序其实也就是把程序写到一块内存中去。那么问题来了,程序写到哪块内存,STM32又是怎么找到这块内存的呢?我们知道,STM32内置有Flash以及SRAM。简单理解就是程序写好之后可以选择烧录到FLASH或者SRAM,通过BOOT选择STM32的启动模式,让STM32去对应的地址找到程序并启动。

2026-03-30 14:49:50 405

原创 BMS(Battery Management System)电池管理系统

锂电池就是锂离子电池,是铅酸电池后的新一代电池主力军,此外还有钠离子电池也在发展。锂电池分为三元锂(汽车)和磷酸铁锂电池两大类,特性上和电参数有差异,对应的BMS也需要进行调整【BMS需要根据具体采购的锂电池进行细节调参】。锂电池外观上有很多种,比如:薄片电池、18650电池(常用)、特殊的如BYD的刀片电池(一体式封装,体积更小,能量密度更高)等。各种电池特性:1、三元锂电池【汽车多用】:三种元素和锂构成(镍钴锰、镍钴铝)能量密度高、车辆续航长;耐低温性好,-20℃以下放电性能衰减20%(较好)

2026-03-29 11:17:48 519

原创 FreeRTOS-CPU使用率统计

如下:

2026-03-22 23:47:21 352

原创 FreeRTOS-中断管理

也就是说,在临界段之中,高于basepri的中断也可以被响应。

2026-03-22 15:16:43 367

原创 FreeRTOS-内存管理-1

多用于图形显示、GUI等,

2026-03-21 13:33:43 364

原创 FreeRTOS-任务通知-1

FreeRTOS每个任务都有一个32位的通知值,大多数情况下,任务通知可以代替二值信号量、计数信号量、事件组,也可以代替长度为1的队列(可以保存一个32位整数或指针值)。相比与以前使用FreeRTOS内核通信资源,必须创建队列、二进制信号量、计数信号量或事件组的情况,使用任务通知显然更灵活。。任务通知无序创建队列,但是使用之前需要把FreeRTOSConfig.h中的config_USE_TASK_NOTIFICATIONS设置为1.以上,可以把任务通知一定程度替代信号量、队列、事件组等。

2026-03-19 16:40:47 357

原创 FreeRTOS-软件定时器-2

摘要:FreeRTOS软件定时器通过控制块管理,需先创建后使用。创建函数xTimerCreate()可动态申请内存并初始化定时器参数(名称、周期、模式、ID、回调函数等)。定时器创建后处于休眠状态,需通过xTimerStart()等函数激活,这些函数通过"定时器命令队列"向定时器任务发送指令。定时器任务在系统调度时自动创建,负责处理定时器命令并执行回调函数。还提供了中断版本函数(如xTimerStartFromISR())及停止函数(xTimerStop())。使用时需在FreeRTOS

2026-03-18 01:59:38 397

原创 FreeRTOS-软件定时器-1

定时器是指从指定时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义定时器的周期和频率。是芯片本身提供的定时功能。一般由,芯片向软件模块提供一组配置寄存器,接收控制输入,到达设定时间后芯片中断控制器产生时钟中断(Systick)。。,构建在硬件定时器基础之上,使得系统能够提供,功能与硬硬件定时器类似。软件定时器被创建之后,经过设定的时钟计数值后触发用户定义的回调函数。定时精度与系统时钟有关,一般用SysTick作为软件定时器基础时钟。

2026-03-17 11:32:52 410

原创 FreeRTOS-事件-2

事件标志组存储在一个EventBits_t类型的变量中,宏configUSE_16_BIT_TICKS定义为1,变量uxEventBits就是16位的,其中8个位用来存储事件组;宏configUSE_16_BIT_TICKS定义为0,变量uxEventBits就是32位的,其中24个位用来存储事件组。STM32中是32位的。此外,FreeRTOS还使用了一个链表来记录等待事件的任务,所有等待此事件的任务均会被挂载在等待事件列表。

2026-03-17 01:02:08 415

原创 FreeRTOS-事件-1

事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。与信号量不同的是,它可以实现一对多、多对多的同步:一个任务可以等待多个时间的发生:可以是任意一个时间发生时唤醒任务进行事件处理;也可以是几个事件都发生后进行事件处理。同样也可以是多个任务同步多个事件。每一个事件组只需要很少的RAM空间来保存事件组的状态。事件组存储在一个EventBits_t类型的变量中,该变量在时间组结构体中定义。

2026-03-16 13:10:17 371

原创 FreeRTOS-互斥量-2

(出队消息);当结构体用于。

2026-03-15 23:48:35 385

原创 FreeRTOS-互斥量-1

互斥量就是互斥信号量,是一种。不同的是,它支持,常用于实现对临界资源的独占式处理。互斥量只有两种状态:开锁和闭锁。开锁就是互斥量没有被任务获取;闭锁就是互斥量被任务获取。互斥量支持:持有互斥量的任务可以再次获得这个锁而不被挂起。通常其他信号量中,由于已经不存在可用的信号量,任务递归获取信号量时会发生主动挂起任务从而导致死锁。用于互锁的互斥量常用于充当保护资源的令牌,当一个任务希望访问某个资源时,必须先获取令牌;当任务使用完资源后,必须归还令牌。

2026-03-14 09:39:54 366

原创 FreeRTOS-信号量-2

信号量其实就是,大部分代码和函数都是消息队列的函数的展开宏。这些宏定义子啊semphr.h文件中,如果使用信号量或者互斥量需要包含semphr.h头文件。

2026-03-14 07:30:13 371

原创 FreeRTOS-信号量-1

信号量是一种实现任务间通信的机制,可以实现任务之间同步或者临界资源的互斥访问,常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中,各任务之间需要同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。抽象的来说,信号量是一个非负整数,所有获取它的任务都会将该整数减一(获取信号量是为了使用信号量对应的资源),当该整数值为0时,所有视图获取它的任务都将处于阻塞状态。通常一个信号量的计数值用于对应有效的资源数,表示剩下的🉑被占用的互斥资源数。也就是说:0。

2026-03-13 17:32:06 365

原创 FreeRTOS-消息队列-2

系统创建消息队列的时候,会同时创建一个消息队列控制块,由多元素组成,保存消息队列的一些信息:如消息的存储位置,头指针 pcHead、尾指针 pcTail、消息大小uxItemSize 以及队列长度 uxLength,以及当前队列消息个数uxMessagesWaiting 等。(1)pcHead指向消息独立的消息存储区起始地址(队尾、第一个消息空间)。(2)pcTail指向消息队列的消息存储区结束位置地址(队首)。(3)pcWriteTo指向下一个可用的消息空间。

2026-03-13 12:25:10 314

原创 FreeRTOS-消息队列-1

队列,也叫消息队列,是一种常用于任务间通信的数据结构。可以实现任务与任务之间、中断和任务之间传递信息,让任务能够接受来自其他任务或中断的不固定长度信息,以及读取消息队列中的消息。消息队列是一种。任务或者中断服务例程可以将一条或者多条消息放入消息队列中,同样,一个或多个任务可以从消息队列中获取消息。当多个消息发送到消息队列的时候,通常是将先进入队列的消息传给任务,也就是说,任务先得到的是最先进入消息队列的消息,即先进先出原则(FIFO),但是也支持后进后出原则(LIFO)。

2026-03-12 13:55:37 359

原创 FreeRTOS任务管理-1

FreeRTOS的任务可以认为是一系列独立任务的集合。每个任务在自己的环境中运行。在任何时刻,只有一个任务得到运行,FreeRTOS调度器决定运行哪个任务。任务调度器负责任务的切入切出时保存上下文环境。也就是说,每个任务都有自己的栈空间,当任务切出时,,这样当任务下次运行时,就可以从堆栈中恢复上次的运行环境。任务的栈是被存储到RAM中的,所以FreeRTOS可以运行多少个任务,取决于系统可用的SRAM。,高优先级的任务可以打断低优先级的任务,低优先级任务必须在高优先级任务阻塞或结束后才可以调度。

2026-03-12 13:11:09 359

原创 FreeRTOS创建任务

FreeRTOS创建任务的方法有两种分别是静态创建和动态创建。用的比较多是动态创建。下面简单讲一下两种创建方法以及其实现步骤。

2026-03-11 00:18:24 39

原创 FreeRTOS的下载和移植-1

在开始之前,我们需要准备一个STM32的裸机工程模版,可以选硬件配套的固件库例程。两个下载链接:1、官网:http://www.freertos.org/2、代码托管网站:https://sourceforge.net/projects/freertos/files/FreeRTOS/在下载的压缩包中,主要的内容就是其中的FreeRTOS文件夹,如下:点开之后是这样的:FreeRTOS为了推广自己,写了一些例程方便使用者参考。Demo文件夹中放的是一些半导体厂商的评估板写好的完整工程程序,具有很大的参考价值

2026-03-09 22:32:31 412

原创 FreeRTOS支持时间片

所谓的时间片功能,就是同一个优先级下可以有多个任务,每个任务轮流地享有相同的CPU时间,享有CPU的时间被称为时间片。在RTOS中,最小的时间单位是一个tick,也就是SysTick的一个中断周期。而FreeRTOS的时间片就是一个tick。也可以这么理解:每一个tick下,CPU运行同一优先级下的不同任务,每个任务一个tick。

2026-03-09 01:31:06 348

原创 任务延时列表

在task.c中定义,如下:(1)(2)FreeRTOS定义了两个任务就绪列表,当系统时基计数器xTickCount没有溢出时,就用一条列表,当xTickCount溢出(xTickCount是一个uint32_t类型的数据,计时太久会超过该数据类型的最大值,也就是溢出)则用另外一条列表。(3)任务延时列表指针,指向xTickCount没有溢出时使用的列表。(4)任务延时列表指针,指向xTickCount溢出时使用的列表。这玩意是task.c中的一个静态变量,用来表示下一个任务的解锁时刻。

2026-03-09 00:24:28 316

原创 FreeRTOS的多优先级-2

前面完成了最高优先级任务的寻找。下面则需要把任务创建等相关代码修改成支持高优先级的版本。

2026-03-08 11:30:42 340

原创 FreeRTOS的多优先级(1)

在FreeRTOS中,数字优先级越小,逻辑优先级越高。也就是说优先级1的任务比优先级2的任务更优先。

2026-03-08 01:50:52 334

原创 空闲任务与阻塞延时的实现

通过静态创建任务的方式,定义空闲任务的栈,预先定义好空闲任务的栈空间。TCB_t是系统定义的任务控制块数据类型,具体看我之前任务的创建与切换那篇。

2026-03-07 14:34:52 386

原创 临界段的保护

临界段就是一段在执行的时候不能被中断的代码(也就是说,执行这段代码之前需要关闭中断,执行完之后开启中断)。在FreeRTOS里面,这个临界段最多的就是对全局变量的操作,因为全局变量是每个任务都可以操作的,但是在某一个任务对使用该全局变量时,其他任务不能修改该全局变量的值。因此需要临界段保护该代码不被中断。但也有特殊情况可以打断临界段:1.系统调度。2.外部中断。在FreeRTOS中,系统调度就是产生PendSV中断,在PendSV Handler里面实现任务的切换,其实也就是中断。所以,

2026-03-07 00:20:07 362

原创 任务的定义与任务的切换的实现-2

FreeRTOS任务创建与切换的实现

2026-03-05 13:52:50 405

原创 任务的定义与任务切换的实现-1

在裸机系统中,全局变量,局部变量,中断返回等都存储在一个叫栈的地方。栈其实就是单片机RAM中一段连续的内存空间,其大小一般在启动文件中或者链接脚本中指定,最后由C库函数_main进行初始化。然而,多任务系统中,每个任务都是独立的,互不干扰的,因此需要为每一个都分配独立的栈空间,这个栈空间通常是一个预先定义好的全局数组(静态创建),也可以是动态分配的一段内存空间(动态创建),这些栈空间都储存在RAM中。

2026-03-05 02:26:35 345

原创 数据结构-列表与列表项

野火的资料讲的很形象,用圆形晾衣架比较,晾衣架本身就是链表,每一个钩子就是节点。节点本身不能存储很多数据,但是节点却可以挂很多数据。什么意思?用一个实际的单向链表举例:如图是一个单向链表,每一个节点都有一个指针指向下一个节点,除了这个指针之外,节点本身还可以带一些信息。链表有两种实现方式:1.节点结构体中有指针也有数据可以看到节点是用一个结构体实现的,其中包括指针和节点,第一行就是一个结构体指针,指向下一个节点,其他就是节点本身携带的信息。

2026-02-13 22:37:45 556

原创 Freertos前置:裸机系统和多任务系统

常见的裸机系统有轮询系统和前后台系统,如下。有嵌入式基础的小伙伴们都知道,我们在用keil编程的时候会写一个死循环,一方面可以让系统停住,另一方面可以往里面写代码让单片机不断地多次轮番执行其中代码。这其实就是轮询系统。轮询系统就是在裸机编程的时候,先初始化好相关硬件,然后让主程序在一个死循环里不断循环,按顺序的完成多个任务(轮询响应任务,轮询处理任务)。这种系统通常只适用于只需要顺序执行且不需要外部事件驱动就能完成的事情。轮询系统的示例代码如下:轮询系统适用于LED翻转,串口输出,液晶显示等等。但是当其中加

2026-02-05 01:07:18 1025

原创 Word文档损坏的修复方法:“Word无法打开该文件,因为文件格式与文件拓展名不匹配”以及“Microsoft Word无法从该位置打开扩展名为 .asd的文件。...”

先点击左边选择“保存”,然后在在保存这个页面中找到我们需要的“自动恢复文件位置”。也就是红框中的文件位置:“C:\Users\Administrator\AppData\Roaming\Microsoft\Word\”(具体地址看自己电脑的)但有一些比较内敛的文件还是不太愿意被打开,比如我的开题报告。:“Microsoft Word无法从该位置打开扩展名为.asd的文件。之后我们把无法打开的文件复制到该文件底下就可以打开啦!这时候只需要把文件的扩展名从“.docx”改成“.doc”,再试试打开文件。

2025-12-05 20:01:24 529

原创 各种显示器

今天学习STM32的LCD控制忽然发现自己连液晶显示器是什么都不知道,马上去科普了一下各类显示器。CRT显示器阴极射线管显示器CRT显示器学名为“”,是一种使用(Cathode Ray Tube)的显示器。(Shadow mask)、高压和涂层(Phosphor)及玻璃外壳。CRT显示器就是我们以前用的“大头”显示器,不知道大家见过没有hhh。一大个脑袋的,体积大,功耗也大,现在基本上见不到了。

2025-11-28 10:39:34 419

原创 STM32学习:FSMC 外设扩展SRAM

FSMC_NE比较特殊,STM32在访问指定地址的内容的时候,对应的FSMC_NE引脚会被STM32自动拉低,从而可以实现STM32连接多个外部扩展SRAM。在程序里,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容,FSMC 外设会自动完成数据访问过程,读写命令之类的操作不需要程序控制。如下图,FSMC控制器的地址映射直接映射到内核的地址映射,不需要额外的命令或信号进行通讯。小块地址区域,访问对应的地址FSMC就会把对应的FSMC_NE信号线拉低电平。

2025-11-26 13:01:56 591

原创 STM32报错记录

然后点击最下面的Generate,对应的证书代码就会生成到蓝色框中。然后把这个蓝色框的代码复制到上图License Management的绿色框中,点击Add LIC就完成激活啦!L6047U报错对应的意思是代码编译超出当前Keilv5版本的编译范围(其实就是没给钱,免费版不让编译这么大的代码)。在学习STM32F406ZGT6的FatFs文件系统时,遇到了Keilv5代码L6047U的报错。2.获取你电脑Keilv5的CID,首先点击左上角File,然后找到License Management。

2025-11-26 10:34:32 325

原创 各种数据在内存里面的存储

最后是尾数位M,也就是图中的有效数字。总而言之,忽略有效数字M小数点左边的1可以得到尾数位M(25.25=11001.01=1.100101*2^4,有效数字为1.100101,忽略小数点左边得到100101,这里是低位补0,存储在内存中就是10010100000......一共23位)还有一个小问题,就是文中用25.25举例,得到尾数位只有100101一共六位,而在其他情况中尾数可能有很多位(比如0.14转换为二进制时一直乘2也的不到一个1.0),这个时候尾数位的个数就决定了数据的精度。

2025-11-23 12:54:54 565

原创 基于Transformer的深度学习模型推理计算量与模型参数量的关系

表示输入文本的tokens。【Tips:科普一下,残差流是指Transformer各层之间流动的核心数据】这里忽略了查词汇表和位置embedding。,于是我们可以忽略掉输入文本上下文依赖性对于计算量的影响,也就是说最终得到。将Transformer架构的超参数分为以下几种:1. 模型层数(这里的2源自于矩阵乘法中的乘和加操作。) 5. 每层多头注意力维度() 4. 注意力层输出维度(定义一个总的模型参数量。) 3.前馈层维度(

2025-11-11 10:29:54 256

空空如也

空空如也

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

TA关注的人

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