Stduino IDE使用说明

本部分介绍Stduino IDE的基本使用,以及特殊功能。在开始本部分之前,请确保您已下载好最新版本的IDE,并且已经安装完毕。安装说明请参照Stduino 安装教程。

Stduino IDE完全采用GCC进行编译,本软件按“所开发出的原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性,特定目的的适用性和非侵权性的保证。无论是由于软件,使用或其他方式产生的,与之有关或与之有关的合同,侵权或其他形式的任何索赔,损害或其他责任,作者或版权所有者概不负责。目前软件Stduino IDE Windows版已经上线,Linux,Mac正在开发中。

Stduino IDE界面

注:1.10.1版本以上请至下方链接中观看视频教程

http://www.stduino.com/forum.php?mod=viewthread&tid=42

第一次使用Stduino IDE

第一步:选择版型以及下载方式

使用IDE输入代码之前,我们需要配置合适的版型以及选择下载方式。点击左侧“版型选择”按钮(即扳手图标),项目目录的窗口发生了变化,见下图:

在这里我们可以设置相应的配置。如果你使用的思特诺公司开发的Stduino Nano/UNO,并且采用串口下载,那么:

  • 版型选择“Stduino”;
  • 芯片选择“Stduino UNO”或者“Stduino Nano”;
  • 下载方式选择“Serial”。

其他保持默认。

目前IDE已支持以下板型&芯片:

  • Stduino UNO&Nano
  • Nucleo 144 boards
  • Nucleo 64 boards
  • Nucleo 32 boards
  • Discovery boards
  • Eval boards
  • STM32MP1 series coprocessor boards
  • Generic STM32F0 boards
  • Generic STM32F1 boards
  • Generic STM32F3 boards
  • Generic STM32F4 boards
  • Generic STM32H7 boards
  • Generic STM32L0 boards
  • 3D printer boards
  • LoRa boards
  • Electronic Speed Controller boards
  • Generic flight controllers
  • Garatronics boards

以常见的小蓝板为例,其搭载芯片为STM32 F103C8T6,那么

  • 版型下拉框选择“Generic STM32F1 boards”;
  • 芯片下拉框选择“BluePill F103C8”;
  • 下载方式选择合适的方式。

第二步:编写代码

在代码编辑区编写你的代码,这里提供点亮LED的示例作为测试代码。将这段代码复制到代码编辑区。

void setup()
{
    pinMode(13,OUTPUT);//Stduino UNO/Nano的板载LED由D13引脚控制
                    //如果用其他版型测试,请确认接上了LED。
}

void loop()
{
    digitalWrite(13,HIGH);
    delay(500);
    digitalWrite(13,LOW);
    delay(500);
}

注:每个工程请单独在projects下建一个文件夹,有利于工程代码的管理,同时避免直接放置在projects文件夹下出现重复定义setup及loop函数的错误。

第三步:编译下载

  • 在连接好Stduino Nano/UNO的情况下,点击“下载”按钮。

  • 这时会弹出一个保存文件的窗口,选择合适的路径,并命名新文件。例如“test”,文件则会保存为test.ino。

  • 文件编译成功后,下载到单片机中。下载之前,请确认选择了下载端口(点击右上角的检测端口可以自动搜寻)。

  • 每一次更新开发配置,第一次编译下载速度会比较慢,之后速度将会恢复正常。等待片刻后,信息输出区显示下载成功!如果编译失败,请检查你的代码和开发配置是否正确。

其他功能

Stduino IDE还集成了丰富的其他功能,包括:

  1. 调试功能
  2. 第三方库安装
  3. 个性化设置
  4. 串口监视器
  5. 语言切换

1.调试功能

通常用C/C++来开发应用程序,会使用GCC交叉工具编译链来把程序编译成对应平台的二进制文件,才能在开发板的Linux平台上运行。

当代码编译出现了错误,很多时候是由于代码本身编写的错误。但是,当代码逻辑较复杂时,即使代码没有报错,但是可能结果和我们的预设不一致:逻辑错误是很难检查出来的,特别时开发动辄几千,上万行的工程代码因此,这时候就需要知道当前程序运行情况。这时就可以利用Stduino IDE的调试功能了。

