MCU+RTOS调试

1. 引言

        在做项目时,百分之三十的时间写代码,还有百分之70的时间用于调试。本期将以Keil为例进行调试章节的讲解,目的在于做出一个标准化的调试步骤,方便大家学习如何调试代码。内容分为基础调试、中级调试及进阶调试三部分,本次主要讲解基础调试。

2. 基础调试

2.1 调试设置

        在Keil中,我们通常通过下载调试器进行调试。常见的下载调试器有DAP/Stlink等,本次讲解以Stlink为例。首先,需要点击魔术棒进行设置,点击魔术棒,再点击DeBug--点击红框中的Use,选择Stlink Debugger,同时将其勾选;如下图所示:

        接下来点击Utilities--取消勾选use debug driver,如下图所示:

        选择Stlink Debugger,如下图所示,最后点击确定。

2.2 调试界面讲解

        点击Keil工具栏的 “d”符号进入调试界面(前提是Stlink已经连接板子),如下图所示:

        进入后调试界面如下图所示:

        接下来介绍一下debug工具栏,如下图所示:

复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代 码会重新从头开始执行。

执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的, 而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查 看的地方设置了断点。

停止运行:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止 下来,进入到单步调试状态。

执行进去:该按钮用来实现执行到某个函数里面去的功能,也就是进入函数中去执行每一行语句,这个过程会让你看到。

执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个 函数单步执行。

执行出去:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩 余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位 置。

执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功 能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。

汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。

堆栈局部变量窗口:通过该按钮,显示Call Stack+Locals窗口,显示当前函数的局部变量 及其值,方便查看。

观察窗口:MDK5提供2个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗 口,输入你所想要观察的变量/表达式,即可查看其值,是很常用的一个调试窗口。

内存查看窗口:MDK5提供4个内存查看窗口(下拉选择),该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用 的一个调试窗口 串口打印窗口:MDK5提供4个串口打印窗口(下拉选择),该按钮按下,会弹出一个类似 串口调试助手界面的窗口,用来显示从串口打印出来的内容。

逻辑分析窗口:该图标下面有3个选项(下拉选择),我们一般用第一个,也就是逻辑分析 窗口(Logic Analyzer),点击即可调出该窗口,通过SETUP按钮新建一些IO口,就可以观察这 些IO口的电平变化情况,以多种形式显示出来,比较直观。

系统查看窗口:该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置的是否正确。

2.3 基础调试步骤

        该调试步骤是笔者个人总结的,仅供参考。首先点击调试,进入调试界面后,此时程序会执行到main函数处,这是因为我们勾选了run to main。

        先点击单步调试,点击执行进去或者是点击执行过去,通常点击执行过去可加快调试速度。目的是检查main函数中的各个硬件初始化函数是否正常运行,看有没有卡在哪个初始化函数无法继续往下执行。注意:通常在第一步出现程序卡住的问题大概率是硬件初始化函数的顺序不对,比如说在lcd初始化函数里边调用了串口的printf函数,但是串口初始化函数在lcd初始化函数后边调用,这个时候就会出现程序卡住的情况。

        如果需要快速执行到某个地方,可以添加断点,再点击执行到断点处即可。也可以选择不添加断点,直接点击执行到断点处,此时程序会全速运行,此时你看通过stlink连接的板子显示的现象是否与你预期的一致,如果不一致或者是没现象,代表程序卡住了。此时,点击停止,程序会自动定位到代码卡住的地方,方便快速纠错。

2.4 持续更新中....

ps:如有需要MCU+RTOS项目的同学,请联系1840813505@qq.com,备注CSDN。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/2674.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32F103的FM1702驱动程序

