- 博客(82)
- 资源 (4)
- 收藏
- 关注
原创 GCC __attribute__ 常用属性速查与实战
在嵌入式开发中,标准 C 语言往往难以满足对硬件底层的精确控制需求。GCC 的 __attribute__ 机制是链接软件与硬件的桥梁,也是进阶开发的必备技能。本文系统整理了嵌入式工程中最常用的 8 个属性(包括 packed、aligned、section、weak、naked 等),从内存对齐与布局、链接器行为控制、底层指令生成三个维度进行深度解析。结合通信协议解析、DMA 缓冲区管理、RTOS 上下文切换等真实硬件场景,提供了详实的代码示例与避坑指南,助你彻底掌握编译器行为,编写出高效、健壮的底层代码
2026-01-09 11:18:33
818
原创 【避坑指南】结构体取值不一致:#pragma pack 导致的 ABI 灾难
摘要: 本文揭露嵌入式开发中因#pragma pack误用导致的结构体数据错乱问题。当不同源文件对同一结构体的对齐方式理解不一致时(如main.c使用默认对齐,driver.c强制1字节对齐),会出现指针地址相同但数据读取错位的"ABI不匹配"现象。建议使用__attribute__((packed))替代全局#pragma pack,并添加静态断言_Static_assert验证结构体大小,避免这种隐蔽的运行时错误。该问题源于链接器不检查类型一致性,只有精准控制对齐方式才能确保二进制接
2026-01-09 10:18:38
713
原创 STM32 手册寄存器属性
本文解析了STM32数据手册中常见的寄存器属性缩写,通过实例代码说明理解寄存器属性对编程的重要性。详细列出了12种寄存器访问类型,包括读写(rw)、只读(r)、写0/1清除(rc_w0/rc_w1)、读清除(rc_r)等,并给出每种属性的英文全称、中文含义及操作规则说明。特别解释了rc_w1类型寄存器需要"先读后写"的操作原理,为开发者正确理解和使用STM32寄存器提供了实用参考。
2025-12-25 11:13:02
527
原创 STM32 RTC时钟不准的问题
摘要: 针对STM32 RTC时钟误差问题,提出两种优化方案:1)使用外部32.768K晶振(LSE),通过STM32CubeMX配置LSE选项以提高精度;2)若仍存在误差,可增强LSE驱动能力,选择"High Drive Capability"模式,对应代码为__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_HIGH)。两种方法有效将日误差控制在1秒内。配图展示了CubeMX中的关键配置界面。(98字)
2025-12-25 11:09:23
406
原创 使用STM32对SD卡进行性能测试
针对高速SD卡存储需求,测试了STM32F407和H750开发板的SDIO性能。标准时钟下,H750写速19.28MB/s,F407为7.87MB/s;超频至80/42MHz后分别提升至23.91MB/s和12.69MB/s。使用exFat文件系统时,H750写速18.65MB/s。测试发现单次写入32KB时速率最佳(H750达29.41MB/s),满足5-40Mbps需求。结果表明H750超频后性能显著优于F407,适合高速日志存储场景。
2025-12-22 15:01:50
621
原创 移植littlefs
本文介绍了基于SFUD接口移植LittleFS文件系统到SPI Flash的方法。移植过程主要涉及配置lfs_config结构体,实现底层读写擦除接口,并通过SFUD库统一管理Flash设备。文章提供了完整的移植代码示例,包括初始化、挂载、格式化以及文件读写操作。测试结果显示成功实现了在SPI Flash上创建、写入和读取文件的功能,验证了移植的正确性。该方案不依赖具体MCU型号,具有较好的通用性。
2025-12-10 13:42:42
660
原创 STM32F4操作内部FLASH简洁版
本文介绍了STM32 Flash操作的基本方法。主要包括:1)擦除操作使用HAL_FLASHEx_Erase函数,以扇区为单位进行擦除;2)写入操作使用HAL_FLASH_Program函数,支持字节、半字、字和双字写入;3)读取操作可直接访问Flash地址获取数据。文中提供了完整的代码示例,包括擦除、写入和读取的实现方法,并展示了测试结果。所有Flash操作都需要先解锁,完成后重新上锁。测试结果表明这些方法能有效完成Flash的擦除、写入和读取操作。
2025-07-01 14:51:20
1000
原创 STM32 真随机数RNG使用
本文介绍了如何在STM32中使用硬件随机数生成器(RNG)。首先通过STM32CubeMX启用RNG功能,自动生成初始化代码。然后演示了两种获取随机数的方式:轮询模式和中断模式。轮询方式需要检查返回值,中断方式则通过回调函数获取数据。注意两个随机数之间需要间隔40个PLL48CLK时钟周期。最后展示了实际运行时的随机数输出结果,验证了每次复位都能生成不同的随机数。代码示例清晰展示了RNG的配置和使用方法。
2025-07-01 14:31:38
707
原创 RT-Thread源码阅读(4)——定时器管理
RT-Thread定时器分为硬件定时器和软件定时器两种类型: 硬件定时器在systick中断服务函数中处理超时 软件定时器通过高优先级线程处理超时 通过宏RT_USING_TIMER_SOFT控制是否启用软件定时器 定时器使用: 通过rt_timer_create创建定时器 参数包括名称、回调函数、周期等 通过rt_timer_start启动定时器 定时器管理机制: 使用跳表算法管理定时器链表 定时器按超时时间有序排列 软件定时器会唤醒定时器线程处理超时 定时器启动流程: 设置超时时间 将定时器插入到有序链
2025-05-26 13:52:02
542
原创 RT-Thread源码阅读(3)——内核对象管理
RT-Thread内核对象管理机制解析 RT-Thread通过_object_container数组实现内核对象分类管理,该数组按对象类型(线程、信号量等)组织,每个元素包含类型标识、对象链表和对象大小。关键特性包括: 使用链表结构(rt_list_t)管理同类对象,通过rt_object_allocate动态创建对象并插入链表 对象基础结构rt_object包含名称、类型标志和链表节点,所有内核对象均继承该结构 提供遍历接口如list_find_init,支持通过链表查询对象状态(如list_thread
2025-05-26 13:49:45
694
原创 RT-Thread源码阅读(2)——任务启动与调度
因此针对满堆栈,写入数据的流程为先移动SP指针再填写有效数据;观察后续代码可知,R4-R11在地址小的空间,也会被先出栈,此时返回的栈指针stk指向的就是R4,返回给。是对应着当前栈顶,例如栈空间buff[100],不减的话栈指向buff[100],访问就会溢出。,可以知道怎么调度,至于为什么调度,什么时候调度,请后续了解。当SP指针指向的地址空间没有存放有效数据,则称之为空堆栈。当SP指针指向的地址空间存放有有效数据,则称之为满堆栈。第一眼看这个代码,可能会有一个疑问,调用。线程初始化,相关解释见注释。
2025-05-22 16:30:56
669
原创 RT-Thread源码阅读(1)——基本框架
本文基于RT-Thread V4.1.1和STM32F103(Cortex-M3)平台,使用STM32CubeIDE(GCC)编译环境,旨在解析RT-Thread的基本设计逻辑。文章首先介绍了双向链表的核心操作,包括插入、初始化和判断链表是否为空等。接着,通过链表元素反推内核对象地址的方法,展示了如何从链表节点获取线程对象的结构体首地址。随后,文章详细描述了RT-Thread的启动流程,包括板级初始化、调度器初始化、线程创建和调度器启动等步骤。最后,文章深入探讨了调度器的初始化过程,特别是优先级相关的变量和
2025-05-22 16:28:29
1329
原创 Python正则表达式学习
非贪婪,遇到开始和结束就进行截取,因此截取多次符合的结果,中间没有字符也会被截取。用于在给定的字符串开头进行模式匹配,即可以通过此方法来判断目标的格式是否符合要求。用于在给定的字符串中查找所有匹配的模式,并以列表的形式返回匹配结果。一个"."就是匹配除 \n (换行符)以外的任意一个字符。这里必须使用非贪婪,不然所有返回都是0x0000b30a。以匹配成功的正则表达式进行分割字符串,返回字符串列表。与match不同的是search在整个字符串中匹配。贪婪,匹配从.*前面为开始到后面为结束的所有内容。
2025-01-09 14:09:45
461
原创 STM32中的MCO
在嵌入式系统中,时钟是一个至关重要的部分。STM32微控制器系列提供了一个名为MCO(Microcontroller Clock Output)的功能,它允许用户将微控制器内部的时钟信号输出到外部设备。这对于调试、测试或者与其他设备同步时钟非常有用。在这篇博客中,我们将深入了解STM32中的MCO功能,介绍如何配置MCO以及它的常见应用。
2025-01-09 14:07:52
2706
原创 I.MX6ULL裸机开发之时钟篇
在嵌入式开发中,时钟配置是至关重要的一部分。它影响整个系统的运行速度、定时和能耗等多个方面。作为一位合格的嵌入式开发工程师,总不能连内核、外设、总线各自的频率都不清晰吧?
2024-08-01 09:29:01
1073
原创 哈希表简介
哈希表(Hash Table)是一种非常高效的数据结构,广泛应用于需要快速插入、删除和查找操作的场景中。哈希表是一种将键(Key)映射到值(Value)的数据结构。其核心思想是通过一个哈希函数将键转化为哈希值,然后将该哈希值映射到表中的索引位置。
2024-07-17 11:11:30
564
原创 内联汇编简介
在C语言中嵌入汇编(Assembly)代码,可以使用内联汇编(Inline Assembly),这在一些需要精确控制硬件或者优化性能的场合非常有用以下是关于ASM语法的介绍,主要基于GCC(GNU Compiler Collection)提供的内联汇编特性。
2024-06-03 10:30:12
283
原创 Makefile+OpenOCD开发STM32
下可找到,第一个是调试器的配置文件,第二个是芯片的配置文件,可以合二为一。平台:Windows11(Linux,MAC同理)下载对应平台工具链并添加到环境变量,使用。打印空间信息即编译成功,否则日志中会报错。第三个是上一节编译出的hex文件。是执行完成后退出OpenOCD。是下载成功后复位芯片。
2024-03-15 09:45:16
1493
原创 STM32移植SFUD
SFUD是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SFUD 就是为了解决这些 Flash 的差异现状而设计,让我们的产品能够支持不同品牌及规格的 Flash,提高了涉及到 Flash 功能的软件的可重用性及可扩展性,同时也可以规避 Flash 缺货或停产给产品所带来的风险。
2024-03-15 09:44:20
1784
1
原创 GCC中常用的内建函数
GCC(GNU Compiler Collection)是一个包含多个编程语言的编译器集合,而内建函数通常是为了提高代码性能或者实现一些特定功能而在编译器层面提供的函数。
2024-01-08 16:15:19
1350
原创 MobaXterm自定义关键字高亮(解决绿色不亮问题)
终端中的一些关键字高亮可以提高我们的效率,本文是解决在部分关键字没有高亮的情况下,添加自定义关键字使其高亮
2023-12-28 16:38:30
7383
2
原创 Cortex-M与RISC-V区别
Cortex-M以STM32H750为代表,RISC-V以芯来N305为代表RTOS版本为RT-Thread 4.1.1
2023-11-24 16:34:18
2907
2
原创 STM32驱动QSPI Flash
W25Q64存储容量共64M-bit/ 8M-byte,32768页(pages)、每页256-bytes,最大一次可编程256-bytes一次擦除大小可以为16页(4KB)、128页(32KB)、256页(64KB)或者全擦除W25Q64JV有2048个可擦除扇区(sectors),或者可以说有128个可擦除块(blocks关系 1 Block = 16 sectors;1 sector = 4KB,所以算起来能达到8M-byte编程即写数据,由于Flash的特性,只能从1编程0。
2023-11-24 16:22:25
3053
1
IIC学习之SHT30温湿度传感器(基于STM32)配套资料
2024-01-12
STM32+FreeRTOS 使用SystemView监控系统
2023-07-11
STM32F103-FreeRTOS基础工程,0错误0警告 FreeRTOS V9.0源码
2023-07-11
J-Link驱动V7.60 64位版本
2023-07-04
mqttfx-1.7.1-windows-x64.rar
2020-07-05
求解STM32H750 SPI1作为从机回复错误的问题
2024-08-16
请教OpenSSL中AES_cbc加密的问题
2022-11-11
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