Stduino IDE采用GDB工具来帮助我们进行调试。GDB全称是:The GNU Project Debugger,即GNU调试器。官网:http://www.gnu.org/savannah-checkouts/gnu/gdb/index.html

GDB能够做什么?

  • 启动、暂停、停止程序的运行;
  • 调试出现崩溃、有逻辑错误的程序时给程序设置断点;
  • 在程序设置的断点处停止程序运行,查看变量的实际值 、寄存器的值;
  • 除了在断点处可以查看变量之外,还可以在不改变程序源码的情况下改变一些变量的值。

1.1Debugger指南

在使用调试功能前,请在开发配置中,将编译设置设置为“debug(-g)”模式编译一次后进行下一步。

  • 随后,选择左侧的第三个图标,现在窗口就切换为下图所示调试界面。

1.2GDB功能简介

下面介绍GDB的常用功能,帮助我们快速上手。

file                       装入想要调试的可执行文件. 
kill          k            终止正在调试的程序. 
list          l            列出产生执行文件的源代码的一部分. 
next          n            执行一行源代码但不进入函数内部. 
step          s            执行一行源代码而且进入函数内部. 
continue      c            继续执行程序,直至下一中断或者程序结束。
run           r            执行当前被调试的程序.
quit          q            终止 gdb.
watch                      使你能监视一个变量的值而不管它何时被改变. 
catch                      设置捕捉点.
thread        t            查看当前运行程序的线程信息.
break         b            在代码里设置断点, 这将使程序执行到这里时被挂起. 
make                      使你能不退出 gdb 就可以重新产生可执行文件. 
shell                     使你能不离开 gdb 就执行 UNIX shell 命令.  
print         p            打印数据内容。
examine       x            打印内存内容。
backtrace    bt            查看函数调用栈的所有信息。

该部分引用自https://www.cnblogs.com/arnoldlu/p/9633254.html

1)设置断点

可以通过b/break设置断点,断点的设置可以通过函数名、行号、文件名+函数名、文件名+行号以及偏移量、地址等进行设置。
语法:

break 函数名
break 行号
break 文件名:函数名
break 文件名:行号
break +偏移量
break -偏移量
break *地址
  • 查看断点:通过info break查看断点列表
  • 删除断点:通过delet删除指定断点。
    delete <断点id> //删除指定断点
    delete //删除所有断点
    clear
    clear 函数名
    clear 行号
    clear 文件名:行号
    clear 文件名:函数名
  • 依据条件断点
    break 断点 if 条件//比如break sum if value==9,当输入的value为9的时候才会断住。
    condition 断点编号//给指定断点删除触发条件
    condition 断点编号 条件//给指定断点添加触发条件
  • 通过disable/enable临时停用和启用
    disable
    disable 断点编号
    disable display 显示编号
    disable mem 内存区域
    enable
    enable 断点编号
    enable once 断点编号 //该断点只启用一次,程序运行到该断点并暂停后,该断点即被禁用。
    enable delete 断点编号
    enable display 显示编号
    enable mem 内存区域
2)运行

继续执行当前被调试的程序,参数跟在r后面。

3)显示栈帧

如果遇到断点而暂停执行,或者coredump可以显示栈帧。
通过bt可以显示栈帧,bt full可以显示局部变量。
命令格式:

bt
bt full:不仅显示backtrace,还显示局部变量
bt N:显示开头N个栈帧
bt full N
4)显示变量
  • print 变量可以显示变量内容。
  • 如果需要一行监控多个变量,可以通过p {var1, var2, var3}
  • 如果要跟踪自动显示,可以使用display {var1, var2, var3}
5)显示寄存器
  • info reg可以显示寄存器内容。
  • 在寄存器名之前加$可以显示寄存器内容。
    p $寄存器   //显示寄存器内容
    p/x $寄存器 //十六进制显示寄存器内容。
  • 用x命令可以显示内容内容,“x/格式 地址”。
    x $pc //显示程序指针内容
    x/i $pc //显示程序指针汇编。
    x/10i $pc //显示程序指针之后10条指令。
    x/128wx 0xfc207000 //从0xfc20700开始以16进制打印128个word。
  • 通过disassemble指令反汇编
