zoukankan      html  css  js  c++  java
  • keil5的仿真调试

    仿真调试的作用

      1.仿真调试实时跟踪代码的运行,逐步执行代码,程序出现问题并能跟踪到问题所在;
      2.设置调试断掉,使程序运行到指定位置停下;
      3.能够观察全局变量的变化、寄存器的变化;
      4.可以查询某个内存地址的存储的数据;
      5.显示调用栈的内容,也就是函数指针和局部变量;
      6.可以查询片内外设和片外外设的寄存器变化,对照芯片手册的相应寄存器的说明,便可以知道相应外设寄存器的值是否出错。

    调试界面常用按钮


      以上为调试界面常用的按钮

      以上为查看片内外设寄存器的操作,结合芯片手册相应寄存器的说明,便可以明白相应外设寄存器的值是否符合预期。

    编译优化


      以上为将编译器设置为-O2优化的方法,编译器想尽办法去压缩程序存储空间,提高运行速度。一般编译器,优化有多个等级:-O0、-O1、-O2、-O3:
        -O0:默认优化级别,不压缩程序存储空间,不提高程序运行速度,保证程序的可靠执行;
        -O1:轻度优化,轻度压缩程序存储空间,轻度优化程序运行速度;
        -O2:推荐优化等级,在程序存储空间和程序运行速度取得平衡点;
        -O3:最高级别的优化等级,有可能导致程序不能运行,也会使用以空间换时间的方法,导致程序体积增大。
    -O0:

    -O2

      以上为不优化和使用-O2优化编译同一工程所产生的结果,可以看出使用-O2将输出的可执行文件减小了10%,这还是很可观的,所以能优化的时候尽量使用优化。

    volatile关键字

      注意如果使用了-O2优化有些变量的定义就需要volatile关键字修饰,CPU去访问被volatile修饰的变量时会小心翼翼去去实际所在的内存地址中去读取它的值,而不是去读取保存在寄存器中的备份, volatile往往应用在三种场合:
        1.多线程编程共享全局变量的时候,该全局变量要加上volatile进行修饰;
        2.裸机编程的时候,某函数与中断服务函数共享全局变量的时候,该全局变量要加上volatile进行修饰,让编译器不要省略该变量的访问;
        3.CPU访问外设寄存器的时候,寄存器是指向一个地址,需要加上volatile进行修饰,表示让CPU去该地址读取值,而不是使用备份的值。

    总结

      1.调试时如果要查看局部变量的值就不应使用优化,不然不能够在Call Stack窗口中查看但局部变量的值;
      2.watch窗口只能跟踪全局变量的值;
      3.延迟函数的计数值在使用-O2优化时,需要使用volatile修饰,不然会被优化而不能延迟。

  • 相关阅读:
    How to solve the problem "A project with an Output Type of Class Library cannot be started directly "
    Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)
    JavaScript实现startWith、endWith效果函数
    不同格式证书导入keystore方法
    用KeyTool生成安全证书
    怎样让操作系统的虚拟机退出全屏?
    对https的理解
    JDK中keytool常用命令
    百折不回结局凄惨的金庸反角
    主题数据库的特征
  • 原文地址:https://www.cnblogs.com/ding-ding-light/p/14409491.html
Copyright © 2011-2022 走看看