0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在CubeIDE环境下怎么去调试代码呢?

冬至子 来源:聊点嵌入式 作者:聊点嵌入式 2023-11-06 15:14 次阅读

搞软件开发,如果谁能拍胸脯说自己开发的代码不存在bug,一定会被现实打脸的。系统复杂了,代码多了,一定会出问题。就算代码架构设计得多么先进,程序员编程水平多么高,团队协作多么紧密,代码审核多么严谨,运行出问题的几率一定存在,是不过是概率大小,出问题早晚,问题的严重与否而已。

既然代码会出问题,那肯定要解决,最有效的办法就是调试(Debug)了。不管是嵌入式开发,还是应用开发,调试都是程序员必备技能,只不过嵌入式开发的调试又有所不同,除了需要OCDGDB之类的调试软件之外,还需要J-LinkST-Link等调试器,以及片上JTAG模块的支持。

我在读大学的时候学的是51单片机,当时也只有实验室有实验箱。所谓的调试基本就是根据运行现象去分析,比如某种亮灯状态表示某种情况,或者是串口打印信息,屏幕显示信息等,以此来Debug

后来跟课题组做项目,陆续用到AVRPIC单片机,当时基本没有第三方的开发板,只能找官方资源,官方的下载器。官方的调试器极其昂贵,想调试的话也只能跟调试51一样,基本都能解决问题,就是要麻烦一点。

现在的ARM调试器都是白菜价,各个IDE也都具备基本的调试功能,Debug更方便了。Keil下的调试比较直观,在工程选项里配置好调试参数后,点个按钮就进入调试模式,这里就不多介绍。今天来讲一下CubeIDE下怎么去调试代码。

1. CubeIDE的编译选项

Keil不同,基于EclipseCubeIDE下的工程默认有DebugRelease两个编译配置,如下图所示。可以在工程属性下设置不同的编译参数,分别作为调试和发行时使用,当然也可以根据需要增加新的编译配置。Keil下也可以实现类似的功能,不过需要我们自己去配置,这个有很多文档可以参考。

图片

保留不同编译配置的功能在写代码时非常有用,结合条件编译,可以提高调试效率,或者是适应不同的硬件平台,不需要再搞一个新的工程。例如在Debug编译配置下,默认会定义一个DEBUG的符号,在Release编译配置下,则没有定义这个符号。见下图。

图片

我们在编写代码的时候,就可以根据编译配置的不同,结合条件编译,选择编译不同的代码。例如,在正常工作的时候,某个传感器上电后需要经过10分钟才能正常工作,而在调试的时候,完全没必要去等这10分钟。我们可以用下面的伪代码实现这个功能。

#ifndef DEBUG
 delay_second(10*60);    //延时10分钟
 #endif
  1. 调试配置

使用Debug编译选项编译完成后,会在工程目录->Debug下生成elf可执行文件,elf文件包含调试信息,这是我们调试的必要文件。Eclipse调试前需要配置调试参数,配置方式见下图。

图片

需要进行调试的话,点击工具栏小虫子图标就进入调试模式。

在调试模式下可以设置断点,或单步运行,也可以查看寄存器的值,变量值等。另外CubeIDE还提供了很多有用的功能,比如说可以调出“故障分析器”,代码出现异常时可以自动分析错误类型,不需要我们费力的去查看相关寄存器的值来确定错误类型;还可以显示反汇编后的汇编代码,与C代码同步显示。需要注意的是,调试模式下,编译代码应选择不优化,这样设置的断点才都会有效。

调试时所需要查看的信息都可以在下图的菜单里调出来。

图片

3. 小结

进入调试模式后,就可以根据实际情况设置断点,查看寄存器或变量值,也可以根据需要单步运行。大家可以在实践中熟悉调试方法与技巧。