disassemble
disassemble 程序计数器  //反汇编pc所在函数的整个函数。
disassemble addr-0x40,addr+0x40 //反汇编addr前后0x40大小。
6)单步执行

单步执行有两个命令nextstep,两者的区别是next遇到函数不会进入函数内部,step会执行到函数内部。

如果需要逐条汇编指令执行,可以分别使用nextistepi

7)继续执行

调试时,使用continue命令继续执行程序。程序遇到断点后再次暂停执行;如果没有断点,就会一直执行到结束。

continue //继续执行
continue 次数 //继续执行一定次数。
8)监视点

要想找到变量在何处被改变,可以使用watch命令设置监视点watchpoint

watch <表达式> //表达式发生变化时暂停运行
awatch <表达式> //表达式被访问、改变是暂停执行
rwatch <表达式> //表达式被访问时暂停执行

其他变种还包括watch expr [thread thread-id] [mask maskvalue],其中mask需要架构支持。

GDB不能监控一个常量,比如watch 0x600850报错。

但是可以watch *(int *)0x600850

9)改变变量的值

通过set variable <变量>=<表达式>”来修改变量的值。而set $r0=xxx用来设置r0寄存器的值为xxx。

10)生成内核转储文件

通过generate-core-file生成core.xxxx转储文件。
然后在gdb ./main ./core.xxxx查看恢复的现场。

另一命令gcore可以从命令行直接生成内核转储文件。

gcore `pidof 命令` //无需停止正在执行的程序已获得转储文件
11)attach 到进程

如果程序已经运行,或者是调试陷入死循环而无法返回控制台进程,可以使用attach命令。

attach pid

通过ps aux可以查看进程的pid,然后使用bt查看栈帧。
以top为例操作步骤为:

1. ps -aux查看进程pid,为16974.
2. sudo gdb attach 16974,使用gdb 附着到top命令。
3. 使用bt full查看,当前栈帧。此时使用print等查看信息。
4. 还可以通过info proc查看进程信息。
12)反复执行

continue、step、stepi、next、nexti都可以指定重复执行的次数。

ignore 断点编号 次数 //可以忽略指定次数断点。
13)初始化文件

Linux环境下初始化文件为.gdbinit。

如果存在.gdbinit文件,gdb在启动的之前就将其作为命令文件运行。

初始化文件和命令文件执行顺序为:HOME/.gdbinit > 运行命令行选项 > ./.gdbinit > -x指定命令文件

14)设置源码目录

调试过程中如果需要关联到源码,查看更详细的信息。

可以通过directory或者set substitute-path来制定源码目录。

15)TUI调试

TUI(TextUser Interface)为GDB调试的文本用户界面,可以方便地显示源代码、汇编和寄存器文本窗口。

源代码窗口和汇编窗口会高亮显示程序运行位置并以’>’符号标记。有两个特殊标记用于标识断点.

第一个标记用于标识断点类型:

  • B:程序至少有一次运行到了该断点
  • b:程序没有运行到过该断点
  • H:程序至少有一次运行到了该硬件断点
  • h:程序没有运行到过该硬件断点

第二个标记用于标识断点使能与否:

  • +:断点使能Breakpointis enabled.
  • -:断点被禁用Breakpointis disabled.

当调试程序时,源代码窗口、汇编窗口和寄存器窗口的内容会自动更新。

16)Catchpoint

catch可以根据某些类型事件来停止程序执行。

可以通过catch syscall close,捕捉产生系统调用close的时候停止程序执行。

其他的catch事件还包括,throw、syscall、assert、exception等等。

17)自定义脚本

命令行的入参可以通过argc和*argv获取。

注释、赋值、显示

# :为脚本添加注释。

set :为变量赋值,以$开头,以便区分gdb还是调试程序变量。例如:

set $x = 1
  • 显示变量可以通过echo、printf。
自定义命令

利用define命令可以自行定义命令,还可以使用document命令给自定义命令添加说明。

define adder
  if $argc == 2
    print $arg0 + $arg1
  end
  if $argc == 3
    print $arg0 + $arg1 + $arg2
  end
end

document adder
  Sum two or three variables.
