- 博客(31)
- 收藏
- 关注
原创 CCM/TCM在STM32中的含义和用途
CCM(Core Coupled Memory)和TCM(Tightly Coupled Memory)是ARM架构中的特殊内存类型,它们都表示与CPU核心紧密耦合的内存区域。这些内存具有一些特殊特性,使其在某些应用场景下非常有用。
2025-04-30 15:43:31
626
原创 Ymodem协议在嵌入式设备中与Bootloader结合实现固件更新
可靠性优先:通信中断、电源故障等情况下不损坏固件简单实现:Bootloader应尽量简单,减少潜在bug资源考量:最小化Bootloader占用的Flash和RAM多重保护:固件验证、备份和恢复机制。
2025-04-30 15:31:09
865
原创 嵌入式多功能浏览器系统设计详解
在学习了伟东山的完整嵌入式相机流程之后,将文本阅读器和人脸识别内容添加进去。这是完成后的整体框架,代码会开源在gitee。
2025-04-28 19:53:50
831
原创 静态库与动态库简介
静态库是在编译链接阶段被直接整合到可执行文件中的代码集合。链接器会从静态库中提取程序所需的所有对象,并将它们复制到最终的可执行文件中。
2025-04-28 19:41:19
857
原创 MCU内存映射技术详解
内存映射技术是MCU系统设计的基础,掌握内存映射原理和技术对于开发高效稳定的嵌入式系统至关重要。随着MCU向更高性能、更低功耗方向发展,内存映射技术也在不断演进,为开发者提供更大的灵活性和更强的功能。
2025-04-28 19:40:39
945
原创 STM32完整内存地址空间分配详解
在STM32这类基于ARM Cortex-M的32位微控制器中,整个4GB的地址空间(从0x00000000到0xFFFFFFFF)有着非常系统化的分配方案,每个区域都有其特定的用途。
2025-04-28 19:39:29
1523
原创 STM32的Flash映射双重机制
在STM32微控制器中,存在一个重要的内存映射特性:Flash存储器可以同时出现在两个不同的地址区域,而且可以通过重映射功能改变CPU启动时从哪个地址获取初始指令。
2025-04-28 19:38:12
1035
原创 STM32启动流程详解
上电/复位 → 加载MSP → 跳转到Reset_Handler → 初始化栈指针 →复制.data段 → 清零.bss段 → SystemInit() → __libc_init_array() → main()修改启动文件以支持特定的内存布局自定义SystemInit函数实现特定的时钟配置在main函数之前添加自定义的初始化代码通过理解这一完整的启动过程,开发者可以更好地控制STM32应用程序的初始化行为,优化系统性能,并解决启动相关的问题。
2025-04-16 20:58:22
1164
原创 VScode+OpenOCD+HTOS栈回溯在国产mcu芯片上完全调试
本文将详细介绍一个基于 VS Code 的 STM32 开发环境配置,该环境使用 CMake 作为构建系统,OpenOCD 作为调试和下载工具,以及 Ninja 作为构建工具。这是一套专业的嵌入式开发环境,特别适用于 STM32F103 系列微控制器的开发,同时集成了自研的 HTOS 轻量级实时操作系统。这套 VSCode + CMake + OpenOCD + Ninja 的开发环境构成了一个功能强大、灵活且高效的 STM32 开发平台。
2025-04-16 19:02:41
855
原创 C语言关键字
控制流示例存储类示例结构体和共用体示例关键字深入解析const 关键字详解 是一个类型限定符,用于声明"只读"变量或参数,表示其值在初始化后不应被修改。用途和特性:创建只读变量:防止变量被意外修改只读函数参数:表明函数不会修改传入的参数只读指针与指针常量:与类型定义结合:最佳实践: 告知编译器变量可能在程序控制外被改变,防止编译器优化掉对该变量的操作。用途和特性:硬件寄存器访问:多线程共享变量:信号处理程序中的变量:结合const使用:注意事项
2025-04-09 19:58:36
977
原创 ARM内核与寄存器
ARM(Advanced RISC Machine)是一种RISC(精简指令集计算机)处理器架构,最初由Acorn计算机公司设计,现在由ARM公司开发和授权。由于其低功耗和高性能特性,ARM处理器广泛应用于移动设备、嵌入式系统和物联网设备。ARM架构已经发展了多个版本,从ARMv1到最新的ARMv9,不同版本引入了不同的功能和改进。Cortex-A系列:应用处理器,用于高性能系统Cortex-R系列:实时处理器,用于需要快速响应的系统Cortex-M系列:微控制器,用于低功耗嵌入式设备。
2025-04-09 19:27:48
898
原创 嵌入式开发中栈溢出的处理方法
在嵌入式系统中,栈通常被配置为固定大小,当递归层次过深、局部变量过大或函数调用链过长时,可能导致栈溢出。在嵌入式系统开发中,栈溢出是一个常见且危险的问题。最后,处理栈溢出不仅仅是一项技术任务,也是嵌入式系统可靠性工程的重要组成部分,应当贯穿于整个开发生命周期。某些MCU提供硬件级别的栈溢出检测机制,如MPU(内存保护单元)或专用的栈溢出检测寄存器。通过在初始化时填充栈空间为特定模式,然后监控模式被破坏的情况来检测栈使用情况。哨兵变量是放置在栈边界处的特定值,通过定期检查这些值是否被修改来检测栈溢出。
2025-04-04 19:37:56
1418
原创 DMA在SPI和I2C通信中的应用详解
DMA(Direct Memory Access,直接内存访问)是一种允许外围设备(如SPI、I2C控制器)直接访问系统内存而无需CPU干预的数据传输技术。在传统的数据传输中,CPU需要执行一系列指令来移动数据,这不仅占用宝贵的处理时间,还限制了数据传输速率。DMA控制器是一个专门的硬件模块,能够独立于CPU执行内存操作,允许数据传输在后台进行,同时CPU可以执行其他任务。当传输完成时,DMA控制器会通知CPU(通常通过中断)。将DMA与SPI和I2C结合使用可以显著提高嵌入式系统的性能和能效。
2025-04-02 20:28:12
1306
原创 I²C总线高级特性与故障处理分析
I²C(Inter-Integrated Circuit,通常简称为I2C或IIC)是一种由Philips(现NXP)开发的串行通信总线,广泛应用于短距离、芯片间通信,特别适合单板系统内的外设连接。I²C总线采用两线制:这两条线都是开漏(Open-Drain)或开集(Open-Collector)输出,需要外接上拉电阻,空闲状态为高电平。这种设计支持多主机通信、时钟同步和总线仲裁功能。基本特点:基本信号时序元素:典型通信时序:1.3 寻址方式与读写操作标准7位寻址:读操作流程:写操作流程:随着I²C总线
2025-04-02 20:06:59
1047
原创 SPI高级特性分析
QSPI通过四线传输和内存映射等高级特性,为资源受限的嵌入式系统提供了高速外部存储解决方案。高性能:相比标准SPI提供最高4倍的传输速率内存扩展:通过XIP技术扩展有限的片上存储灵活性:支持多种操作模式,可根据需求调整性能和兼容性广泛支持:众多微控制器集成了QSPI控制器,闪存芯片供应充足。
2025-04-02 19:45:08
1284
原创 FreeRTOS通信机制:队列、StreamBuffer与MessageBuffer
队列是FreeRTOS中最基础的任务间通信机制,实现了多任务间数据项的传递。队列可以存储多个固定大小的数据项,通常遵循FIFO(先进先出)原则,但也支持LIFO(后进先出)操作。
2025-03-31 20:27:42
853
原创 CMake与Makefile深度分析
构建系统是软件开发中用于自动化从源代码到可执行程序转换过程的工具链。它作为开发流程的核心环节,管理着代码编译、链接以及其他构建步骤,确保项目能够高效、一致地构建。构建系统是一套工具和规则的集合,负责执行从源代码到最终产品的全部或部分转换过程。编译源代码:将高级编程语言(如C/C++)转换为目标代码链接目标文件:将多个目标文件组合成可执行程序或库管理依赖关系:确保文件按正确顺序编译,并在依赖变更时重新构建执行辅助任务:如资源生成、测试运行、文档生成等打包和部署:创建安装包或部署包。
2025-03-31 16:43:38
451
原创 GDB调试方法分析
GDB (GNU Debugger) 是GNU软件系统中的强大调试工具,它可以让我们在程序运行时观察程序的内部状态,主要用于调试用C、C++等编译型语言编写的程序。启动程序,并指定可能影响其行为的任何内容使程序在指定条件下停止程序停止时检查发生了什么修改程序中的内容,以便纠正错误的影响# 定义自定义命令> print i> print j> end# 使用自定义命令。
2025-03-29 16:58:05
807
原创 STM32F407部署简易边缘ai
模型训练和验证tranai文件夹):使用 Python 训练 SVM 分类器,并转换为 ONNX 格式嵌入式部署AI_test文件夹):使用 STM32 Cube.AI 将模型部署到 STM32F4 系列微控制器上AI 相关常量的定义文件。
2025-03-26 10:27:29
891
原创 个人写内核调度代码htOS
htOS是一个专为ARM Cortex-M3微控制器设计的轻量级实时操作系统内核,支持优先级抢占式调度、信号量、消息队列等基本功能。它的设计目标是简单易懂、易于移植,同时保持良好的实时性能。通过研究htOS的源代码,你可以深入理解实时操作系统的核心工作原理,而不必面对FreeRTOS等成熟RTOS成千上万行复杂代码的挑战。至于为什么前缀是ht,h是我的姓,t代表的是tiny。因为这个内核实现的功能非常小,仅仅只实现了内核调度和信号量与消息队列还有内存管理。
2025-03-25 10:08:17
806
原创 FreeRTOS内核源码分析-内存管理
FreeRTOS的堆内存管理是其核心内存管理机制,主要用于动态分配TCB(任务控制块)和任务栈。FreeRTOS提供了5种不同的堆实现方案,开发者可以根据应用需求选择最合适的一种,或者实现自己的堆管理方案。
2025-03-21 21:25:45
629
原创 FreeRTOS内核源码分析-中断管理与CPU管理
目前阅读的FreeRTOS资料很多都是基于11.0.0以前版本的,我阅读了一下最新的源码,发现FreeRTOS自11.0.0之后已经支持多CPU使用一个内核。
2025-03-21 20:31:13
1345
原创 FreeRTOS内核源码分析-任务通知
任务通知(Task Notifications)是FreeRTOS自v8.2.0版本引入的一种高效、轻量级的任务间通信和同步机制。与传统的队列、信号量等通信原语不同,它无需创建单独的内核对象,直接利用任务控制块(TCB)内部的专用字段实现任务间直接通信,极大地提高了通信效率并降低了内存占用。
2025-03-20 16:34:03
1118
1
原创 FreeRTOS内核源码分析-事件组
事件组(Event Groups)是FreeRTOS提供的一种轻量级同步原语,专为多任务间的事件标志同步设计。
2025-03-20 15:16:44
906
原创 FreeRTOS内核源码分析-信号量、互斥量与消息队列
FreeRTOS通过一种统一的数据结构设计,巧妙地实现了队列、信号量和互斥量等不同同步原语。这个核心结构就是,简称Queue_t。
2025-03-17 21:20:04
1038
1
原创 FreeRTOS内核源码分析-任务2
基于优先级的抢占:高优先级任务始终优先于低优先级任务执行时钟滴答驱动:SysTick定时器触发周期性调度检查事件驱动切换:资源访问、延时、通知等都可能触发任务切换PendSV实现切换:使用低优先级PendSV中断执行实际的上下文切换优先级继承:通过互斥量实现优先级继承,避免优先级反转问题。
2025-03-17 20:40:04
640
原创 FreeRTOS内核源码分析-链表
近日,为了深化对操作系统内核原理的理解,我决定深入研究并研读流行的实时操作系统——FreeRTOS的源码。FreeRTOS是一个开源的实时操作系统内核,它小而精,广泛应用于嵌入式系统领域。通过研读其源码,我希望能够更深入地掌握操作系统的调度机制、内存管理、任务管理等核心概念。为了记录我的学习过程和心得体会,进行内容的记录和分享。通过这个专栏,我希望能够提升自己对于操作系统内核的理解,还能够帮助其他开发者更快地掌握FreeRTOS的使用,共同进步。同时,我也期待与更多的嵌入式系统爱好者交流。
2025-03-06 20:43:44
619
原创 STM32+FreeRTOS+lora网关与数据采集板开发
项目开发使用STM32F103作为数据采集和网关板主控。采用易佰特e22-900作为lora通讯芯片。主要负责程序开发,总结开发难点及问题如下。1、通讯配置复杂,组网通讯困难。2、上位机数据设置保存参数及BootLoader等程序分配flash。3、组网通讯速率过慢。
2025-01-02 21:14:43
1232
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人