- 博客(42)
- 收藏
- 关注
原创 CAN协议
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传终端电阻至关重要:无论长度和速率如何,必须在总线两端的节点上安装终端电阻。这是为了匹配电缆的特性阻抗(通常为120欧姆),消除信号反射。没有正确的终端匹配,高速通信根本无法稳定。总线两端各连接一个120欧的电阻,两根信号线形成回路。这种CAN总线网络由ISO 11898标准定义,是高速、短距离的CAN网络,通信速率为125kbit/s到1Mbit/s。在1Mbit/s通讯速率时,总线长度最长达40m。两根信号线独立,各自串联一个2.2k欧的电
2026-03-12 22:11:46
558
原创 FreeRTOS#15——低功耗tickless
但是这样 在系统定时器产生中断时,也会将MCU从低功耗模式中唤醒,而频繁的进入/唤醒低功耗模式使得MCU无法进入深度睡眠,于是Freertos 在进入休眠前会判断下一个任务唤醒事件是否大于configEXPECTED_IDLE_TIME_BEFORE_SLEEP定义值。主要的难点在于,MCU 进入相应的低功耗模式后,通过计算下次就绪任务唤醒事件,计算 MCU 进入相应低功耗模式的时间,后续弥补这部分系统时间。FreeRTOS通过分析任务状态来计算可进入低功耗的时间。
2026-03-05 08:42:44
326
原创 FreeRTOS#13——软件定时器
configUSE_TIMERSconfigTIMER_TASK_PRIORITYconfigTIMER_QUEUE_LENGTHconfigTIMER_TASK_STACK_DEPTHxTimerCreate()xTimerCreateStatic()xTimerStart()xTimerStartFromISR()xTimerStop()xTimerStopFromISR()xTimerReset()xTimerResetFromISR()xTimerChangePeriod()xTimerChange
2026-03-05 08:42:19
44
原创 FreeRTOS#11——中断管理
FreeRTOS 依赖 BASEPRI 控制中断 ,只有被管理的优先级可以调用FromISR结尾的API函数。cortex-M3为例。
2026-03-05 08:41:51
58
原创 FreeRTOS#10——信号量
xSemaphoreCreateBinary()xSemaphoreCreateBinaryStatic()xSemaphoreTake()xSemaphoreTakeFromISR()xSemaphoreGive()xSemaphoreGiveFromISR()vSemaphoreDelete()事件计数资源共享xSemaphoreCreateCounting()xSemaphoreCreateCountingStatic()xSemaphoreTake()xSemaphoreTakeFromISR()x
2026-03-04 08:49:47
348
原创 FreeRTOS#9——消息队列
在队列被上锁后,可以往队列中写入消息和读取消息,但是队列消息的读取和写入不会影响到队列读取和写入阻塞任务列表中的任务阻塞,队列的写入和读取阻塞任务列表会在队列解锁后,统一处理。使用队列进行任务之间的“沟通交流”时,一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集。使用队列集的好处在于,队列集可以使任务同时读取多个队列中的消息,而无需遍历所有待读取的队列,以确定具体读取哪一个队列。
2026-03-04 08:49:36
368
原创 FreeRTOS#8——事件标志组
事件标志是一个用于指示事件是否发生的布尔值,一个事件标志只有 0 或 1 两种状态FreeRTOS 将多个事件标志储存在一个变量类型为 EventBits_t 变量中,这个变量就是事件组事件组是一组事件标志的集合,一个事件组就包含了一个 EventBites_t 数据类型的变量。
2026-03-04 08:49:13
65
原创 FreeRTOS#7——任务通知
任务通知有三种状态,分别为未等待通知状态、等待通知状态和等待接收通知状态,其中未等待通知状态为任务通知的复位状态;当任务在没有通知的时候接收通知时,在任务阻塞等待任务通知的这段时间内,任务所等待的任务通知就处于等待通知状态;任务通知功能所使用到的任务通知数组和任务通知状态数组为任务控制块中的成员变量,因此任务通知的传输是直接传出到任务中的,不同通过中间媒介 即 任务的通讯对象(队列、事件标志组和信号量就属于通讯对象)这个间接的方式。而任务通知状态数组中的元素则表示与之对应的任务通知的状态。
2026-03-04 08:49:01
320
原创 FreeRTOS#6——任务API
判断新创建的任务是否为第一个任务 (pxCurrentTCB指向当前优先级最高的任务 即正在执行的任务)调用prvAddNewTaskToReadyList 添加新创建任务到就绪列表中。调用prvInitialiseNewTask 初始化任务控制块中的成员。如果调度器已经开始运行,并且新任务的优先级更大的话 进行一次任务切换。把申请到的堆栈地址,赋值给控制块的 pxStack。任务控制块、任务栈空间由系统从管理的堆中分配。任务控制块、任务栈空间由用户自己分配。申请任务控制块内存,返回首地址。
2026-03-04 08:48:48
390
原创 FreeRTOS#5——任务调度器的挂起与恢复
在PendSV中执行上下文切换,切换时R4-R11、R14需要手动保存恢复 其余自动保存恢复。只要调用了任务谢欢函数,就会进行切换,跟时间片无关,时间片只是定时会执行切换函数。作用:用于完成启动任务调度器中与硬件架构相关的配置部分,以及启动第一个任务。高优先级任务触发时 会立即抢占当前任务,不等执行完当前时间片。本质:CPU内核寄存器的切换。作用:用于启动任务调度器。
2026-03-03 16:04:42
465
原创 FreeRTOS#4——任务调度
在PendSV中执行上下文切换,切换时R4-R11、R14需要手动保存恢复 其余自动保存恢复。只要调用了任务谢欢函数,就会进行切换,跟时间片无关,时间片只是定时会执行切换函数。作用:用于完成启动任务调度器中与硬件架构相关的配置部分,以及启动第一个任务。高优先级任务触发时 会立即抢占当前任务,不等执行完当前时间片。本质:CPU内核寄存器的切换。作用:用于启动任务调度器。
2026-03-03 16:03:58
491
原创 FreeRTOS#3——列表与列表项
一个任务有两个 列表项(事件列表项、状态列表项),列表项通过指针指向任务的TCB,当任务的状态列表项挂在在哪个列表中(就绪、阻塞、挂起)这个任务就处于那种状态。数组的每个索引,对应一个优先级,调度器需要寻找下一个要运行的任务时,它会。,找到第一个非空的就绪列表,然后取出该列表头部的任务来运行。值(即它应该被唤醒的时刻)被用作排序的关键字。所有被挂起的任务都放在这个列表里。类型的变量组成的数组,数组大小为。通常是两个有序的(升序)链表。的任务状态,与等待事件无关。
2026-03-03 16:03:15
735
原创 FreeRTOS#1——源码移植
要在其他中断函数中调用FreeRTOS的接口 需要该中断优先级不能高于FreeRTOS 所管理的中断的最高优先级,一般在5-15。FreeRTOS 需使用SYSTICK_Handler、SVC_Handler、PENDSV_Handler。在PendSV_Handler 中进行任务切换。中断优先级 要设置为抢占优先级。
2026-03-03 16:01:34
347
原创 LINUX驱动开发#10——DDR3
SDRAM 全称是 Synchronous Dynamic Random Access Memory,翻译过来就是同步动态随机存储器,“同步”的意思是 SDRAM 工作需要时钟线,“动态”的意思是 SDRAM 中的数据需要不断的刷新来保证数据不会丢失,“随机”的意思就是可以读写任意地址的数据。CLK:时钟线,SDRAM 是同步动态随机存储器,“同步”的意思就是时钟,因此需要一根额外的时钟线,这是和 SRAM 最大的不同,SRAM 没有时钟线。CS:片选信号,这个和 SRAM 一样,都有片选信号。
2026-02-05 21:17:38
876
原创 LINUX驱动开发#9——定时器
*重新启动(restart)模式:**当 GPTx_CR(x=1,2)寄存器的 FRR 位清零的时候 GPT 工作在此模式。在此模式下,当计数值和比较寄存器中的值相等的话计数值就会清零,然后重新从0X00000000 开始向上计数,只有比较通道 1 才有此模式!:当 GPTx_CR(x=1,2)寄存器的 FRR 位置 1 时候 GPT 工作在此模式下,此模式适用于所有三个比较通道,当比较事件发生以后并不会复位计数器,而是继续计数,直到计数值为 0XFFFFFFFF,然后重新回滚到 0X00000000。
2026-02-05 21:16:01
739
原创 LINUX驱动开发#8——中断
Cortex-A 内核的中断管理机构叫做 GIC(general interrupt controller)向量地址中断类型中断模式0x00复位中断(Rest)特权模式(SVC)0x04未定义指令中断(Undefined Instruction)未定义指令中止模式(Undef)0x08软中断(Software Interrupt,SWI)特权模式(SVC)0x0C指令预取终止中断(Prefetch Abort)中止模式0x10数据访问中止中断(Data Abort)
2026-02-01 12:55:19
753
原创 LINUX驱动开发#7——主频和时钟
I.MX6U-ALPHA 开发板的系统时钟来源于两部分:32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源,24MHz 晶振是 I.MX6U 内核 和其它外设的时钟源。I.MX6U 的外设有很多,不同的外设时钟源不同,NXP 将这些外设的时钟源进行了分组,一共有 7 组,这 7 组时钟源都是从 24MHz 晶振 PLL 而来的。IPG 时钟发生器是一个独立的模块,它可以产生各种频率的时钟信号,以满足不同外设的需求。
2026-02-01 12:54:04
615
4
原创 LINUX驱动开发#5——GPIO
IOMUXC_SW_MUX_CTL_PAD_XX_XX 和 IOMUXC_SW_PAD_CTL_PAD_XX_XX 寄存器都是配置IO的,不是GPIO,而是这个IO的电器属性。
2026-01-30 08:37:57
298
原创 LINUX驱动开发#6——BOOT方式
此模式下,芯片会执行内部的 boot ROM 代码,这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。这几种方式由 BOOT_CFG1[7:0]、BOOT_CFG2[7:0]和 BOOT_CFG4[7:0] 这24个IO进行配置,实际只使用 BOOT_CFG1[7:0]、BOOT_CFG2[7:0]
2026-01-30 08:37:47
699
原创 LINUX驱动开发#4——起始文件
C语言运行需要栈,但栈需要RAM,而RAM需要DDR控制器初始化,需要原子操作。起始文件通常使用汇编+C方式编写,在分配完栈空间后可以引入C程序。C语言环境不存在,中断向量表、堆栈指针这些环境变量都不存在。C语言运行需要栈,但栈需要RAM,起始文件中分配栈地址。MMU/缓存初始化需要直接操作协处理器。多核启动同步需要汇编原子操作。
2026-01-29 08:41:36
226
原创 LINUX驱动开发#3——ARM汇编
根据 ATPCS 规则,ARM 使用的 FD 类型的堆栈,SP 指向最后一个入栈的数值,堆栈是由高地址向下增长的,因此最常用的指令就是 STMFD 和 LDMFD。STM 和 LDM 的指令寄存器列表中编号小的对应低地址,编号高的对应高地址。LDR 和 STR 都是按照字进行读取和写入的,也就是操作的 32 位数据,如果要按照字节、半字进行操作的话可以在指令“LDR”后面加上 B 或 H,比如按字节操作的指令就是 LDRB 和STRB,按半字操作的指令就是 LDRH 和 STRH。”和“LDMFD SP!
2026-01-29 08:40:27
834
原创 LINUX驱动开发#2——Cortex-A7内核架构
新的 Cortex-A 架构加入了TrustZone 安全扩展,所以就新加了一种运行模式:Monitor,新的处理器架构还支持虚拟化扩展,因此又加入了另一个运行模式:Hyp,所以 Cortex-A7 处理器有 9 种处理模式。:对于加/减法运算指令,当操作数和运算结果表示为二进制的补码表示的带符号数时,V=1 表示符号位溢出,通常其他位不影响 V 位。:Z=1 表示运算结果为零,Z=0 表示运算结果不为零,对于 CMP 指令,Z=1 表示进行比较的两个数大小相等。:SIMD 指令有效,大于或等于。
2026-01-28 21:24:14
900
原创 USB协议总结#1
USB协议最小单位为包 ,不同包的组合形成事务 , 不同的事务组合形成传输 , USB不同的类会使用不同传输类型,例如MSC使用批量传输 HID使用中断传输,每个设备在枚举时都是用控制传输。
2026-01-27 09:27:23
1363
1
原创 FATFS文件系统#1
其内容为第6簇,就是说接下来的簇位于第6簇——〉FAT表指引我们到达FAT表的第6簇指向,上面写的数据是7,就是说接下来的簇位于第7簇——〉FAT表指引我们到达FAT表的第7簇指向……直到根据FAT链读取到扇区相对偏移0×20~0×24,也就是第8簇,上面写的数据是9,也就是指向第9簇——〉第9簇的内容为”0F FF FF FF”,意即此文件已至尾簇。上面是从第0项开始的,第0项和第1项暂时就不用看了,从第2项开始,为0F FF FF FF,表示这是一个小文件,只占用一个簇就结束了,然后第3、4项也是的。
2026-01-06 08:47:29
644
原创 蓝牙协议栈#1
其中2,3,4的主要差别在于H4需要BT CHIPUART_TX/UART_RX/UART_CTS/UART_RTS / VCC / GND接到MCU,而H5,BCSP只需要BT CHIP的UART_TX/UART_RX/VCC/GND接到MCU就可以通信。,用于传输不同类型的数据,如异步数据、同步数据、多播数据、广播数据等,Logical Link 通过占用 Physical Link 中不同 时隙的方式,复用 Physical Link。**HW层:**这里就是蓝牙芯片层,包含以下几个部分。
2026-01-06 08:47:17
908
原创 USART 串口协议
举个例子:把振幅分成四种,低(00)、中(01)、高(10)、很高(11),这样我发一个脉冲信号,它的振幅是低,那就说明发送的是00(也就是2bit),它的振幅是中(01),发送的就是01(也就是2bit),也就实现了一个脉冲信号,携带2bit的功能。数据在两个串口之间进行通讯的时候常常会出现丢失数据的现象,比如两台计算机或者是一台计算机和一个单片机之间进行通讯,当接收端的数据缓冲区已经满了,这个时候如果还有数据发送过来,因为接收端没有时间进行处理,那这样的数据就有可能会丢失。发“-” 接 收“-”)
2023-10-26 11:16:31
920
原创 SPI IIS 协议
SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在EEPROM,FLASH,实时时钟,AD转换器。所以不难发现,菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出。(从机的输出作为下一个从机的输入),不断循环直到数据到达目标设备的方式被称为。在数字通信世界中,在设备信号(总线信号或中断信号)SCK为时钟信号,8clks表示8个边沿信号;
2023-10-26 10:40:35
831
原创 IIC 协议
I2C总线用两条线(SDA和SCL)在总线和装置之间传递信息,在微控制器和外部设备之间进行串行通讯或在主设备和从设备之间的双向数据传送。最大从机数:由I2C地址决定,7位地址(也可以是10位,整个总线要统一),2^7=128,但是0x00不用,所以理论上可以挂127个从机。在主从工作方式中,主机启动数据的发送(发出启动信号)并产生时钟信号,数据发送完成后,发出停止信号。S -> 从机地址 +写 ->A ->从机寄存器地址->A -> Sr -> 从机地址+读 -> data -> A/~A -> P。
2023-10-26 10:35:12
451
原创 C 面试题
c是一个数组,该数组用于存放10个函数指针,该函数,有一个int * * 的形参,返回值是 char 类型 指针。是一个指向next()函数的指针,这个next()函数返回一个指针,这个指针是一个只读的指针,只读的指针指向一个字符指针。*( *c[10])(int * *p) 是一个函数指针的数组,函数有一个int **p形参,且返回值是指针。函数指针的声明:**函数返回值类型 ( * 指针变量名称) (函数参数列表) **
2023-10-23 09:35:53
198
原创 最短路学习总结
常用五种最短路算法———(南昌理工ACM集训队)目录常用五种最短路算法———(南昌理工ACM集训队)Dijkstra 算法朴素版堆优化版Bellman_ford 算法SPFA 算法Floyd 算法Dijkstra 算法朴素版Dijkstra 算法只适用无负权值的单源点最短路。这个算法跟最小生成树的 Prim算法 类似。 首先找到一个没有确定最短路且距离起点最近的点 t,并通过这个点将其他点的最短距离进行更新。每做一次这个步骤,都能确定一个点的最短路,所以需要重复此步骤 n 次,找出 n 个点的
2021-07-30 15:19:27
313
原创 平面、空间分割问题
平面分割-----------南昌理工学院ACM集训队直线分割平面n条直线,最多可以把平面分为多少个区域。当已有 n 条直线时,平面最多被分成了 f(n) 个区域。则要使第 n+1 条直线切成的区域数最多,就必须与已有的每条直线相交且不能有同一交点。 这样就会得到 n 个交点。这些交点将第 n+1 条直线分为 2 条射线和 n-1 条线段。而每条射线和线段将以有的区域一分为二。这样就多出了 2+(n-1) 个区域。故:f(n) =f(n-1)+n =f(n-2)+(n-1)+n
2021-07-24 09:30:08
2115
原创 数据结构复习总结
数据结构复习总结 ———南昌理工ACM集训队栈与队列单调栈单调队列字典树(tire树)并查集扩展域并查集带权值并查集哈希表一般哈希字符串哈希栈与队列单调栈栈是STL库中非常实用的一个容器,它具有先入后出的性质。而单调栈为了满足单调的要求,增加了一个性质: 从栈顶到栈底的元素是严格递增(or递减)----对于单调递增栈,若当前进栈元素为e,从栈顶开始遍历元素,把小于e或者等于e的元素弹出栈,直接遇到一个大于e的元素或者栈为空为止,然后再把e压入栈中。----对于单调递减栈,则每次弹出的是大于e或者等
2021-07-18 10:32:57
227
原创 蒙德里安的梦想
蒙德里安的梦想萌新初识状态压缩DP问题,被此题所困(我看不懂,但我大受震撼.jpg),费劲心思理清后,特写此题解以示纪念。 ————来自南昌理工学院集训队题目原题链接:在这里输入样例:1 21 31 42 22 32 42 114 110 0输出样例:10123514451205解题思路方块只有两种放法,一种横着放,一种竖着放,当横着放的方块全部摆好后,剩下的位置就只能竖着放置。所以求总放置方法,只要求出多少种竖着放置的方法即可。状态压缩DP的思想:1
2021-07-10 16:36:59
1059
5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