- 博客(514)
- 收藏
- 关注
原创 从 0 到 1 搭建 Kconfig 配置系统
本文介绍了从零搭建Kconfig配置系统的过程。通过分析开源项目中常见的宏定义管理方式存在的问题,提出了使用Kconfig系统进行集中配置管理的方案。详细说明了基于Python kconfiglib库的环境搭建步骤,包括文件结构组织、Kconfig脚本编写、Makefile配置等关键环节。针对实际使用中出现的"Symbol对象无origin属性"错误提供了解决方案,并展示了系统运行后生成的.config配置文件和autoconfig.h头文件等产物。最后介绍了如何扩展多目录Kconfig
2026-03-25 18:49:02
97
原创 ARMv7上分散加载实现多 bin 运行
摘要 本文介绍了多bin运行方案,针对Flash容量有限的芯片,将代码和变量分配到NVM(非易失性存储器)中。通过定义特殊section属性(.nvm_code、.nvm_rodata等)实现四种存储方式:代码段直接存放、只读常量存放、可读写变量XIP访问(nocopy)和可读写变量运行时拷贝到SRAM(copy)。文章提供了C语言测试示例,展示了变量和函数的地址分配验证。链接脚本配置了FLASH、NVM和RAM三个存储区域,并定义了各section的加载地址和运行地址,最后计算了生成的bin文件大小。该方
2026-03-21 16:17:38
69
原创 CAN 帧
本文介绍了CAN通信中使用的5种帧类型及其结构。重点分析了数据帧和遥控帧的标准/扩展格式差异,包括帧起始、仲裁段、控制段等7个组成部分的功能特性。详细说明了错误帧、过载帧和间隔帧的结构与作用机制,阐述了CAN总线的仲裁原理和位填充规则。通过对比不同帧类型的字段组成,揭示了CAN协议实现优先级控制、错误检测和流量管理的技术原理,为理解CAN通信机制提供了系统性的框架。
2026-03-09 16:55:51
558
原创 CAN 与 CAN FD 区别
摘要: CAN FD是对标准CAN的升级版本,核心改进包括:1) 数据长度从8字节扩展至64字节,减少分包需求;2) 采用双速率机制(仲裁段≤1Mbps,数据段可达2-8Mbps),提升带宽利用率;3) 新增FDF、BRS、ESI等控制位优化协议;4) 增强CRC校验(CRC-17/21)保障长帧可靠性。两者电气层兼容,但CAN FD对信号完整性要求更高。这些改进使CAN FD在汽车、工业等领域实现更高传输效率与实时性,同时保持向下兼容性。
2026-03-09 15:45:59
435
原创 CAN 总线拓扑
CAN总线采用差分信号传输,通过CAN_High和CAN_Low的电位差表示总线电平。显性电平(逻辑0)电位差约2V(3.5V-1.5V),隐性电平(逻辑1)电位差为0V(2.5V-2.5V)。显性电平具有优先权,只要有一个节点输出显性电平,总线即为显性;隐性电平需要所有节点都输出隐性电平才成立。这种"线与"逻辑使显性电平能覆盖隐性电平,确保总线仲裁机制正常工作。
2026-02-04 11:29:09
217
原创 CAN 状态
CAN总线单元有三种工作状态:主动错误状态(可正常通信,检测错误时输出主动错误标志)、被动错误状态(受限通信,检测错误时输出被动错误标志且需延迟重发)和总线关闭态(禁止通信)。状态转换由发送/接收错误计数值决定,各状态对应不同的错误处理机制和总线访问权限。
2026-02-02 17:18:20
208
原创 CAN 基本概念和特点
本文介绍了CAN(Controller Area Network)总线协议的基本概念和特点。CAN是国际标准化的串行通信协议,由博世公司1986年开发,现广泛应用于汽车电子和工业自动化领域。其特点包括多主控制、消息优先级仲裁、系统扩展灵活性、可调通信速度、远程数据请求功能等。CAN总线具有强大的错误检测、通知和恢复机制,能隔离故障单元,支持多设备连接。这些特性使其成为分布式控制系统中可靠的数据通信解决方案。
2026-02-02 17:11:09
937
原创 ARMv7-A 上 malloc 功能实现
堆内存在 bss 段的后面,在 stack 段的前面。当两者相遇时,堆内存和栈内存就会重叠。堆往高地址增长,栈往低地址增长。上述代码执行结果如下。
2025-12-01 22:15:00
110
原创 库文件符号解析规则
库文件编译完成之后可以查看对应的符号属性,看看库中符号是强(T)还是弱(W)。你要加 my_plus_lib.a,只需在这条命令后面添加库路径即可。从打印结果可以看到,此时库函数的实现已经被改为自己源码的实现了。这样重新定义的强符号会自动覆盖 .a 中的函数,所以添加完库之后的 makefile 如下。同名的全局符号在链接时只允许出现一个。原始的 makefile 文件如下。如果在其他文件中重新实现这两个接口。如果库文件中的函数加了。文件清空,函数实现在。链接符号解析总体规则是。
2025-10-21 01:15:00
105
原创 ARMv7-A 移植 FreeRTOS 中断处理
FreeRTOS 运行需要有一个心跳时钟,这里时钟选择为 ARMv7-A 内核的 Generic Timer 定时器, Generic Timer 定时器的使用参考。但别忘了如果 r4 原值需要保持(ABI 要求),要先把原 r4 保存到栈(push)再覆盖,或选用其它寄存器。所以这条指令执行完成之后 ulPortInterruptNesting 的值就恢复为中断发生前的值。所以 Generic Timer 中断,或者其他外设的中断,均会进入IRQ_MODE 的中断。当可以进行任务切换的时候首先判断。
2025-10-21 00:15:00
267
原创 ARMv7-A 移植 FreeRTOS 上文保存和下文恢复
上文保存其实就是将当前模式的 CPSR,PC,R14(LR), R12, R11…从 log 可以看到 task1 和 task2 交替运行。指向 sys 模式的栈顶,保存的是 R0 寄存器的值。指向 sys 模式的栈顶,保存的是 R0 寄存器的值。从前面的上文保存和下文恢复可以总结出。找到当前任务的 TCB 之后,在 SWI 中断中有如下处理。的适配其实就是触发一次。新建两个优先级相同的任务。
2025-10-20 01:15:00
1090
原创 ARMv7-A 移植 FreeRTOS 启动调度和任务恢复
align 2.arm.align 2将代码对齐到 4 字节边界(2^2 = 4),保证 ARM 指令按 32 位对齐,提高执行效率。.arm指示汇编器生成 ARM 指令,而不是 Thumb 指令。声明这个符号为弱符号,如果别处有同名全局符号,会被覆盖。声明这是全局符号,可以被其他文件调用。告诉链接器这是一个函数类型的符号,而不是变量。函数入口这是函数入口标签。
2025-10-20 00:45:00
85
原创 ARMv7-A 移植 FreeRTOS 栈帧初始化
函数会对 TCB 初始化,并将 pxStack 指向栈数组的起始地址。函数会判断栈的增长方向,如果是满减栈,那么就找到栈顶的地址,并更新。此时就执行任务栈的栈顶,也就是栈数组的尾部。由于 ARMv7-A 是满减栈,所以。函数返回值为当前栈顶地址,并赋值给。任务,任务创建完成之后我们把任务。dump 出的 stack 内容如下。指向数组结束地址,也就是栈顶。为系统移植需要实现的接口。初始化完成之后栈的布局如下。这里以静态任务创建为例。所以当函数返回的时候。至此,任务栈就构造完成。这里的函数调用关系为。
2025-10-19 19:54:32
303
原创 ARMv7-A 移植 FreeRTOS 编译环境搭建
从以下网站下载 源码当前使用的版本可以在 中找到编译环境搭建头文件包含将 目录加入工程头文件将根目录下 , 等文件加入工程编译将 文件加入工程编译 内存管理参考文章 FreeRTOS 内存管理将 作为默认配置头文件配置文件中是一个模版,适配到具体的板子上需要修改初始移植的时候暂时不使用回调,所以改为 0同样,为了后面移植任务切换函数的时候方便调试,将 timer 任务默认关掉默认配置文件中是 64bit CPU 使用的,改为 32bit CPU模板文件 copy 过来之后,修改上面
2025-10-18 01:15:00
338
原创 ARMv7-A 移植 FreeRTOS 几种特殊的指令
CPS = Change Processor State,是 ARMv7 里专门用来快速操作中断屏蔽位和处理器模式的指令。CPSIE <if>CPSID <if>IE = Interrupt Enable(使能 = 打开中断)ID = Interrupt Disable(禁止 = 屏蔽中断)参数 = 哪个中断类型:i → IRQ 中断(普通中断)f → FIQ 中断(快速中断)a → Asynchronous abort (外部数据中止)
2025-10-18 00:15:00
232
原创 FreeRTOS 内存管理
FreeRTOS 提供了多种内存分配方案,使用不同的 文件来管理内存。每个 文件实现了不同的内存管理策略,旨在适应不同的应用需求。以下是常见的 文件及其区别和应用场景。 实现了一个非常简单的内存分配器。它使用一个固定大小的内存块,通过静态分配的内存池来管理内存。分配的内存块之间没有链接,因此不支持释放内存块。适用于以下场景:heap_2.c功能heap_2.c 提供了一个更复杂的内存分配器。它支持内存块的分配和释放,并且通过链表来管理空闲内存块。每次释放内存时,都会合并相邻的空闲内存块,从而减少
2025-10-17 19:22:18
94
原创 FreeRTOS 命名约定和前缀说明
在 FreeRTOS 中,函数和变量名称的前缀遵循特定的命名约定,帮助开发者快速理解函数的作用、返回值类型或功能。eTaskGetState 返回任务的当前状态,如 eRunning 或 eBlocked。通过熟悉这些前缀,你可以更高效地阅读和理解 FreeRTOS 的代码以及开发自己的应用程序!portYIELD 是 FreeRTOS 的硬件移植层函数,用于触发任务切换。uxTaskGetNumberOfTasks 返回当前系统中任务的数量。pcTaskGetName 返回指定任务的名称字符串。
2025-10-17 19:20:47
101
原创 链接脚本的进阶使用
本文介绍了链接脚本(LD)的进阶使用技巧,主要包括:1. PROVIDE语句实现弱定义,类似C语言的weak属性;2. KEEP语句强制保留未引用的section;3. 通过定义起始/结束地址变量获取内存段位置和大小;4. 获取预定义变量值、内存区域大小和二进制文件大小的方法;5. 在汇编和C代码中访问这些链接脚本定义的变量。文中提供了具体示例说明如何在链接脚本中定义变量并在代码中使用,包括计算二进制文件总大小、设置内存边界检查等实用技巧。这些技术对嵌入式系统开发中精确控制内存布局非常有用。
2025-08-02 16:08:54
216
原创 理解 VMA 与 LMA
VMA(虚拟地址)和LMA(加载地址)是嵌入式开发中的关键概念。VMA是程序运行时访问的地址,而LMA是程序在存储介质中的初始位置。二者区别在于:代码段(.text)通常直接从Flash运行(VMA=LMA),而数据段(.data)需要从Flash拷贝到RAM(LMA≠VMA)。链接脚本通过>RAM AT>FLASH语法指定各段的VMA和LMA,启动代码则负责将.data段从Flash拷贝到RAM,并清零.bss段。理解VMA/LMA对正确配置内存布局至关重要。
2025-07-18 19:33:58
582
原创 U盘实现——U 盘类特殊命令
本文介绍了U盘数据传输的协议流程和关键命令。U盘通信分为三个阶段:命令阶段(主机发送CBW封包)、数据阶段(根据CBW方向传输数据)和状态阶段(设备返回CSW状态)。具体说明了CBW和CSW的数据结构定义,包含签名、标签、数据长度等关键字段。此外,详细解析了两个重要命令:Get Max LUN(获取最大逻辑单元号)和Inquiry(查询设备信息),包括命令格式、数据结构和返回内容。Inquiry命令的响应包含设备类型、版本号、厂商ID等详细信息,用于识别存储设备特性。这些协议和命令是U盘与主机交互的基础机制
2025-07-09 21:13:44
183
原创 【ARMv7-A】——CLZ 指令
CLZ(Count Leading Zeros)是ARM指令集中的一个硬件指令,用于计算32位二进制数中从最高位开始的连续零个数。该指令在RTOS调度、资源管理等领域有重要应用,能快速定位最高优先级任务或空闲资源位。文章详细介绍了CLZ的概念、ARM指令语法,并以FreeRTOS为例展示了硬件实现和软件实现的对比。硬件实现采用内联汇编,效率远高于循环判断的软件实现。测试案例验证了不同数值的前导零计算结果,证明了CLZ指令在系统性能优化中的价值。
2025-06-12 19:37:40
469
原创 USB 网卡——RNDIS 控制消息解析
远程 NDIS 设备将通过发回 REMOTE_NDIS_KEEPALIVE_CMPLT 响应消息来响应主机发送的 REMOTE_NDIS_KEEPALIVE_MSG 消息。远程 NDIS 设备将以 REMOTE_NDIS_QUERY_CMPLT 消息响应 REMOTE_NDIS_QUERY_MSG 消息。远程 NDIS 设备将通过重置设备来响应主机发出的 REMOTE_NDIS_RESET_MSG 消息,并在 REMOTE_NDIS_RESET_CMPLT 消息中返回请求的状态。
2025-04-30 02:15:00
307
原创 USB 网卡——RNDIS 控制消息流程
在其控制端点上获取控制消息时,设备必须在通信类接口的中断 IN 端点上返回通知,每当设备可以返回控制消息时,主机就会轮询该通知。需要注意的是,如果设备由于某种原因收到GET_ENCAPSULATED_RESPONSE,并且无法使用控制端点上的有效数据做出响应,则应返回设置为 0x00 的单字节数据包,而不是 stall 控制端点。下表中定义了此传输。收到 RESPONSE_AVAILABLE 通知后,主机使用下表中定义的GET_ENCAPSULATED_RESPONSE 传输从控制端点读取控制消息。
2025-04-29 21:55:07
321
原创 USB 网卡——RNDIS 介绍
RNDIS 全称为:Remote Network Driver Interface Specification,即远程网络驱动接口规范Remote NDIS (RNDIS)是以太网(802.3)网络设备上的以太网(802.3)网络设备(例如 USB、1394、蓝牙和 InfiniBand)即插即用 上的总线独立类规范。远程 NDIS 通过抽象控制和数据通道在主计算机与远程 NDIS 设备之间定义与总线无关的消息协议。在总线级初始化之后,设备处于 RNDIS 未初始化状态。
2025-04-29 21:46:47
1455
原创 PHY——LAN8720A 代码解析 (三)
LAN8720 的接口其实就是调用 PHY 的一系列接口来控制 LAN8720,或者获取 LAN8720 的状态。这个函数其实就是从 0 遍历 PHY 的地址,找到一个可用的 PHY 地址。函数用于初始化 PHY 接口。这个函数用于禁用 PHY 的 Power Down 模式。这个函数用于启用 PHY 的 Power Down 模式。函数用于向 PHY 写入寄存器。函数用于从 PHY 读取寄存器。函数用于反初始化 PHY 接口。函数用于注册 PHY 接口。这里 PHY 的操作是通过函数指针实现的。
2025-04-01 20:49:55
1137
原创 USB——删除注册表信息
注测表中已记录这个设备的信息,但现在设备描述符又指定为了 WinUSB 设备,所以当设备再次插入的时候,不会发送 0xEE 命令,造成了枚举失败。HID 就进入 HID 目录,如果是其他设备就进入对应类的目录,删除相应的 PID/VID。此时再插入该 Device,即被当做全新设备插入,装载驱动。工具下载之后解压放在。
2025-03-31 21:38:12
987
原创 USB 虚拟串口改名——禁用 Windows 驱动签名篇
USB 虚拟串口 Windows 枚举之后使用的是默认的名称,例如USB 串行设备(COM52),如下图所示但是我们使用其他厂商的虚拟串口的时候,会显示厂商信息,例如CH340USB 转串口工具显示的就是那我们自己做的虚拟串口如何显示自定义名称呢?这里就涉及到 Windows 驱动签名,本文只讨论如何修改设备名称,至于 Windows 如何过驱动签名,不在本文讨论范围。
2025-03-31 12:47:03
559
原创 PHY——LAN8720A 寄存器读写 (二)
这里以野火电子的 F429 开发板为例,配置以太网外设这里有一点需要注意,如下图但是当 CubeMx 使能 ETH 外设的 RMII 时候,默认使用的引脚是 PB12 和 PB13这里需要手动修改这样 RMII 的引脚和以太网相关时钟就配置好了,这里我们只借助 CubeMx 配置这两个,PHY的驱动自己来实现以太网初始化代码PHY 接口实现这个文件其实主要实现了两个接口 和 ethernetif.h 文件LAN8720 接口实现这个文件主要定义 PHY 的相关寄存器以
2025-03-30 22:36:48
1395
原创 PHY——LAN8720A 介绍 (一)
一般来说,必须为使用 RMII 接口的 PHY 提供 50MHz 的时钟源输入到 REF_CLK 引脚,不过LAN8720A 内部集成 PLL,可以将 25MHz 的时钟源陪频到 50MHz 并在指定引脚输出该时钟,所以我们可以直接使其与 REF_CLK 连接达到提供 50MHz 时钟效果。REGOFF 引脚用于配置内部+1.2V 电压源, LAN8720A 内部需要+1.2V 电压,可以通过VDDCR 引脚输入+1.2V 电压提供,也可以直接利用 LAN8720A 内部+1.2V 稳压器提供。
2025-03-26 00:45:00
2515
原创 RGMII 接口
在千兆以太网中,常用的接口为 RGMII 和 GMII 接口。RGMII 接口的优势是同时适用于10M/100M/1000Mbps 通信速率,同时占用的引脚数较少。但 RGMII 接口也有其缺点,就是在 PCB 布线时需要尽可能对时钟、控制和数据线进行等长处理,且时序约束相对也更为严格。为了节省引脚,开拓者开发板板载的 PHY 芯片采用的接口为 RGMII 接口,下图是 MAC 侧与 PHY 侧接口的连接。RGMII 拓扑图。
2025-03-25 15:15:04
2151
原创 GMII 接口
GMII 是千兆网的MII接口,这个也有相应的 RGMII 接口,表示简化了的 GMII 接口。GMII 采用 8 位接口数据,工作时钟125MHz,因此传输速率可达 1000Mbps。同时兼容 MII 所规定的 10/100 Mbps 工作方式。GMII 接口数据结构符合 IEEE 以太网标准。
2025-03-25 15:08:38
897
原创 RMII 接口
简化媒体独立接口是标准的以太网接口之一,比 MII 有更少的 I/O 传输。MII 口是用 4 根线来传输数据的,RMII 口是用 2 根线来传输数据的,GMII 是用 8 根线来传输数据的。MII/RMII 只是一种接口,对于10Mbps 线速,MII 的时钟速率是 2.5MHz 就可以了,RMII 则需要 5MHz;对于 100Mbps 线速,MII 需要的时钟速率是 25MHz,RMII 则是 50MHz。
2025-03-21 12:34:06
2056
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