另外,在调试模式下,无论是打断点还是单步运行,都没有办法实时跟踪寄存器或变量值,看到的只是断点处的值,如果想看到实时变化的寄存器或变量值,甚至是某个函数被调用的次数,或者运行占用的CPU时间等,可以通过ARM提供的SWV(Serial Wire Viewer)实时跟踪技术来实现,下次我们再来讲讲这个SWV

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2536

    文章

    48849

    浏览量

    743524
  • 寄存器
    +关注

    关注

    30

    文章

    5183

    浏览量

    118344
  • STM32
    +关注

    关注

    2249

    文章

    10725

    浏览量

    350313
  • 调试器
    +关注

    关注

    1

    文章

    294

    浏览量

    23477
  • ARM单片机
    +关注

    关注

    0

    文章

    44

    浏览量

    9738
收藏 人收藏

    评论

    相关推荐

    请问STM32CubeIDE能否生成MDK代码

    虽然我知道CubeIDE是集成开发环境代码生成、编辑、编译下载调试都OK,但是想问一,能否像STM32CubeMX那样,生成
    发表于 03-13 08:02

    怎样搭建一种Linux的STM32开发环境

    怎样搭建一种Linux的STM32开发环境?有哪些具体步骤
    发表于 10-25 09:18

    Ubuntu环境如何使用stlink调试stm32f4-discovery程序

    Ubuntu环境如何使用stlink调试stm32f4-discovery程序Ubun
    发表于 11-02 07:20

    如何编写STM32CubeMX生成的Keil工程代码

    如何编写STM32CubeMX生成的Keil工程代码?如何实现STM32CubeIDE创建的工程
    发表于 12-02 07:59

    STM32CUBEIDE环境printf()和scanf()为什么会运行失败

    STM32CUBEIDE环境printf()和scanf()为什么会运行失败?其解决方案是什么?
    发表于 12-02 07:01

    如何对STM32CUBEIDE的ADC DMA进行配置

    STM32的ADC DMA该怎样使用?如何对STM32CUBEIDE的ADC DMA进行配置
    发表于 01-25 06:16

    怎样使用STM32CubeIDE软件

    如何对STM32CubeIDE进行配置?怎样使用STM32CubeIDE软件
    发表于 02-28 08:48

    怎样控制基于STM32CubeIDE的智能小车

    基于STM32CubeIDE的智能小车包括哪些功能?怎样控制基于STM32CubeIDE的智能小车
    发表于 03-01 07:39

    请问一怎样使用cubeide生成一些代码

    请问一怎样使用cubeide生成一些代码
    发表于 12-08 09:07

    使用STM32CubeIDE生成代码调试出错我该如何解决

    我正在使用 STM32CubeIDE 生成代码,但是当我开始调试时,出现如下错误:《STMicroelectronics ST-LINK GDB 服务器。版本 5.2.3版权所有 (c) 2019
    发表于 12-19 08:52

    STM32CubeIDE中运行生成的代码为什么无法调试

    亲爱的大家,我正在使用 NUCLEO-L4R5ZI 板,并试图让 octospi 接口四模式运行。生成代码后,我尝试 STM32CubeIDE
    发表于 12-29 07:51

    STM32CubeIDE如何在不调试的情况运行?

    试用新的 STM32CubeIDE。大多数情况,我喜欢它。有一些粗糙的边缘和对话不能正常运行(至少 Mac 上),但我不能做的是向工具栏添加“运行”配置。我只想构建代码并刷新它,而
    发表于 01-31 07:20

    STM32CubeIDE上构建TouchGFX生成的代码,报调试器错误怎么处理?

    STM32F746NGHx_FLASH.ld(来自特定板的 Repository Demo),将文件大小减小到 35KB。但是代码没有目标上工作,调试模式提到的 2) 或 STM
    发表于 02-07 07:11

    基于STM32CubeIDE调试配置

    当我把这个地方取消勾选后,使用前面相同代码做验证调试,此时不再触发异常并返回0值结果。到此,也就解释了发生除以0操作时,为什么STM32CubeIDE会出现与MDK、IAR不同的调试
    的头像 发表于 10-08 10:01 3315次阅读

    STM32Cube CubeIDE添加代码点亮LED

    前一篇已经生成了CubeIDE的工程代码,接下来就要用CubeIDE打开,添加点亮LED灯的代码了。
    的头像 发表于 11-06 14:40 749次阅读
    STM32Cube <b class='flag-5'>CubeIDE</b>添加<b class='flag-5'>代码</b>点亮LED