【FreeRTOS】调试技巧篇

目录

一、在视频8-2-2中,读写队列卡死

[1.调试窗口:Call Stack + Locals 介绍](#1.调试窗口:Call Stack + Locals 介绍)

1)简介

2)使用方法

3)注意事项

二、在视频8-3-2中,没有队列集的文件

三、在视频8-3-2中,内存空间不够用


一、在视频8-2-2中,读写队列卡死

原因:在中断中写队列需要调用专门的中断写队列函数,而不能使用普通的写队列函数

发现过程:

  1. 调试
  2. 取消所有断点
  3. 全速运行-点击遥控器-复现卡死bug-停止运行-观察程序指针位置PC-发现程序指针无指向-怀疑跑飞
  4. 观察函数调用栈窗口( Call Stack + Locals ) 发现问题

1.调试窗口:Call Stack + Locals 介绍

1)简介

Call Stack (调用栈) 部分展示了程序执行到当前断点或暂停位置时,函数的调用关系 。它的阅读顺序通常是自下而上(或根据调试器设置)的:

  • 最底层 (或列表开端):通常显示的是最早被调用的函数(比如 main 函数),它是整个调用链的起点。

  • 向上/向后:逐级显示哪个函数调用了下一个函数。

  • 最顶层(或列表末端):则是当前停止位置所在的、最新被调用的函数。

2)使用方法

  1. 启动调试 :在 Keil MDK 中点击 Start/Stop Debug Session 按钮进入调试模式。

  2. 打开窗口 :通过菜单 View > Call Stack Window (或类似名称,如 Watch & Call Stack Window) 可以打开或切换 Call Stack + Locals 窗口的显示。

  3. 运行与中断 :让程序运行 (Run ),并触发断点 或手动暂停(例如使用 Stop Running 命令)。当程序停止时,Call Stack + Locals 窗口就会自动更新。

  4. 单步调试 :使用 Step In (F11)Step Over (F10)Step Out (Ctrl+F11) 等单步命令,观察调用栈和局部变量的变化。Step In 会进入被调用的函数,Step Over 则会将函数调用作为一步执行完毕,Step Out 会快速执行完当前函数并返回到调用它的函数。

  5. 修改变量:在 Locals 窗口点击变量值可以进行修改。

  6. 查看外设 (补充):除了观察变量,在调试状态下点击 Peripherals 菜单下的不同外设选项(如 Timer, UART),可以打开对应外设的观察窗口,查看和修改寄存器设置。勾选 View > Periodic Window Update 可以让你在程序运行时自动周期刷新这些调试窗口的状态。

3)注意事项

  • 程序状态 :Call Stack + Locals 窗口的内容仅在程序停止时(例如遇到断点)才有效和更新

  • 局部变量的局限性 :局部变量通常在程序全速运行时无法实时更新 。若需实时观察 一个变量的变化,通常需要将其改为全局变量静态变量 ,然后将其添加到 Watch 窗口

  • 优化影响:较高的编译器优化级别可能会影响局部变量显示的准确性,因为变量可能被优化到寄存器中或直接被优化掉。

二、在视频8-3-2中,没有队列集的文件

在 CubeMx 中对于 FreeRTOS 的配置也没有队列集的选项

解决方法:

在 FreeRTOS.h 文件第754行#define定义 configUSE_QUEUE_SET 为1,但是当使用 CubeMx 重新生成代码后又会被修改回0

在工程中打开配置文件 FreeRTOSConfig.h ,在自己可添加代码的沙箱段内写入如下代码 #define configUSE_QUEUE_SET 1

三、在视频8-3-2中,内存空间不够用

因为开辟了太多的队列,导致程序运行的空间不够

解决方法:在 CubeMx 中将堆空间配置地更大些

四、在视频8-3-3中,MPU6050任务没有起作用

原因:MPU6050写自己的队列的任务创建的太早了,MPU6050的队列还没有放入队列集,等队列集创建好以后MPU6050的队列已经被写满了,不会向队列集传递自己的句柄了,所以导致MPU6050无法控制挡球板

解决方法:先创建队列集并且将MPU6050的数据队列放入队列集,再将创建MPU6050写自己队列的任务

四、忘记什么地方

while之前的变量编译器会以为只能够执行一次,所以会将其优化掉,如果使用 了全局标志位而且不想被优化,需要使用 volatile 进行修饰

相关推荐
xiangyun611 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun612 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
白远山3 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
DevRay4 小时前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言
free-elcmacom4 小时前
C++学习<1>程序分区
开发语言·c++
醉颜凉4 小时前
Java 必看:如何彻底避免 HashMap 多线程死循环问题?
java·开发语言
默 语4 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
Brilliantwxx4 小时前
【STM32】 I2C_EEPROM_test 工程(实战篇)
开发语言·stm32·单片机·嵌入式硬件·ecmascript
清水白石0084 小时前
Python 异步编程深度解析:Cancellation 到底是异常还是控制信号?从 asyncio 取消机制到企业级事务设计最佳实践
开发语言·python
kolyle5 小时前
万级 QPS 下的 Token 分发系统架构:从 0 到 1 跑通 AI 时代的“水电煤“
开发语言·人工智能·系统架构·token·qps·极智词元·大模型私有化部署