基于STM32F103微控制器与复旦微电子FM1702SL射频读卡芯片的驱动开发方案,整合了硬件配置、寄存器操作和通信协议实现:一、硬件连接设计 1. 管脚映射表FM1702SL引脚STM32F103引脚功能说明VDD3.3V电源输入GNDGND地线SCKPA5(SPI1_SCK)SPI时钟MISOPA6(SPI1_M…

Zabbix 6.0 监控AWS全栈实战|EC2至Lambda的无缝监控

一、云监控架构挑战与突破传统云监控痛点: ❌ 多区域/多账户资源分散难统一 ❌ 无服务器环境监控盲区(Lambda/API Gateway) ❌ 云账单爆炸式增长Zabbix-AWS解决方案:三层监控体系:基础设施层:EC2/EBS/VPC&a…

深入Go并发编程:Channel、Goroutine与Select的协同艺术

在现代软件开发中,并发编程已成为提升程序性能和响应能力的关键。Go语言作为一门为并发而生的现代编程语言,其简洁而强大的并发模型,特别是goroutine和channel,为开发者提供了优雅的并发解决方案。本文将深入探讨Go并发编程的核心…

nvim编辑器

安装lazy.nvim -- 在 ~/.config/nvim/init.lua 中添加以下代码 -- 设置 leader 键(推荐空格) vim.g.mapleader " "-- 加载 lazy.nvim local lazypath vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_…

Android启动时间优化大全

1 修改Android mksh默认的列长度 不修改这个参数,adb shell后,输入超过80个字符,就不能看到完整的命令行。external/mksh/src/sh.h EXTERN mksh_ari_t x_cols E_INIT(80); EXTERN mksh_ari_t x_lins E_INIT(24);2 Kernel优化 2.1 内核驱动模块…

JavaScript核心概念全解析

目录 1. 作用域 (1) 局部作用域 (2) 全局作用域 2. 垃圾回收 (1) 引用计数法 (2) 标记清除法 3. 闭包 (1) 作用 (2) 风险 4. 变量提升 (1) var (2) let 和 const (3) const 5. 函数提升 (1) 函数声明 (2) 函数表达式 6. 函数参数 (1) 动态参数 (2) 剩余参数…

Red靶机攻略

一.环境准备 1.1Red靶机环境准备 1.1.1首先将我们解压好的的jangow-01-1.0.1.ova放入虚拟机里,并配置环境。安装好靶机后打开进行配置,按住shift,在界面按e进去得到图二。 1.1.2按住ctrlx,ip a查看网卡信息,修改网络配置文件 /e…

Linux之shell脚本篇(三)

一、 for循环使用基础语法for var in 数据域(表达式) do 语句1 done 代码案例1.循环3次hello world ,打印循环池内容#!/bin/bash for i in www.jd.com www.qq.com www.4399.com do echo $i hello world.done 2.ping 网段范围内地址(1)打印网段…

9-大语言模型—Transformer 核心:多头注意力的 10 步拆解与可视化理解

目录 1、Transformer编码器堆叠的每层结构 2、输入嵌入 3、位置编码 4、多头注意力层 4.1、步骤1:表示输入 4.1.1、输入 4.1.2、示意图 ​编辑 4.2、步骤2:初始化权重矩阵 4.2.1、初始化Query权重矩阵: 4.2.2、初始化Key权重矩阵…

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现标签条码一维码的检测(C#代码,UI界面版)

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现标签条码一维码的检测(C#代码,UI界面版))工业相机使用YoloV8模型实现标签条码一维码的检测工业相机通过YoloV8模型实现标签条码的检测的技术背景在相机SDK中获取图像转换…

Python编程:初入Python魔法世界

一、常量表达式在编程中,常量指的是在程序执行期间其值不会改变的数据项。虽然 Python 并没有专门的语法来定义常量(不像某些其他语言如 Java 中有 final 关键字),但在实践中,我们通常通过约定俗成的方式来表示一个变量…

使用Python实现单词记忆软件

前言该代码实现了一个基于PyQt5的单词记忆软件,支持高考、四级、六级和考研四个级别的词库。程序提供四种学习模式:拆分模式(将单词拆分为片段重组)、填空模式(选择正确字母填空)、输入模式(手动…