end
条件从句

条件命令:if…else…end。这个同其它语言中提供的if命令没什么区别,只是注意结尾的end。

循环语句

循环命令:while...end。gdb同样提供了loop_breakloop_continue命令,分别对应其它语言中的breakcontinue,另外同样注意结尾的end。

set logging on overwrite gdb.log------------将显示log保存到gdb.log中。
set pagination off--------------------------关闭分页显示功能。

tar jtag jtag://localhost:1025--------------连接上JTAG。

d-------------------------------------------删除现有断点。

b func_a------------------------------------在func_a增加断点。
commands------------------------------------断点后,执行如下命令。
  b func_b----------------------------------在func_a断点之后,在func_b增加断点。
    commands
      bt full-------------------------------打印func_b处栈帧。
      c-------------------------------------继续执行。
    end
  b file.c:555------------------------------在file.c的555行增加断点
    commands
      while 1-------------------------------无限执行next命令。
        next
      end
    end
  c-----------------------------------------继续执行,才会触发func_b和file.c:555断点。
end

c-------------------------------------------是程序得到继续执行。

在命令行gdb -x gdb.init bin;或者gdb bin,然后在命令行soruce gdb.init同样可以更新脚本。

18)dump内存到指定文件

在gdb调试中可能需要将一段内存导出到文件中,可以借助dump命令。

命令格式:

dump binary memory FILE START STOP

比如dump binary memory ./dump.bin 0x0 0x008000000,将内存区间从0x0到0x00800000导出到dump.bin中。

2.第三方库安装

Stduino IDE提供了便捷的第三方库安装功能,第三方库涵盖了常用的类型,具体数量与简介参考Stduino 第三方库。这里我们主要介绍第三方库安装的方法。

  • 第一步,从左侧菜单栏中找到“搜索库”图标,打开库安装界面。

  • 第二步,在“Stduino 库安装”界面中,输入你想要查找的库名称。如果不知道需要哪一个库,可以在“Stduino 第三方库”中阅读库简介。这里以单总线通信库OneWire.h为例。

  • 第三步,选择你需要的库,右侧会出现库的简介。我们点击列表中的第二个“OneWire.h”,查看简介:“访问单总线上的温度传感器、存储器以及其他芯片。”确认无误后,在左下角选择合适的库版本(这里我们选择最新版),点击“确认安装”。安装过程由于需要从github上下载数据,因此需要等待片刻。

  • 第四步,检查是否安装成功。安装成功后,刚才安装好的库文件会出现在“libraries”文件夹中。

注:您也可以选择手动安装。先从你想要下载的库简介中获取github的地址,手动下载后,将文件放入D:……\Stduino\main\tool\Documents\libraries中,重新打开Stduino IDE即可。

3.个性化设置

Stduino IDE支持对背景颜色等等进行个性化设置。可以打开上侧菜单栏,点击“文件选项”,随后在下拉菜单栏中选择“页面设置”。

在弹出来的“背景设置”窗口中,选择你想修改的设置即可。

4.串口助手

串口助手能够显示串口传输的内容,同时还能向开发板发送信息。在使用串口助手之前,需要保证单片机正在进行串口通信。或者将下列代码烧录到单片机中,作为测试:

void setup()
{
    Serial.begin(9600);//设置波特率为9600
}
void loop()
{
    Serial.println("Hello,Stduino!");
    delay(1000);//延时1秒
}

之后,打开串口助手。串口助手图标位于IDE界面右侧,点击一下,即打开串口助手。

打开串口助手后,点击“检测串口”,系统会自动匹配串口,随后将波特率设置为代码的波特率(上述代码波特率为9600),随后点击“打开串口”。配置好串口后,我们就可以在串口接受区看到我们接收到的信号了。

如果你发送的内容包含中文,或者接受区的符号出现了乱码,可能是编码格式不匹配。可以在主页面上侧菜单栏中的编码格式中更改编码格式。

5.语言切换

目前仅支持中文和英文。

6.快捷键

查找替换——CTRL+F
代码格式化——ALT+F
代码注释——CTRL+/
页面设置——ALT+P

文档更新时间: 2021-03-05 11:02   作者:Stduino