- 博客(116)
- 资源 (6)
- 收藏
- 关注
原创 FreeRTOS 任务上下文切换核心函数:xPortPendSVHandler详解
其中R0-R3,R12,SP,LR,PC,PSR已经在中断执行的时候由硬件机制入栈了,所以只需要将R4-R11,R14手动入栈就行了,这里之所以要再将R14入栈一次,是因为硬件机制入栈的R14是指LR,已经处于中断中时R14是表示EXCRETURN,代表的意义不一样;这里的所有相关内核寄存器就是指:R0-R12,SP,LR,PC,PSR以及有FPU的则还包括FPU相关寄存器;切换前保存所有相关内核寄存器,切换后恢复所有相关内核寄存器;
2026-01-06 20:18:55
232
原创 GD32定时器的一些进阶用法
本文介绍了GD32定时器的多种高级应用方式:1.外部时钟/脉冲计数方法,通过定时器从机模式实现脉冲统计;2.无CPU介入的信号周期采集方案,利用输入捕获和复位模式自动测量;3.无CPU介入的信号占空比测量,通过双通道捕获实现;4.PWM互补输出配置,包括基础设置和带死区控制的安全方案;5.定时器级联技术,将两个16位定时器组合成32位计数器。文中提供了详细的代码实现,涵盖了定时器初始化、通道配置、触发模式设置等关键环节,适用于编码器信号处理、PWM控制等嵌入式应用场景。
2025-12-22 20:02:31
682
原创 STM32/GD32(CM3/CM4)发生硬件错误(Hardfault)后该怎么查出错原因和位置
本文介绍嵌入式系统Hardfault错误的定位方法:首先通过Debug模式或Hardfault中断获取寄存器信息(包括SCB、NVIC和栈数据),通过EXC_RETURN判断出错环境(任务或中断)。检查栈是否溢出后,分析SP指向的8个字数据获取错误位置和调用关系,结合MAP文件定位具体函数。对于多任务系统,可通过pxCurrentTCB查找当前任务名。最后通过分析NVIC和SCB寄存器确定错误类型,并根据栈内PC和LR值进行栈回溯(需满足地址在FLASH空间、奇数值等条件),重建完整的错误调用链。
2025-11-05 13:42:40
546
原创 cm_backtrace快速移植
文章摘要: 该文档介绍了CM Backtrace(CmB)错误追踪库的配置使用流程。主要内容包括:1)工程文件结构说明,包含故障处理汇编文件和多语言头文件;2)项目添加所需源文件和头文件目录;3)通过cmb_cfg.h文件配置打印接口、平台类型、语言等参数;4)针对FreeRTOS系统需实现三个任务信息获取函数;5)需屏蔽原HardFault_Handler避免重复定义。该库通过接管硬件故障处理程序,可实现错误时的任务信息打印和栈回溯功能,适用于裸机或RTOS环境。
2025-10-31 11:20:22
328
原创 今日Cortex-M3/M4研究总结
摘要:LR(R14)寄存器在函数调用时保存返回地址,中断时保存EXC_RETURN值,指示中断返回后的堆栈选择(MSP/PSP)和模式(Handler/Thread)。中断发生时内核自动压栈保护现场(R0-R3、R12、LR、PC、PSR)。系统复位后流程:Reset_Handler初始化硬件→C库函数__main完成.data段初始化、.bss段清零→通过BXLR/MSR指令切换到Thread模式→最终调用main()函数。整个过程完成了从中断模式到主程序执行环境的转换。
2025-10-28 20:04:01
345
原创 CM3/CM4内核特权级和非特权(用户)级的详细差别
Cortex-M内核通过特权级和非特权级机制实现安全隔离。特权级可访问所有寄存器和指令,配置MPU及系统设置,适合操作系统内核;非特权级受限,仅能运行安全指令集,防止应用程序破坏系统。权限切换通过CONTROL寄存器控制,非特权代码需通过SVC异常请求特权服务。该机制为嵌入式系统提供基础安全防护,实现内核与应用的权限分离,确保系统稳定性。典型应用于操作系统(特权级)和用户程序(非特权级)的权限管理。
2025-10-28 16:05:06
253
原创 生物拥有的最宝贵的东西/AI最难拥有的东西
摘要:生物的情感和感觉是AI最难实现的特性,因为现有编程语言基于逻辑,而情感和感觉是非逻辑的。虽然人类能开发各种传感器来检测物理信号,但无法让机器真正产生主观体验。目前AI缺乏自我意识和需求动机,不会主动反叛人类,其行为完全取决于人类指令。真正的风险来自恶意人类利用AI作恶,而非AI自主行动。机器既不会"想要"充电,也不会"不想"工作,因为它们没有疲劳感等生理体验。这一难题如同宇宙终极问题般深奥。
2025-10-23 13:51:23
312
原创 怎么理解概率波也会发生干涉
摘要: 概率波(波函数)与光波的干涉在数学形式上完全一致,但本质不同。光波是物理量(电场)的振动,干涉是真实物理过程;概率波则是概率幅(复数信息函数)的叠加,反映量子系统的概率规则和关联性。概率波的"波动性"体现在其演化方程、叠加规则及观测结果上,虽然抽象,但产生的干涉条纹是真实可测的。其干涉本质是"可能性"的干涉,而非实体振动。
2025-09-10 18:02:19
538
原创 git将当前分支推送到远端指定分支
本文介绍了Git中推送本地分支到远程仓库指定分支的几种方法:1)推送到同名远程分支(自动创建);2)推送到不同名远程分支;3)强制推送覆盖远程分支(慎用);4)推送并设置默认上游分支。提供了每种场景的详细命令示例,并附总结表格,强调强制推送的风险和设置上游分支的便利性。适用于需要灵活管理分支推送的Git用户。
2025-09-01 17:59:23
1046
原创 SPI接口的4种模式(根据时钟极性和时钟相位)
组合定义,需严格匹配从设备要求。Mode 0和Mode 3最为常见,Mode 1和Mode 2多用于特定器件。配置时务必结合时序图和手册验证!这些模式决定了数据采样和传输的时序关系,是SPI通信中必须正确配置的关键参数。接口根据时钟极性(CPOL)和时钟相位(CPHA)的不同组合,共有。SPI的4种模式通过。
2025-08-01 16:06:41
1119
原创 FreeRTOS 的 configUSE_TIMERS 配置详解
是 FreeRTOS 中用于启用或禁用软件定时器功能的配置选项。当设置为 1 时,FreeRTOS 会创建一个专用的定时器服务任务(Timer Service Task)来管理所有的软件定时器。
2025-07-17 15:13:25
440
原创 FreeRTOS 的 configUSE_CO_ROUTINES (协程) 详解
FreeRTOS 协程(Co-routines)功能解析 configUSE_CO_ROUTINES 是 FreeRTOS 中启用协程的配置选项。协程是一种轻量级任务,适用于资源受限的嵌入式系统(如 RAM < 2KB 的 MCU),具有共享栈、协作式调度的特点。 核心特性 内存高效:所有协程共享一个栈,适合低资源场景。 协作式调度:需通过 crDELAY 主动让出 CPU,不支持阻塞操作。 简单优先级:通过 configMAX_CO_ROUTINE_PRIORITIES 配置有限优先级。 适用场景
2025-07-17 14:53:22
664
原创 电路设计中PCB的地和大地之间的连接处理汇总
电路板接地方式选择需根据安全、抗干扰等需求决定:1)直接连接适用于交流供电设备,提供防触电保护但可能引入干扰;2)浮地设计适合电池设备和高精度电路,避免地环路但需防静电;3)电阻连接可泄放静电同时隔离低频;4)电容连接能滤除高频噪声;5)磁珠可抑制特定频率干扰。实际应用中常采用混合方案,如开关电源使用Y电容接地,医疗设备采用浮地设计。选择时应参考行业标准并通过测试验证。
2025-07-15 14:36:05
2528
原创 GD32/STM32嵌入CMSIS-DSP的库(基于Keil)
CMSIS-DSP库优化了CM4内核的数学运算性能,使用步骤包括:1)添加对应MCU的lib文件(如M4内核选arm_cortexM4lf_math.lib);2)添加头文件路径;3)定义ARM_MATH_CM4宏;4)开启浮点单元支持;5)添加CMSIS-Core支持;6)包含arm_math.h后即可调用优化函数(如arm_sin_f32)。注意编译器版本兼容性,ARMv5和v6需使用对应的CMSIS库版本。该库通过硬件浮点单元和DSP指令显著提升运算速度。
2025-07-14 17:53:32
1100
原创 C语言/Keil的register修饰符
摘要:register关键字是C语言中的存储类说明符,用于建议编译器将变量存储在CPU寄存器而非内存中,以提高访问速度。其特点是:不能取地址,仅针对频繁使用的变量(如循环计数器)。现代编译器优化能力强,通常会自动分配寄存器,手动使用register可能效果有限。在嵌入式系统中,由于寄存器资源有限,过度使用可能适得其反。当前建议仅在性能关键代码中使用,更多依赖编译器自动优化。
2025-07-11 17:44:13
512
原创 C/C++常用的预处理操作符
本文介绍了C/C++预处理器的六个重要功能:1) #操作符将宏参数转为字符串字面量;2) ...和__VA_ARGS__实现可变参数宏;3) #line指令修改编译行号和文件名;4) #pragma传递编译器特定指令;5) #error触发编译错误;6) #undef取消宏定义。这些功能在日志输出、调试信息、代码生成、编译器控制和宏管理等场景中具有重要作用,能够提高代码灵活性和调试效率。
2025-07-03 14:52:14
254
原创 FreeRTOS系统CPU使用率统计
操作系统中CPU使用率是在软件架构设计中必须要考虑的一个重要性能指标。它直接影响到程序的执行时间以及优先级更高的任务能否实时响应的问题。而CPU使用率也不能过低,避免资源浪费。
2025-05-05 14:06:01
1210
2
原创 解决Keil/MDK无法跳转(go to define)问题
使用Keil时候,总会偶尔出现无法跳转定义的情况,本文总结了三种导致这种情况的可能...
2025-04-27 17:57:27
1679
1
原创 记录一次问题的解决流程
最后发现UFSR=2,说明是usageFault的INVSTATE错误导致的,但是迫于能耐即便有了这些信息也还是难分析出是哪行代码出了问题,我就想如果能知道出错前执行的代码那是最好最直接的了,因此结合以前的知识和查阅资料,发现在异常发生时,硬件会自动将R0-R3,R12,LR,PC等的值推入栈里面,其中LR的值就是异常的返回地址,应该就是我要找的出错前执行的代码,因此如果能够在出错时打印出LR的值岂不就能够定位到出错前执行的代码了;3.每次都是进入的usageFault,说明是用法错误导致的。
2024-09-20 10:57:34
1165
原创 GD32相较于STM32的优劣势-完全总结
GD32单片机的主频可以达到108MHz,而STM32的最大主频为72MHz,这意味着GD32在代码执行速度上具有优势,适合需要快速处理数据的场景。
2024-07-23 19:03:31
2598
1
原创 Free-RTOS高阶使用手册
FreeRTOS 是市场领先的面向微控制器和小型微处理器的实时操作系统 (RTOS),与世界领先的芯片公司合作开发,现在每 170 秒下载一次。FreeRTOS 通过 MIT 开源许可免费分发,包括一个内核和一组不断丰富的 IoT 库,适用于所有行业领域。FreeRTOS 的构建突出可靠性和易用性。
2024-05-15 17:31:25
384
原创 记录一个GD32E230的ADC+DMA的重大问题
经过各种研究都没发现问题:正常和不正常情况下ADC和DMA的寄存器值都是一样的,内存也没有越界访问;确认flash读写函数无问题;而且最离谱的是,有的时候开机是正常的,有的时候是异常的,也就说是同一个程序有的时候启动正常,有的时候异常;虽然最后发现了问题,但是也没发现问题,因为还是没搞懂为啥会跟flash读写有关,更没有搞懂为啥同一个程序有时启动就没问题有时就有问题!,即7个通道的数据位置错了,原本1通道的数据到了5通道,5通道的到了3通道!把这一句注释掉了就再也不会出问题了~
2024-04-26 11:37:46
1233
4
原创 C/C++提高代码稳定性/健壮性的一些小细节
对于C/C++编程本来就是要摸透两大块,一个是编译器,另一个是相应处理器的内核和外设的知识和特性,这其中编译器是比较容易被忽视的
2024-03-29 10:07:58
929
原创 git使用记录
将第一个提交记录的动作保持为 "pick" 或 "p"。1.使用 "git reset --hard 版本号"的方式回退版本号会覆盖从当前版本到回退版本之间的版本号,为避免这种情况,可以用"git revert -n 版本号"指令,具体看:https://blog.csdn.net/L1147484597/article/details/128480953。12.git合并两次提交:git rebase -i HEAD~2,HEAD~2表示要合并的提交数量,2表示合并最近两个,要合并最近三个则改为3;
2024-02-20 09:48:24
1267
原创 C/C++与汇编交互总结
并且在C中调用汇编函数时可以传入参数,需要传入哪些参数和参数类型只要在extern时声明下就可;也可以有返回值,存在R0或R0-R1中,但是。如果该C函数有传递参数的,则在调用前把参数赋值到R0-R4即可;若有返回值的,则调用后从R0或者R0-R1(返回值为64位)读取即可;2.汇编当中可以引用C全局变量,也是"IMPORT"一下即可,如上例;引用进来的是该变量的地址,不是变量的值。当有返回值时,汇编函数中在退出前需要将返回值赋值给R0或R0-R1。4.C当中也可以使用汇编的标号,用法还是先。
2024-02-18 18:39:19
881
原创 ARM/CM3/CM4:读写内核寄存器和内核特殊寄存器
可以发现每一个函数都用到了“ldr r0,=core_res_c”这句话,这句话可以非常神奇的将core_res_c全局变量的地址传递给内核寄存器,就相当于建立了一个C和汇编直接数据传输的通道,我们就可以借助这个通道对内核寄存器进行读写了,当然这个通道的存在是借助于编译器的,所以文章第一句话就声明了和编译器的瓜葛。注:以下代码涉及内联汇编,所以跟C编译器有关,有些编译器可能会不支持(每种编译器内联汇编的形式都不一样),本代码在MDK的“defaul compiler version 6”编译器里测试通过。
2024-01-29 15:07:52
908
原创 记录:获取栈顶地址
此时就要结合任务栈的栈底地址和栈大小来判断任务栈有没有溢出了;当然对于很多嵌入式操作系统来说都会提供一个获取任务最高水位线的函数,如对于freertos是:uxTaskGetStackHighWaterMark()。有了栈顶地址再加上栈底地址(__initial_sp)和栈的大小就可以判断出当前栈有没有溢出了。
2024-01-04 10:30:10
1067
原创 链接文件/分散加载文件的作用
上诉代码中UNINIT就是表示该段不需要初始化的意思,在这里面存的数据就不用担心程序异常复位后数据丢失的问题了;只要不是上电复位里面存的数据都会在(上电复位是因为断电了,RAM断电的话数据是必然丢失的)6.新增一个flash或者RAM段(如外挂FLASH或RAM的情况),并指定将某些数据存在该段里面。上面三行代码分别指定了gd32f30x.o文件的堆、RW、ZI、RO的存储位置。那个+First是指首先存储,即存储在开头位置。7.目前知道的就这么多,后续发现更多作用再增加。
2023-12-22 17:28:05
531
原创 MDK(Keil)的MAP文件都记录了啥
MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。
2023-10-08 10:05:53
352
原创 记录一个Cortex-M23的一个重要问题
对于Cortex-M23,它要求按照字访问的内存,其访问地址必须是字(4字节)对齐的,否则就进入Hard_fault
2023-09-22 16:36:01
868
原创 git使用记录
Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 [1]也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
2023-08-02 18:37:28
203
原创 C/C++:将数值作为函数执行、assert、结构体位域
位域:是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
2023-07-27 18:36:34
793
1
原创 关于SVC和PendSV
实时操作系统(Real Time Operating System,简称RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。
2023-07-21 14:10:11
1254
原创 指针、常量指针、指针常量以及const、volatile修饰符
指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。
2023-07-19 18:10:31
1005
原创 今日C/C++二维数组理解简记
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。
2023-07-18 18:27:17
237
原创 VSCode常用快捷键设置
vscode是一种简化且高效的代码编辑器,同时支持诸如调试,任务执行和版本管理之类的开发操作。它的目标是提供一种快速的编码编译调试工具。然后将其余部分留给IDE。vscode集成了所有一款现代编辑器所应该具备的特性,包括语法高亮、可定制的热键绑定、括号匹配、以及代码片段收集等。要快速高效的使用此软件,就得把常用快捷键设置成自己顺手的
2023-07-10 16:46:30
311
keil/MDK 5.4.2版本,当前最新的版本,在官网下载需要提交信息以及下载很慢,所以分享出来
2025-03-25
KEA128+FreeRTOS.zip
2020-06-19
c251v560.exe
2020-09-10
MDK531.EXE
2020-07-31
c166v757.exe
2020-09-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